java - 从没有客户端的输入流读取数据 "flush()"

标签 java sockets tcp inputstream flush

我已经实现了一个 Java 程序,它通过 ServerSocket 从 GPS 设备读取数据。

ServerSocket serverSocket = new ServerSocket(13811);
serverSocket.setReceiveBufferSize(receiveBufferSize);
Socket incomingSocket = serverSocket.accept();
InputStream stream = incomingSocket.getInputStream();
byte[] buffer = new byte[1000];
            StringBuffer sb = new StringBuffer();
System.out.println("START getting message from TCP stream: " + dateFormat.format(Calendar.getInstance().getTime()));

            while (stream.read(buffer) > 0)
            {
                sb.append(new String(buffer));
                System.out.println(sb.toString());
            }
System.out.println("[incomingMessage]: " + incomingMessage);

System.out.println("FINISHED getting message from TCP stream: " + dateFormat.format(Calendar.getInstance().getTime()));

但是,我们发现有很大的延迟(即上面系统输出“START...”和“FINISHED...”之间的偏差很大)。时间花在了inputStream.read()上。

如果我使用 Java 客户端连接到上述服务器端口并向其发送数据,服务器的 inputStream 会在几毫秒内读取该消息。下面显示了 Java 客户端代码。

Socket socket = new Socket("localhost", 13811); 
DataOutputStream out = new DataOutputStream(new  BufferedOutputStream(socket.getOutputStream()));
String tobesend = "testing message 1";
out.writeBytes(tobesend);
out.flush();
out.close();

但是,如果我在“out.flush()”和“out.close()”之前添加“Thread.Sleep(10*1000)”,服务器端的延迟将变为 10 秒...因此我怀疑如果 GPS 设备没有执行“刷新”并导致服务器端的 inputstream.read() 延迟...

不幸的是,我们无法控制 GPS 设备 TCP 调用,因此我无法对其进行任何修改以强制将其“刷新”消息到我的输入流...请告知服务器端是否可以通过任何方式即使客户端(即 GPS 设备)不执行“刷新”,也没有这种延迟地从输入流读取数据?

最佳答案

接收方无法读取未发送的数据。它不能强制另一端发送也没有发送的数据。

关于java - 从没有客户端的输入流读取数据 "flush()",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9084301/

相关文章:

python - 扭曲的 TCP 隧道/桥接/中继

java - windows下socket读取超时: strange hardcode in native method

c++ - C/C++ 事件驱动监控非子程序的终止

http - 为什么有些http协议(protocol)的包在Wireshark中会引用其他的包?

java - Clojure/Swing/Java 中 BufferedImage 和 ImageObserver 的问题

java - 以编程方式将 POJO 转换为 @Configuration Spring

java - 不使用网络在本地连接到 Apache Tomcat

java - 在服务启动时更改图像

c - 如何在 C 中的 write_fds 和 select() 中正确设置标志

tcp - 在 tcp 中,每个连接一个接收缓冲区?或者所有连接共享一个缓冲区?