我试图从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();
答案 0 :(得分:1)
在以下代码中..
while((line = input.readLine()) != null)
{
receivedText += line;
}
readLine()函数等待,直到它获得输入行或指示其结束流。您在循环中检查它是否为null。只有当它结束流时或者在客户端断开连接的情况下,它才会回复null。在断开连接(或执行其他操作)之前,客户端应回复/写入通知文件结尾的最后一条消息。
答案 1 :(得分:0)
readLine()方法仅在对等方断开连接时返回null。如果要打印每一行,请在读取循环内执行此操作。
还有其他问题:
'while socket.isConnected()'测试毫无意义。它已连接,并将保持连接状态。当对等设备断开连接时,连接不会神奇地变为错误。您在阅读时已经在测试流末尾了。你不需要另外一个循环。
每次围绕该外部循环创建一个新的BufferedReader都无法正常工作:它只会导致数据丢失
阅读和接受循环中的睡眠也完全没有意义。