gpt4 book ai didi

java - TCP/IP 客户端 : best way to read multiple inputstreams from server

转载 作者:可可西里 更新时间:2023-11-01 02:33:44 24 4
gpt4 key购买 nike

我正在创建一个 java 客户端程序,它向服务器发送命令,服务器发回确认和响应字符串。

The response is sent back in this manner

client -> server : cmd_string

server -> client : ack_msg(06)

server -> client : response_msg

当我尝试读取输入时,我只能通过一个输入流读取确认消息

我的客户端程序能够以某种方式读取消息(hacky 方法)。要读取输入,我必须使用 Bufferedreader 读取确认消息。

  1. 此缓冲阅读器只能读取 ack_msg 而不能读取以下消息
  2. 需要 DataInputstream 代码来读取响应消息。
  3. 如果我跳过第 1 步而只使用 Datainputstream,我将无法读取完整的消息。

客户端.java

try {
Socket clientSocket = new Socket(SERVER_ADDRESS, TCP_SERVER_PORT);// ip,port

System.out.println(" client Socket created .. ");

PrintWriter outToServer = new PrintWriter(clientSocket.getOutputStream(), true);

String ToServer = command;
outToServer.println(ToServer);

in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
//
// while (!in.ready()) {
// }
System.out.println(in.read()); // Read one line and output it


// ===
byte[] messageByte = new byte[1000];//assuming msg size -need to know eact msg size ?
boolean end = false;
String dataString = "";
int bytesRead = 0;

try {
DataInputStream in1 = new DataInputStream(clientSocket.getInputStream());
//
while (!end) {
bytesRead = in1.read(messageByte);
dataString += new String(messageByte, 0, bytesRead);
if (dataString.length() > 0) {
end = true;
}
}
System.out.println("MESSAGE: " + dataString);
} catch (Exception e) {
e.printStackTrace();
}
// ===

in.close();

clientSocket.close();
System.out.print("connection closed");

} catch (Exception e) {
System.out.print("Whoops! It didn't work!\n");
e.printStackTrace();
}

输出

客户端套接字创建..

响应:6

信息:³CO³0³Œ

连接关闭

当我跳过第 1 步时

客户端套接字创建..

留言:-

连接关闭

How can I write code that reads all the input fromserver(acknowledgement msg & response message & it should also checkthe size of data and read accordingly)?

引用How to read all of Inputstream in Server Socket JAVA

谢谢

最佳答案

一旦发送至少 1 个字节,这些语句就会强制关闭流。

dataString += new String(messageByte, 0, bytesRead);
if (dataString.length() > 0) {
end = true;
}

一旦收到 6 的确认,连接就会关闭。如果忽略ack,则响应可能会分多个数据包发送,连接将在收到第一个数据包后关闭。

您必须能够确定 ack 和响应何时结束。

  1. 如果你知道 ack 和 response 中有多少个字符,你可以像你提到的问题一样循环。您将需要一个用于确认的循环和一个用于响应的循环。
  2. 如果你不知道有多少字符,那么你将不得不寻找特殊字符,比如end-of-line 或 end-of-file 知道 ack 行何时结束服务器响应结束。为每条消息的结尾寻找一个特殊字符。
  3. 第三种可能性是等待具体时间。时间到了,继续。这在 TCP 上不可靠,因为数据可能会丢失并重新发送。回复时间可能比您分配的时间要长。 我同意下面的评论。本来,我犹豫要不要在列表中添加 3。此选项很可能用于检测通信 channel 的问题。如果时间到期,则客户端将放弃错误条件,它不会继续处理,就好像一切都很好。

关于java - TCP/IP 客户端 : best way to read multiple inputstreams from server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34840479/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com