DatagramChannel бесконечно долго ждет пакетов - PullRequest
0 голосов
/ 27 марта 2019

Я пишу простой UDP клиент-сервер. Я должен использовать DatagramChannel на стороне клиента и DatagramPacket на стороне сервера. Так что UDP не похож на TCP, мне пришлось проверять сообщения с сервера. Но когда я не получаю пакеты, канал ждет бесконечно, что я должен использовать? А как получать пакеты из DatagramChannel по DatagramSocket, я пробовал, но ничего не произошло.

Clien сторона

channel = DatagramChannel.open();
       // channel.socket().setSoTimeout(timeout);
        address = new InetSocketAddress("localhost", 2000);
        //channel.configureBlocking(false);
        channel.connect(address);
public ServerMessage doRequest(String command, Alice argument)throws IOException, ClassNotFoundException{
        try {
            ClientMessage message = new ClientMessage(command, argument);
            sendedstreambuffer = new ByteArrayOutputStream();
            sendedstream = new ObjectOutputStream(sendedstreambuffer);
            sendedstream.writeObject(message);
            sendedstream.flush();
            ByteBuffer buffer = ByteBuffer.wrap(sendedstreambuffer.toByteArray());
            buffer.flip();
            channel.send(buffer, address);
            buffer.clear();
            channel.receive(buffer);
            receivedsteam = new ObjectInputStream(new ByteArrayInputStream(buffer.array()));
            return (ServerMessage) receivedsteam.readObject();
        }catch (PortUnreachableException e){
            return new ServerMessage(SpecialMessage.TIMEOUT, "===\nСервер не доступен.");
        }
    }

на стороне сервера

DatagramSocket data = new DatagramSocket(2000);
while (true) {
                DatagramPacket packet = new DatagramPacket(buf, buf.length);
                data.receive(packet);
                receivedsteam = new ObjectInputStream(new ByteArrayInputStream(packet.getData()));
                ClientMessage message = (ClientMessage) receivedsteam.readObject();
                System.out.println(message.getMessage());
            }

...