【问题标题】:SocketServer and Socket Communication, Answer Not receivedSocketServer与Socket通信,未收到Answer
【发布时间】:2012-10-01 22:41:14
【问题描述】:

我做了一个java ServerSocket。我使用 Socket 对象向它发送请求。请求被传递到 ServerSocket 但没有返回响应。

服务器代码:

                Socket startserver = this.wifiserver.accept();

                in = new InputStreamReader(startserver.getInputStream());
                BufferedReader read = new BufferedReader(in);
                String request = read.readLine();
                //System.out.println(request);

                if(request.equals("SNDKEY")){
                    System.out.println("Command is: SNDKEY");
                    out = new PrintWriter(startserver.getOutputStream());
                    out.print("12345678901234567890");
                    out.close();

                }

客户代码:

        Socket connection = new Socket( ip, port );
        writeServer = new PrintWriter(connection.getOutputStream());
        inputStream = new InputStreamReader(connection.getInputStream());
        bufferStream = new BufferedReader(inputStream);
        writeServer.print("SNDKEY");


        this.Key = bufferStream.readLine();

问题是程序卡在命令 bufferStream.readLine() 上。我通过输出以下行命令检查了请求是否到达服务器: SNDKEY 并且它总是被打印出来。但是用户端永远不会收到密钥。

【问题讨论】:

  • 尝试在您的客户端代码中打印一个换行符或调用flush() 刷新输出流,以便服务器可以看到一些数据。
  • 你能把out.print(...)改成out.println(...)吗?
  • @Vikdor 你能解释一下吗?服务器可以看到一些数据是什么意思?
  • @TomaszNurkiewicz 还是同样的问题。 bufferStream.readLine() 会阻塞程序。
  • 在遇到换行符或缓冲区容量已满或显式调用 flush() 之前,客户端写入的缓冲区不会被刷新。在没有从客户端刷新内容之前,服务器不会在其缓冲读取器中看到该数据。

标签: java sockets


【解决方案1】:

bufferStream.readLine() 阻塞直到收到换行符。但是在服务器端,您使用PrintWriter.print() 输出,除非您告诉它,否则它不会发送任何换行符。所以客户端永远等待。将打印更改为 println,或在消息末尾添加换行符:

out.print("12345678901234567890\n"); 

当您不想在协议中使用换行符时,您也可以使用bufferStream.read 而不是bufferStream.readLine 在读取每个字节或读取特定数量的字节后返回。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 2013-09-09
    • 1970-01-01
    相关资源
    最近更新 更多