我正在使用Socket与ServerSocket通信。服务器向我的Socket发送字符串。每个独立的行都是一条消息,当解析时包含信息。为了读取这些文本行,使用了Scanner。
问题在于数据是“间歇性”到达的。虽然服务器持续且均匀地发送数据,但客户端的Scanner读取的数据似乎暂停,一次读取一堆消息(30-40),然后再次暂停。它无限循环重复这个过程。
如果我增加数据发送速率,则暂停持续时间会减少;如果我减慢数据速度(每秒1个消息),则错误仍然存在,并且暂停时间变得非常长。就好像Socket在等待其缓冲区溢出之前不发送任何数据给Scanner;然后刷新所有内容并等待再次溢出。但是,如果我减小Socket的缓冲区大小,什么也不会改变。
应该注意的是,我以前在此方法中使用了Scanner和Socket - 来自服务器端 - 一切都按预期工作。此外,a)我尝试了这个Java教程中的BufferedReader(bug没有改变),b)将服务器传输列表打印到文件中,并以相同的方式从文件中读取,程序按预期工作(消息接收速率恒定等),因此问题似乎在Socket本身中。
那么:如何修复此行为?我已经没有想法了,真的不知道发生了什么。
代码(按要求):
这就是我连接和检索字符串的方式。
此外,我接收到的字符串通常有20-40个字符长。
问题在于数据是“间歇性”到达的。虽然服务器持续且均匀地发送数据,但客户端的Scanner读取的数据似乎暂停,一次读取一堆消息(30-40),然后再次暂停。它无限循环重复这个过程。
如果我增加数据发送速率,则暂停持续时间会减少;如果我减慢数据速度(每秒1个消息),则错误仍然存在,并且暂停时间变得非常长。就好像Socket在等待其缓冲区溢出之前不发送任何数据给Scanner;然后刷新所有内容并等待再次溢出。但是,如果我减小Socket的缓冲区大小,什么也不会改变。
应该注意的是,我以前在此方法中使用了Scanner和Socket - 来自服务器端 - 一切都按预期工作。此外,a)我尝试了这个Java教程中的BufferedReader(bug没有改变),b)将服务器传输列表打印到文件中,并以相同的方式从文件中读取,程序按预期工作(消息接收速率恒定等),因此问题似乎在Socket本身中。
那么:如何修复此行为?我已经没有想法了,真的不知道发生了什么。
代码(按要求):
// In try block
// Makes the connection
Socket connection = new Socket(TARGET_MACHINE, PORT_NUMBER);
Scanner reader = new Scanner(connection.getInputStream());
// In new Thread
// In run()
while(!finished) // Boolean exit strategy
{
if(reader.hasNextLine())
Sring message = reader.nextLine();
}
这就是我连接和检索字符串的方式。
此外,我接收到的字符串通常有20-40个字符长。