我有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();
}
}
我的输出如下:
循环
和
已发送数据 收到的数据 再次发送数据
答案 0 :(得分:1)
为了让程序执行重复操作,通常会使用某种循环,包括for循环,while循环和do-while循环。对于这样的事情,你不知道你需要提前多少次通信,那么你需要使用while循环,而不是for循环。
话虽如此,你的连接代码中没有任何while循环...所以如果没有允许继续通信的代码,你的程序就会停止,就像你已经编程完成它一样。
解决方案:解决此问题。放入需要继续通信的while循环。
答案 1 :(得分:1)
您正在循环accept()
调用,接受新连接,但您的实际I / O代码每个连接只读取一条消息。您需要围绕readUTF()
调用的内部循环,处理整个连接,直到抛出EOFException
为止。通常,连接的所有I / O都在一个单独的线程中处理。