2012-01-03 88 views
0

我有一个非常奇怪的问题,我的最后一招是在StackOverflow上询问这个问题,所以请大家开放!阅读Java服务器插座

这里有两个方案:

A.客户:在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(); 
} 

所以,这一切的一切,我需要的是我的服务器读取消息,因为他们进来,而不是读他们都在客户端断开连接后的同一时间。在C#中,我也写了一个服务器,并且这个服务器正在读取这个信息,但是在Java中,这并不能解决问题!

+0

是不是有什么问题?看来IOException发生了。 – kosa 2012-01-03 02:41:02

回答

4

要调用readLine,正如它的名字所暗示的,是阅读线。您的数据不包含行。

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

不幸的是,我不认为你将能够得到这个工作。 2ms的分辨率在商用网络硬件上是不可能的,如果你试图强制它,所有类型的东西都会中断。如果启用Nagle,则当ACK迟到时,您将从Nagling获得200毫秒的延迟。如果您禁用Nagle,则丢弃数据包将会在您的屋顶上拍摄您的延迟。

老实说,我撕了设计,并开始了通过精确的要求是什么,以及如何你要满足他们的思维。

你在哪里找到可发送500个包第二的Android设备?没有我知道的无线网络可以做到这一点,GPS通过电线有什么用处? (如果您还没有将套接字缓冲区缩小到绝对最小值,使用非阻塞写入操作以及通过在接收器中中止和删除部分数据来处理部分写入操作,那么您不会在任何地方关闭满足你的要求,你不得让数据备份,如果有在连接带宽瞬间下降。)

+0

+1伟大的想法(我冲洗后()的想法,但他已经想到这一点) – 2012-01-03 02:44:41

+0

哇咔咔,我要去尝试,如果它的作品,我会拍自己的背了很多次。 :D – 2012-01-03 02:47:09

+0

好的,大卫你是对的,我在邮件中加了一个“\ r \ n”。但我也必须摆脱“socketReader.close;”这一行。还好,生病了,每秒要60包。每秒60帧就足够好了。感谢您的所有精彩输入,非常感谢。顺便说一句,我试图通过做socket.noTcpDelay(true)禁用Nagle;那是对的吗?我只在客户端的代码上做到了,而不是在服务器上,我是否需要在两者上都这样做? – 2012-01-03 02:52:50

0

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

+0

是的,我有writer.flush();已经在客户的代码上。无论如何感谢您的答复。还有其他建议吗?我也会发布客户的写作方法。 – 2012-01-03 02:43:20