Java 套接字错误 : Reading Strings from Socket's InputStream

标签 java debugging sockets client-server

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

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

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

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

那么:我该如何解决这个问题?我在 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 个字符长。

最佳答案

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

关于Java 套接字错误 : Reading Strings from Socket's InputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6310404/

相关文章:

java - 我的应用程序使用相机不记录纬度和经度(文件元数据)

java - 什么是 spring MVC 中的调试日志记录

c - 如何在VS中使用fgets

c# - 为 HTTP 监听器设置 'Access-Control-Allow-Origin'

java - 将对象写入套接字

javascript - 在不同的子域上使用 Socket.IO 服务器和客户端

java - Libgdx:暂停菜单和暂停状态

java - 使用 Mockito 从 void 方法中嗅出对象?

java - long 和 double 赋值不是原子的——这有什么关系?

c++ - 在 Code::Blocks 中调试似乎不起作用 - 缺少调试符号