Java服务器套接字读取
我有一个非常奇怪的问题,我最后的办法是在StackOverflow上问这个问题,所以请保持开放的心态 以下是两个程序: 客户端:运行在Android手机上的java客户端。 服务器:在计算机上运行的java服务器 以下是这两个程序的作用: 客户端每2毫秒(非常快)发送一次服务器坐标(字符串格式),服务器必须读取客户端发送的所有坐标。为了实现这一点(假定服务器位于10.0.0.1,正在侦听端口54321),服务器必须有一个套接字,通过该套接字读取所有传入信息。是的,它确实收到了所有的信息,但是,有一个陷阱 现在,您已经了解了故事背后的背景,问题是: 客户端连接到服务器,一旦发生这种情况,它就开始以极快的速度发送坐标(字符串格式)。服务器确实获取了所有消息,但它不会停止读取,除非客户端已断开连接。我需要的是服务器在接收到每一条消息时单独读取它们 下面是我用来从套接字读取的代码(这是针对服务器的,它在自己的线程上): 这是我从客户端获得的输出(其中x和y是数字): 而该文本仅在客户端断开连接后显示。我希望它在收到信息时显示出来 仅澄清一下,这是期望的输出:Java服务器套接字读取,java,sockets,networking,tcp,Java,Sockets,Networking,Tcp,我有一个非常奇怪的问题,我最后的办法是在StackOverflow上问这个问题,所以请保持开放的心态 以下是两个程序: 客户端:运行在Android手机上的java客户端。 服务器:在计算机上运行的java服务器 以下是这两个程序的作用: 客户端每2毫秒(非常快)发送一次服务器坐标(字符串格式),服务器必须读取客户端发送的所有坐标。为了实现这一点(假定服务器位于10.0.0.1,正在侦听端口54321),服务器必须有一个套接字,通过该套接字读取所有传入信息。是的,它确实收到了所有的信息,但是,有
New Message: x,y
New Message: x,y
New Message: x,y
New Message: x,y
... and so on
如果这有任何用处,下面是写入套接字的方法(此代码来自客户端)
总之,我需要的是我的服务器在消息传入时读取消息,而不是在客户端断开连接后同时读取所有消息。在C#中,我还编写了一个服务器,该服务器在信息进入时读取信息,但在Java中,这是行不通的 每次在客户端的输出套接字上执行flush()
。在您现在关闭套接字之前,消息实际上一直处于缓冲状态。每次在客户端的输出套接字上执行flush()
。在您现在关闭套接字之前,消息实际上一直处于缓冲状态。您正在调用它,顾名思义,它是用于读取行的。您的数据不是由行组成的
如果可能,请更改协议,使每组坐标以换行符和/或回车符终止
不幸的是,我不认为你能让它工作。2ms分辨率在商品网络硬件上是不可能的,如果你试图强迫它,各种各样的东西都会坏掉。如果启用Nagle,当ACK延迟时,Nagle将延迟200毫秒。如果禁用Nagle,丢弃数据包将导致延迟
老实说,我会撕毁设计,重新思考您的需求是什么以及如何满足它们
你在哪里找到一台每秒可以发送500个数据包的Android设备?!据我所知,没有Wifi可以做到这一点,而GPS在有线电视上又有什么用呢
(如果您还没有将套接字缓冲区缩减到绝对最小值、使用非阻塞写入操作以及通过中止和删除接收器中的部分数据来处理部分写入等操作,那么您将无法接近满足您的要求。如果连接带宽短暂下降,则不能让数据备份。)您正在调用的,顾名思义,它是用来读取行的。您的数据不是由行组成的
如果可能,请更改协议,使每组坐标以换行符和/或回车符终止
不幸的是,我不认为你能做到这一点。2毫秒的分辨率在商品网络硬件上是不可能的,如果你试图强制它,所有的事情都会中断。如果你启用Nagle,当ACK延迟时,你会从唠叨中得到200毫秒的延迟。如果你禁用Nagle,丢弃一个数据包会导致你的延迟穿过屋顶
老实说,我会撕毁设计,重新思考您的需求是什么以及如何满足它们
你在哪里找到一台每秒可以发送500个数据包的安卓设备?据我所知,没有Wifi可以做到这一点,而通过有线GPS又有什么用呢
(如果您还没有将套接字缓冲区缩减到绝对最小值、使用非阻塞写入操作以及通过中止和删除接收器中的部分数据来处理部分写入等操作,那么您将无法接近满足您的要求。如果连接带宽短暂下降,则不能让数据备份。)是不是出了什么问题?似乎IOException正在发生。是不是出了什么问题?似乎IOException正在发生。是的,我已经在客户端的代码上有writer.flush();了。无论如何,谢谢你的回复。还有其他建议吗?我也会发布客户端的编写方法。是的,我有writer.flush();已经在客户端的代码上了。谢谢你的回复。还有其他建议吗?我也会发布客户端的写作方法。+1好主意(在我的flush()想法之后,但他已经想到了)哇,哈哈,我要试试看,如果行得通,我会打自己很多次的背。:DOkay,那么David你是对的,我加了一个“\r\n”但我也必须去掉“socketReader.close;”这一行。好吧,我会让它成为每秒60个数据包。每秒60帧在任何一天都足够好。谢谢你的精彩输入,非常感谢。顺便说一句,我试图通过执行socket.noTcpDelay(true)来禁用Nagle;正确吗?我只在客户端的代码上这样做了,而不是在服务器上。我需要在两者上都这样做吗?服务器是否将任何数据发送回客户端?这会影响ACK是否可以搭载以及延迟ACK的行为。如果服务器不发送任何内容,则可能必须禁用Nagle并收缩套接字
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();
}