0

尝试从套接字读取 InputStream 时遇到阻塞问题。
这是服务器端的代码:

public static void main(String[] args) throws Exception {
    if (args.length != 1) {
        throw new IllegalArgumentException("Parameter : <Port>");
    }

    int port = Integer.parseInt(args[0]); // Receiving port

    ServerSocket servSock = new ServerSocket(port);
    String s;
    Socket clntSock = servSock.accept();
    System.out.println("Handling client at "
            + clntSock.getRemoteSocketAddress());
    in = new BufferedReader(
            new InputStreamReader(clntSock.getInputStream()));
    out = new PrintWriter(clntSock.getOutputStream(), true);

    while (true) {
        s = in.readLine();
        System.out.println("s : " + s);
        if (s != null && s.length() > 0) {
            out.print(s);
            out.flush();
        }
    }
}


这是我发送和接收数据(字符串)的客户端部分:

while (true) {
    try {
        // Send data
        if (chatText.getToSend().length() != 0) {
            System.out.println("to send :"
                    + chatText.getToSend().toString());
            out.print(chatText.getToSend());
            out.flush();
            chatText.getToSend().setLength(0);
        }

        // Receive data
        if (in.ready()) {
            System.out.println("ready");
            s = in.readLine();
            System.out.println("s : " + s);
            if ((s != null) && (s.length() != 0)) {
                chatText.appendToChatBox("INCOMIN: " + s + "\n");
            }
        }

    } catch (IOException e) {
        cleanUp();
    }
}


readLine 方法正在阻塞运行上述代码的客户端线程。我怎样才能避免这个问题?感谢您的帮助。

4

2 回答 2

0

readLine 方法正在阻塞运行上述代码的客户端线程。我怎样才能避免这个问题?

readLine 是一个阻塞操作。如果您使用多个线程,这不一定是问题。

于 2012-08-29T11:32:42.463 回答
0

readLine()在期望以 EOL 令牌结尾的行的客户端上使用,但您的服务器端代码未编写 EOL 令牌。使用println()而不是print().

为了支持并发客户端,您需要在服务器上分离线程来处理接受的连接:

while (true) {
    // Accept a connection
    Socket socket = servSock.accept();

    // Spin off a thread to deal with the client connection
    new SocketHandler(socket).start();
}
于 2012-08-29T11:37:19.960 回答