Java Socket Bug:从Socket的InputStream中读取字符串

Cod*_*nny 6 java sockets debugging client-server

我正在使用Socket与ServerSocket通信.字符串正从服务器发送到我的Socket.每条不同的行都是一条消息,在解析时包含信息.要阅读这些文本行,请使用扫描仪.

问题是数据正在"爆发".虽然服务器连续均匀地发送数据,但客户端扫描器读取的数据似乎暂停,一次读取一堆消息(30-40),然后再次暂停.它无限期地重复这个循环.

如果我增加发送数据的速率,则暂停的持续时间减少; 如果我减慢数据速度(每秒1条消息),则错误仍然存​​在,暂停时间变长.这几乎就像Socket在向扫描器发送任何数据之前等待其缓冲区溢出一样; 然后冲洗所有东西并再次等待溢出.但是,如果我减小Socket缓冲区的大小,则根本没有任何变化.

应该注意的是,我之前在这个方法中使用过Scanner和Socket - 从服务器端 - 并且一切都按照需要工作.另外,我a)尝试使用像Java Tutorials这样的BufferedReader(没有更改bug)和b)将服务器传输列表打印到文件中,并以相同的方式从文件中读取,并且程序按预期工作(消息接收率恒定等)因此问题似乎在Socket本身.

那么:我该如何解决这个问题呢?我没有想法,我真的不知道发生了什么.

代码(根据要求):

// In try block
// Makes the connection
Socket connection = new Socket(TARGET_MACHINE, PORT_NUMBER);
Scanner reader = new Scanner(connection.getInputStream());
Run Code Online (Sandbox Code Playgroud)
// In new Thread
// In run()
while(!finished) // Boolean exit strategy
{
    if(reader.hasNextLine())
        Sring message = reader.nextLine();
}
Run Code Online (Sandbox Code Playgroud)

这就是我连接和检索字符串的方式.

另外,我收到的字符串通常大约20-40个字符.

Coe*_*ect 2

每次从服务器端写入流时都会刷新流吗?它可能正在缓冲输出,并且在达到某个阈值之前不会将其写入流。