【发布时间】:2016-04-22 18:47:31
【问题描述】:
我正在创建一个 java 客户端程序,它向服务器发送命令,服务器发回确认和响应字符串。
以这种方式发回响应
客户端 -> 服务器:cmd_string
服务器 -> 客户端:ack_msg(06)
服务器 -> 客户端:response_msg
当我尝试读取输入时,我只能通过一个输入流读取确认消息
我的客户端程序能够以某种方式读取消息(hacky 方法)。要读取输入,我必须使用 Bufferedreader 读取 ack msg。
- 此缓冲读取器只能读取 ack_msg 而不能读取以下 msg
- 需要DataInputstream代码来读取响应消息。
- 如果我跳过第 1 步而只使用 Datainputstream,我将无法读取完整的消息。
Client.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();
}
输出
已创建客户端 Socket ..
回复:6
消息:³CO³0³Œ
连接关闭
当我跳过第 1 步时
已创建客户端 Socket ..
消息:-
连接关闭
如何编写读取所有输入的代码 服务器(确认消息和响应消息,它还应该检查 数据的大小并相应地读取)?
参考How to read all of Inputstream in Server Socket JAVA
谢谢
【问题讨论】: