问题描述
我正在尝试使用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 (将#修改为@)