Я пытаюсь создать сервер сокетов, который использует сокеты 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. Заранее спасибо