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

epfja78i  于 2021-07-08  发布在  Java
关注(0)|答案(0)|浏览(290)

我试图用java实现一个套接字的侦听器 DataSocket ,所以我创建了一个新的listener类 ExecutorService 在自己的线索上运行。在同一个类中,我想创建另一个方法,该方法也将通过同一个套接字将消息发送到同一个地址(因为该服务器也在等待我的答案)。
由于某种原因,套接字一直处于关闭状态,我得到了一个异常。
我用w while 循环等待消息,当我得到响应时,我使用回调发送一个答案。
这是实现:这是侦听器类:

  1. public class MessageListener implements IMessageTransport {
  2. private final static int TIMEOUT_MILLIS = 300;
  3. private final int port = 12000;
  4. private InetAddress address;
  5. private DatagramSocket socket;
  6. private Executor executor;
  7. public MessageListener(String address, Executor executor) {
  8. this.executor = executor;
  9. try {
  10. this.address = InetAddress.getByName(address);
  11. socket = new DatagramSocket(null);
  12. SocketAddress sockaddr = new InetSocketAddress(this.address, port);
  13. socket.bind(sockaddr);
  14. socket.setSoTimeout(TIMEOUT_MILLIS);
  15. } catch (SocketException | UnknownHostException e) {
  16. e.printStackTrace(); // todo - handle exception
  17. }
  18. }
  19. public void start(final MessageTransportCallback callback) {
  20. executor.execute(new Runnable() {
  21. @Override
  22. public void run() {
  23. System.out.println("heresa");
  24. listen(callback);
  25. }
  26. });
  27. }
  28. public void send(byte[] message) {
  29. executor.execute(new Runnable() {
  30. @Override
  31. public void run() {
  32. System.out.println("heresa");
  33. sendMessage(message);
  34. }
  35. });
  36. }
  37. private void sendMessage(byte[] message) {
  38. System.out.println("Sending message: " + bytesToHex(message));
  39. try {
  40. DatagramPacket request = new DatagramPacket(message, message.length, this.address, this.port);
  41. socket.send(request);
  42. } catch (SocketTimeoutException e1) {
  43. System.out.println("timeout");
  44. } catch (IOException e) {
  45. e.printStackTrace(); // todo - handle exception
  46. }
  47. }
  48. private void listen(final MessageTransportCallback callback) {
  49. DatagramPacket reply;
  50. System.out.println("here");
  51. while (true) {
  52. try {
  53. byte[] data = new byte[2048];
  54. reply = new DatagramPacket(data, data.length);
  55. socket.receive(reply);
  56. if (reply.getLength() != 0) {
  57. System.out.println("Read bytes: " + bytesToHex(reply.getData()));
  58. callback.onComplete(Arrays.copyOfRange(reply.getData(), 0, reply.getLength()));
  59. }
  60. } catch (SocketTimeoutException e1) {
  61. // System.out.println("timeout?");
  62. } catch (IOException e) {
  63. e.printStackTrace(); // todo - handle exception
  64. }
  65. }
  66. }
  67. }

这就是我发送信息和启动侦听器的方式:

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

虽然我得到一个绑定套接字错误:

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

但奇怪的是,如果我像这样向套接字发送消息,它就会工作:

  1. DatagramPacket request = new DatagramPacket(message, message.length, this.address, this.port);
  2. socket.send(request);

这意味着套接字不会以这种方式返回绑定错误,但是,我不能像这样侦听套接字,我只能在发送消息之后才收到消息。。。
以及我为什么得到 bind 错误?如何创建一个具有侦听新消息的线程和发送消息的线程的套接字?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题