Java服务器套接字读取

时间:2012-01-03 02:36:37

标签: java sockets networking tcp

我有一个非常奇怪的问题,我的最后一招是在StackOverflow上问这个问题,所以请保持开放态度!

以下是两个程序:

一个。客户端:在Android手机上运行的Java客户端。 B.服务器:在计算机上运行的java服务器。

以下是两个程序的作用:

客户端每2毫秒(非常快)发送服务器坐标(字符串格式),服务器必须读取客户端发送的所有坐标。为了实现这一点(假设服务器位于10.0.0.1并且正在侦听端口54321),服务器必须有一个套接字,通过它可以读取所有传入的信息。是的,它确实收到了所有的信息,但是,有一个问题!

既然你有故事的背景,那就是问题所在:

客户端连接到服务器,一旦发生这种情况,它就会以极快的速度开始发送坐标(字符串格式)。服务器确实获取了所有消息,但除非客户端已断开连接,否则它不会停止读取。我需要的是服务器在收到时单独阅读每条消息!

以下是我用来从套接字读取的代码(这是针对服务器的,它在自己的线程上):

    while(true) {
        try {
            BufferedReader socketReader = 
            new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String str = socketReader.readLine();
            System.out.println("New Message: " + str);
            socketReader.close();
        } catch (IOException e) {
            //Client disconnected
            System.out.println("Client disconnected.");
            break;
        }
    }

这是我从客户端获得的输出(其中x和y是数字):

 New Message: x,yx,yx,yx,yx,yx,yx,yx,yx,yx,yx,yx,yx,yx,yx,yx,yx,y...and so on

该文本仅在客户端断开连接后显示。我想让它显示出来的消息。

只是为了澄清,这是所需的输出:

 New Message: x,y
 New Message: x,y
 New Message: x,y
 New Message: x,y
 ... and so on

如果这是有用的,这里是写入套接字的方法(此代码来自客户端)

PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
while(running) {
    writer = new PrintWriter(socket.getOutputStream(), true);
    writer.write(x+","+y);
    writer.flush();
}

总而言之,我需要的是我的服务器在客户端断开连接后同时读取消息而不是全部读取消息。 P#中的P.S我也编写了一个服务器,并且它会在读取信息时读取信息,但是在Java中这不是很有效!

2 个答案:

答案 0 :(得分:4)

您正在呼叫readLine,顾名思义,这是为了阅读。您的数据不包含行。

如果可能,请更改您的协议,以便每个坐标集由换行符和/或回车符终止。

不幸的是,我不认为你能够让它发挥作用。对于商用网络硬件来说,2ms的分辨率是不可能的,如果你试图强迫它,各种各样的东西都会破裂。如果启用Nagle,当ACK迟到时,您将从Nagling获得200ms的延迟。如果你禁用Nagle,丢弃一个数据包将会触发你的延迟。

老实说,我会扯掉设计并开始思考你的要求是什么以及你将如何满足它们。

你在哪里找到一台可以每秒发送500个数据包的Android设备?!没有Wifi,我知道可以做到这一点,GPS通过电线有什么用?

(如果您还没有完成将套接字缓冲区缩减到绝对最小值,使用非阻塞写入操作以及通过在接收器中中止和丢弃部分数据来处理部分写入等操作,那么您将无法接近满足您的要求。如果连接带宽瞬间下降,不得让数据备份。)

答案 1 :(得分:0)

每次在客户端的输出套接字上执行flush()。消息实际上是缓冲的,直到你现在关闭套接字。