1

我正在尝试使用线程运行方法从套接字读取数据:

@Override
public void run() {
    while(true){
        try{
            String o = "";
            socketServer = new ServerSocket(port);
            System.out.println("Waiting for connection on port "+port+".");
            Socket socket = new Socket();
            socket = socketServer.accept();
            System.out.println("Connection got.");
            BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            int c;
            while(( c = input.read()) != -1)
                o += (char)c;
            PrintWriter output = new PrintWriter(socket.getOutputStream());
            output.println("ok");
            output.flush();
            output.close();
            input.close();
            socket.close();
            socketServer.close();
            textFieldMessage.setText("Сообщение от "+socket.getInetAddress().getCanonicalHostName()+":\n"+o);
        }catch(Exception e){
            e.printStackTrace();
            System.exit(-1);
        }

    }
}

但是它卡在了while循环上。调试器告诉最后没有 -1 值。这里有什么问题?

4

3 回答 3

1

因为您正在从 Socket 读取数据,所以除非套接字或流已关闭,否则您永远不会到达流的末尾。所以while循环将阻塞,input.read()因为在客户端关闭流/套接字之前它不会返回-1。

不太确定您从套接字读取的是什么,但您可以尝试使用 BufferedReader 的readLine()方法。您可以提前知道需要阅读多少行,或者以空行结束阅读(如 HTTP)。

于 2012-08-20T09:52:47.593 回答
1

InputStream 的 read() 方法阻塞,直到数据可用。

只有在检测到流结束时它才能返回-1。(虽然它不应该是套接字的情况)所以如果数据不可用,while循环将阻塞,即您的读取调用将等待数据被读取.

笔记 :

但如果值为 -1,则您的程序应该已经退出。那你在读什么?

于 2012-08-20T09:54:53.537 回答
1

对等方没有关闭套接字,因此您永远不会得到-1,因此您在read()收到最后一个字符后阻塞了调用。你的策略有缺陷。您正在阅读 EOS,然后期望能够写回复。除非对等端关闭他的套接字以进行输出然后读取,否则这永远不会起作用。您需要正确定义您的应用程序协议。目前,您期望对等方执行写入/关闭/读取。没有意义。

于 2012-08-20T10:07:59.713 回答