套接字编程代码不能永远运行

时间:2014-09-08 00:42:29

标签: java

我有2个节点应该始终相互通信,但他们似乎不会谈论超过1次交互。成功发送和接收1条消息后,它们就会停止。 我的代码看起来像这样: 发起人:

try {
   Socket client = new Socket(ip, port);
   OutputStream toNode = client.getOutputStream();
   DataOutputStream out = new DataOutputStream(toNode);
   out.writeUTF("Start:Message");
   System.out.println("Sent data");
   InputStream fromNode = client.getInputStream();
   DataInputStream in = new DataInputStream(fromNode);
   if(in.readUTF().equals("Return Message")) {
      System.out.println("Received data");
      out.writeUTF("Main:Message");
      System.out.println("Sent data again");
   }

   else
      System.out.println("Error");
   client.close();
} catch (UnknownHostException e) {
   e.printStackTrace();
} catch (IOException e) {
   e.printStackTrace();
}   

响应者:

while(true) {
   Socket server;
   try {
      server = s.accept();
      DataInputStream in = new DataInputStream(server.getInputStream());
      String msg = in.readUTF();
      String[] broken_msg = msg.split(":");
      if(broken_msg.length > 0)
         System.out.println("Looping");
      String ret;
      if (broken[0].equalsIgnoreCase("Start")) {
         ret = "Return Message";
         DataOutputStream out = new DataOutputStream(server.getOutputStream());
         out.writeUTF(ret);
      }

      else if (broken[0].equalsIgnoreCase("Main")) {
         //Do Useful work     
      }
   } catch (IOException e) {
      e.printStackTrace();
   }
}

我的输出如下:

  

循环

  

已发送数据   收到的数据   再次发送数据

2 个答案:

答案 0 :(得分:1)

为了让程序执行重复操作,通常会使用某种循环,包括for循环,while循环和do-while循环。对于这样的事情,你不知道你需要提前多少次通信,那么你需要使用while循环,而不是for循环。

话虽如此,你的连接代码中没有任何while循环...所以如果没有允许继续通信的代码,你的程序就会停止,就像你已经编程完成它一样。

解决方案:解决此问题。放入需要继续通信的while循环。

答案 1 :(得分:1)

您正在循环accept()调用,接受新连接,但您的实际I / O代码每个连接只读取一条消息。您需要围绕readUTF()调用的内部循环,处理整个连接,直到抛出EOFException为止。通常,连接的所有I / O都在一个单独的线程中处理。