我正在尝试实现一个简单的java服务器和客户端 - 客户端发送“嘿”,服务器发回“hello”。我遇到的问题是,即使服务器看到嘿,但客户端永远不会收到你好。 这是服务器代码
try {
InputStream input = clientSocket.getInputStream();
System.out.println("client's request"+ IOUtils.toString(input));
OutputStream output = clientSocket.getOutputStream();
PrintWriter pw = new PrintWriter(output);
pw.write("hello");
pw.flush();
/*BufferedOutputStream bf = new BufferedOutputStream(output);
bf.write("hello".getBytes());*/
/*output.write(("hello").getBytes());*/
long time = System.currentTimeMillis();
System.out.println("Request processed: " + time);
}
catch (IOException e)
{
// report exception somewhere.
e.printStackTrace();
}
客户端程序
Socket s = new Socket("localhost",9000);
OutputStream out = s.getOutputStream();
out.write("hey".getBytes());
/*PrintWriter pw = new PrintWriter(out);
pw.write("hey");
pw.flush(); */
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String line;
while((line =br.readLine())!= null)
{
System.out.println(line);
}
s.close();
我有不同的读写输入/输出变化,但没有运气。建议请。
由于
答案 0 :(得分:2)
这不起作用。 IOUtils.toString(input)
将从输入读取直到流结束,直到对等方关闭连接才会发生这种情况,这根本不会发生,因为他在readLine()
中被阻止尝试读取响应请求您永远被阻止阅读。
使用BufferedReader.readLine()
,但没有客户端中的循环。
答案 1 :(得分:1)
此
about:config
可以通过
阅读void writeLine(BufferedWriter writer, String text) throws IOException {
writer.write(text); // the actual characters we want to send
writer.newLine(); // something that signals the end of the message.
writer.flush(); // and we must enforce that these bytes are sent and not buffered locally.
}
通过套接字发送消息时,必须确保使用某种“协议”来分隔消息。例如,通过在每条消息之后发送换行符。这样,双方都知道连续数据流中的消息在哪里结束。
除了发送正确的类型消息外,您还必须确保实际发送它。例如,String readLine(BufferedReader reader) throws IOException {
// reads characters until it finds either a newline or end of stream
// returns data or null when the stream has already ended
return reader.readLine();
}
具有数据缓冲区,并且在缓冲区足够满之前不会发送数据。在大多数情况下,这意味着消息将保留在缓冲区中,而不是通过网络发送。为此,在您编写完所需内容后,请致电BufferedWriter
。
我有不同的读写输入/输出变化,但没有运气。
在您的情况下,您不会发送换行符,而是通过flush()
等待。客户端实际上应该已经收到了readLine
部分,但是如果没有换行/结束流,它将不会从"hello"
返回(如果此时停止服务器,则会发生这种情况)。这同样适用于您发送到服务器的消息,但我猜您此时会杀死客户端,因此会看到消息。
这也是我在玩这个
时所做的代码readLine