Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在没有客户端的情况下从inputstream读取数据;冲洗();_Java_Sockets_Tcp_Inputstream_Flush - Fatal编程技术网

Java 在没有客户端的情况下从inputstream读取数据;冲洗();

Java 在没有客户端的情况下从inputstream读取数据;冲洗();,java,sockets,tcp,inputstream,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

我实现了一个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()));
然而,我们发现存在较大的延迟(即上述系统输出“开始…”和“完成…”时间之间存在较大偏差)。时间花在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调用,因此我无法对其进行任何修改,以强制将其“刷新”消息到我的inputstream。。。请告知是否有任何方法可以使服务器端在不延迟的情况下从inputstream读取数据,即使客户端(即GPS设备)不执行“刷新”

接收器无法读取尚未发送的数据。它无法强制另一端发送尚未发送的数据。

接收器无法读取尚未发送的数据。它无法强制另一端发送尚未发送的数据。

感谢Peter Lawrey的建议,我们使用TCPDump证明,数据在建立连接几秒钟后被刷新到我们的服务器。这就是服务器程序捕获大延迟的原因

但是,我们使用相同的服务器程序执行一些负载测试,让4000个测试GPS设备每5分钟将数据推送到它,每个数据大约是300字节

我们试图通过引入Threadpool来修改服务器代码,以处理TCP数据检索,并希望这会给我们带来更好的性能

我们已经打开了TCPDump,发现这一次在TCPDump时间戳和Java程序中捕获的“开始…”时间戳之间发现了时间偏差。偏差在几秒到不到20秒之间

有没有关于如何解决问题的建议

线程池的初始化:

blockingQueueForRetriveTCPMsg = new LinkedBlockingQueue<Runnable>(50);
threadPoolExecutorForRetriveTCPMsg = new ThreadPoolExecutor(
    50,1200, 0, TimeUnit.SECONDS,
    blockingQueueForRetriveTCPMsg, 
    new ThreadPoolExecutor.CallerRunsPolicy());
在RetrieveTcpMessage.run()内部,与之前类似:

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()));

感谢Peter Lawrey的建议,我们使用TCPDump证明数据在建立连接几秒钟后被刷新到服务器。这就是服务器程序捕获大延迟的原因

但是,我们使用相同的服务器程序执行一些负载测试,让4000个测试GPS设备每5分钟将数据推送到它,每个数据大约是300字节

我们试图通过引入Threadpool来修改服务器代码,以处理TCP数据检索,并希望这会给我们带来更好的性能

我们已经打开了TCPDump,发现这一次在TCPDump时间戳和Java程序中捕获的“开始…”时间戳之间发现了时间偏差。偏差在几秒到不到20秒之间

有没有关于如何解决问题的建议

线程池的初始化:

blockingQueueForRetriveTCPMsg = new LinkedBlockingQueue<Runnable>(50);
threadPoolExecutorForRetriveTCPMsg = new ThreadPoolExecutor(
    50,1200, 0, TimeUnit.SECONDS,
    blockingQueueForRetriveTCPMsg, 
    new ThreadPoolExecutor.CallerRunsPolicy());
在RetrieveTcpMessage.run()内部,与之前类似:

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()));

这里有这样一个问题:[[1]:谢谢你的参考。链接似乎是在讨论发送方的问题……我试图通过使用BufferedInputStream包装服务器的inputStream来跟踪其中一个回复,但仍然是一样的……如果我理解错误,请告知我这里有这样一个问题:[[1]:谢谢你的参考。看起来链接是在讨论发送方的问题…我试图通过使用BufferedInputStream包装服务器的inputStream来跟踪其中一个回复,但仍然是一样的…如果我得到的是错误的,请告知我,或者我不熟悉套接字编程…这意味着数据实际上不是se吗nt到服务器端即使已完成writeBytes(),但“flush()”未调用?…并且在接收器端无法执行任何操作?我只是想知道GPS设备的行为是否与我使用Java测试客户端测试的一样…您对我如何审查该问题有何建议?谢谢您可以使用wireshark查看实际发送的数据包。如果GPS设备已发送数据,您将能够看到它。如果尚未发送数据,除了更改GPS设备的工作方式之外,您无能为力。很抱歉,我不熟悉套接字编程…这意味着数据实际上并未发送到服务器端,即使已完成writeBytes(),但“flush()”未调用?…并且在接收器端无法执行任何操作?我只是想知道GPS设备的行为是否与我使用Java测试客户端测试的一样…您对我如何审查该问题有何建议?谢谢您可以使用wireshark查看实际发送的数据包。如果GPS设备已发送数据,您将能够看到它。如果尚未发送数据,除了更改GPS设备的工作方式外,您无能为力。欢迎使用Stack Overflow!如果您有新问题,请单击按钮提问。欢迎使用Stack Overflow!如果您有新问题,请单击按钮提问。