从服务器

时间:2015-11-27 00:54:32

标签: java sockets

我正在尝试实现一个简单的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();

我有不同的读写输入/输出变化,但没有运气。建议请。

由于

2 个答案:

答案 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
相关问题