繁体   English   中英

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

[英]Java Socket Bug: Reading Strings from Socket's InputStream

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

问题是数据是“突飞猛进”的。 虽然Server是连续均匀的发送数据,但是client端的Scanner读取的数据似乎暂停了,一下子读入了一堆消息(30-40),然后又暂停了。 它无限期地重复这个循环。

如果我提高发送数据的速率,暂停的持续时间会减少; 如果我减慢数据速度(每秒 1 条消息),错误仍然存在并且暂停变得很长。 就好像 Socket 在向 Scanner 发送任何数据之前等待其缓冲区溢出一样; 然后刷新所有内容并再次等待溢出。 但是,如果我减小 Socket 缓冲区的大小,则根本没有任何变化。

应该注意的是,我以前在这种方法中使用过 Scanner 和 Socket - 从服务器端 - 一切都按预期工作。 此外,我 a) 使用像 Java 教程这样的 BufferedReader 进行了尝试(错误没有变化),b) 将服务器传输列表打印到文件中,并以相同的方式从文件中读取,程序按预期工作(消息接收的恒定速率等)所以问题似乎出在 Socket 本身。

那么:我该如何解决这种行为? 我没有想法atm,我真的不知道发生了什么。

代码(根据要求):

// 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 个字符。

您是否可能使用 readLine 来读取数据?

以下是 javadoc 的摘录,您可能会感兴趣:

由于此方法继续搜索输入以查找行分隔符,因此如果不存在行分隔符,它可能会缓冲所有搜索要跳过的行的输入。

你能附上客户端和服务器代码来看看有什么问题吗? 最好使用非常简单的逐字节读取器来检查来自服务器的 stream 传输暂停,也许问题在于您将数据写入服务器套接字的方式......没有代码很难猜测:)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM