TCP + UDP сервер по локальному wifi. Перестает работать и помог только сброс wifi - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь создать сервер сокетов, который использует сокеты TCP и UDP. Я запустил сервер на своем ноутбуке и подключился к нему с моего телефона android через мой локальный Wi-Fi. Я запускаю сервер вот так

Основная точка входа:

static public void main(String[] args) {
        WorldHolder worldHolder = new WorldHolder();
        worldHolder.init();
        try {
            TcpServer tcpServer = new TcpServer(new InetSocketAddress( 11124), worldHolder);
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }

        UdpServer svr = new UdpServer(worldHolder);
        svr.startServer();


    }

TCP-сервер:

public TcpServer(InetSocketAddress listenAddress, WorldHolder worldHolder) throws Throwable {
        serverChannel = ServerSocketChannel.open();
        serverChannel.configureBlocking(false);
        this.worldHolder = worldHolder;
        serverKey = serverChannel.register(selector = Selector.open(), SelectionKey.OP_ACCEPT);
        serverChannel.bind(listenAddress);

        Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(() -> {
            try {
                loop();
            } catch (Throwable t) {
                t.printStackTrace();
            }
        }, 0, 500, TimeUnit.MILLISECONDS);
    }

Затем в l oop () я делаю неблокирующую выберите и обработайте все в одном потоке.

UDP-сервер:

 public void startServer() {
        try {
            DatagramSocket serverSocket = new DatagramSocket(9123);
            while (true){
                byte[] arr = byteArrayPool.take();
                DatagramPacket datagramPacket = new DatagramPacket(arr, ByteArrayPool.BYTE_BUF_SIZE);
                serverSocket.receive(datagramPacket);
                threadPool.execute(new WorkerRunnable(datagramPacket, worldHolder, serverSocket));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Здесь threadPool имеет значение java ExecutorService с 10 фиксированными потоками, а WorkerRunnable просто просматривает полученные данные, отправляет пакет обратно и затем выходы. Я использую несколько потоков, так как ожидаю, что нагрузка UDP будет намного больше, чем TCP.

Теперь проблема в том, что если я запускаю и останавливаю / запускаю сервер несколько раз для целей отладки и повторного развертывания, он запускается работает очень плохо, в конце концов вообще не принимает пакеты aby. Затем, если я отключил свой ноутбук от Wi-Fi и снова подключился, он работал без проблем. Все UDP-пакеты прошли. Но потом, если я остановлю сервер и снова запустлю его, только 50% UDP-пакетов пройдут. Если я делаю это несколько раз, то ничто не проходит вообще, и все UDP-пакеты просто теряют время ожидания. И TCP не может даже установить соединение и терпит неудачу с исключением ConnectioRefused. Теперь он вообще не будет работать, даже если я 5 раз подключился к Wi-Fi.

О чем это все? Я полностью новичок ie в программировании сокетов, но я думаю, что я как-то затопил маршрутизатор Wi-Fi или каким-то образом заставил мою ОС (ubuntu 18) больше не принимать ничего от устройства android. Заранее спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...