我正在创建一个java Client程序,它向服务器发送命令,服务器发回一个确认和一个响应字符串。
以这种方式发送回复
客户 - > server:cmd_string
服务器 - >客户:ack_msg(06)
服务器 - >客户:response_msg
当我尝试读取输入时,我只能读取只读取带有一个输入流的确认消息
我的客户端程序能够以某种方式读取消息(hacky方法)。要读取输入,我必须使用Bufferedreader读取ack消息。
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();
}
输出
客户端套接字创建..
响应:6
消息:³CO³0³Œ
连接关闭
当我跳过第1步
时客户端套接字创建..
消息: -
连接关闭
如何编写读取所有输入的代码 服务器(确认消息和响应消息&它也应该检查 数据的大小和相应的读取)?
提到How to read all of Inputstream in Server Socket JAVA
由于
答案 0 :(得分:2)
一旦发送至少1个字节,这些语句就会强制关闭流。
dataString += new String(messageByte, 0, bytesRead);
if (dataString.length() > 0) {
end = true;
}
一旦收到6的ack,连接就会关闭。如果忽略ack,则响应可能以多个数据包发送,连接将在收到第一个数据包后关闭。
您必须能够确定ack和响应何时结束。
答案 1 :(得分:2)
您不能在同一底层套接字上同时使用BufferedReader和DataInputStream。您将丢失BufferedReader中的数据。对于所有内容和套接字的使用寿命,请使用相同的流或阅读器。 Ditto编写器和输出流。
答案 2 :(得分:0)
InputStream input = null;
OutputStream output = null;
Socket cs = new Socket("LocalHost", 6789);
input = cs.getInputStream();
output = cs.getOutputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(output));
bw.write("Send your String");
bw.flush();
int bytesRead = 0;
byte[] messageByte = new byte[1000];
String dataString = "";
bytesRead = input.read(messageByte);
dataString = new String(messageByte, 0, bytesRead);