java-尝试读取/发送时套接字被关闭

问题描述

我正在尝试使用Java DataSocket实现套接字的侦听器,因此我创建了一个新的侦听器类,该类获取一个ExecutorService并在自己的线程上运行。 在同一个类中,我想创建另一个方法,该方法也将通过相同的套接字将消息发送到相同的地址(因为服务器也等待我的回答)。

由于某种原因,套接字一直关闭,我遇到了异常。

我使用w while循环来等待消息,当我收到响应时,我使用回调函数来发送答案。

这是实现: 这是侦听器类:

public class MessageListener implements IMessageTransport {

    private final static int TIMEOUT_MILLIS = 300;
    private final int port = 12000;
    private InetAddress address;

    private DatagramSocket socket;

    private Executor executor;

    public MessageListener(String address,Executor executor) {
        this.executor = executor;

        try {
            this.address = InetAddress.getByName(address);
            socket = new DatagramSocket(null);
            SocketAddress sockaddr = new InetSocketAddress(this.address,port);
            socket.bind(sockaddr);
            socket.setSoTimeout(TIMEOUT_MILLIS);
        } catch (SocketException | UnkNownHostException e) {
            e.printstacktrace(); // todo - handle exception
        }
    }

    public void start(final MessageTransportCallback callback) {
        executor.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println("heresa");
                listen(callback);
            }
        });
    }

    public void send(byte[] message) {
        executor.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println("heresa");
                sendMessage(message);
            }
        });
    }

    private void sendMessage(byte[] message) {
        System.out.println("Sending message: " + bytesToHex(message));
        try {
            DatagramPacket request = new DatagramPacket(message,message.length,this.address,this.port);
            socket.send(request);
        } catch (SocketTimeoutException e1) {
            System.out.println("timeout");
        } catch (IOException e) {
            e.printstacktrace(); // todo - handle exception
        }
    }

    private void listen(final MessageTransportCallback callback) {
        DatagramPacket reply;
        System.out.println("here");

        while (true) {
            try {
                byte[] data = new byte[2048];
                reply = new DatagramPacket(data,data.length);
                socket.receive(reply);
                if (reply.getLength() != 0) {
                    System.out.println("Read bytes: " + bytesToHex(reply.getData()));
                    callback.onComplete(Arrays.copyOfRange(reply.getData(),reply.getLength()));
                }
            } catch (SocketTimeoutException e1) {
//                System.out.println("timeout?");
            } catch (IOException e) {
                e.printstacktrace(); // todo - handle exception
            }
        }
    }
}

这是我发送消息并启动侦听器的方式:

final ExecutorService executorService = Executors.newFixedThreadPool(5);
MessageListener messageListener = new MessageListener(address,executorService);
messageListener.start(new MessageTransportCallback() {
    @Override
    public void onComplete(byte[] response) {
        System.out.println(response);
    }
});
messageListener.send(bytemessage);

尽管出现绑定套接错误

java.net.BindException: Cannot assign requested address: Cannot bind
    at java.base/java.net.DualStackPlainDatagramSocketImpl.socketBind(Native Method)
    at java.base/java.net.DualStackPlainDatagramSocketImpl.bind0(DualStackPlainDatagramSocketImpl.java:84)
    at java.base/java.net.AbstractPlainDatagramSocketImpl.bind(AbstractPlainDatagramSocketImpl.java:117)
    at java.base/java.net.DatagramSocket.bind(DatagramSocket.java:395)
    at main.MessageListener.<init>(MessageListener.java:33)
    at main.Main.main(Main.java:194)

但是奇怪的是,如果我像这样将消息发送到套接字,它将起作用:

DatagramPacket request = new DatagramPacket(message,this.port);
socket.send(request);

这意味着套接字不会以这种方式重新调谐绑定错误,但是,我无法像这样监听套接字,并且只有在发送消息后才得到消息...

以及为什么出现bind错误的想法?如何使用侦听新消息的线程和发送消息的线程创建套接字?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)