从Socket读取到String

时间:2014-07-26 19:06:08

标签: java sockets bufferedreader

我试图从Socket的InputStream读取一个String变量,然后打印它。但是,不知何故,这不能正常工作。仅在客户端断开连接时才会将receivedText打印到控制台。我的代码出了什么问题?

public xClient(Socket socket)
{
    Thread receiver = new Thread(){
        public void run()
        {
            String receivedText = "";
            while(socket.isConnected())
            {
                try {
                    BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    String line;
                    while((line = input.readLine()) != null)
                    {
                        receivedText += line;
                    }
                    if(!receivedText.equals(""))
                    {
                        System.out.println(receivedText);
                        receivedText = "";
                    }
                    Thread.sleep(10);
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    };
    receiver.start();
}

主要方法:

    ServerSocket socket = new ServerSocket();
    socket.bind(new InetSocketAddress("127.0.0.1",9200));

    Thread accepting = new Thread(){
        public void run()
        {
            while(true)
            {
                try {
                    Socket received = socket.accept();
                    new xClient(received);
                    System.out.println("OK");
                    Thread.sleep(10);
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    };
    accepting.start();

2 个答案:

答案 0 :(得分:1)

在以下代码中..

 while((line = input.readLine()) != null)
 {
        receivedText += line;
 }

readLine()函数等待,直到它获得输入行或指示其结束流。您在循环中检查它是否为null。只有当它结束流时或者在客户端断开连接的情况下,它才会回复null。在断开连接(或执行其他操作)之前,客户端应回复/写入通知文件结尾的最后一条消息。

答案 1 :(得分:0)

readLine()方法仅在对等方断开连接时返回null。如果要打印每一行,请在读取循环内执行此操作。

还有其他问题:

  • 'while socket.isConnected()'测试毫无意义。它已连接,并将保持连接状态。当对等设备断开连接时,连接不会神奇地变为错误。您在阅读时已经在测试流末尾了。你不需要另外一个循环。

  • 每次围绕该外部循环创建一个新的BufferedReader都无法正常工作:它只会导致数据丢失

  • 阅读和接受循环中的睡眠也完全没有意义。