通过套接字发送坐标,但消息有时会一起批处理,如何防止这种情况?

时间:2012-02-07 04:21:39

标签: flash actionscript-3 sockets air

我有一台AIR服务器正在接收消息。我有发送邮件的Flash客户端应用程序。现在我只是在测试一个客户端。我担心当我有两个客户发送坐标时,这个问题可能会变得更糟......还没有测试过它。

我将客户端的鼠标坐标作为一系列String消息发送,例如“100,200”,然后在服务器端解析它。当用户在客户端上移动鼠标时,我会将大量这些消息快速连续发送到服务器。

当我阅读邮件时,大部分时间都在服务器上,我得到一个x,y ......这很棒。有时候,当我正在阅读信息时,坐标被一起批处理......

所以,如果我发送(快速连续)

“100200”

“123456”

“111222”

当服务器读取它时,我会看到

“100,200123,456111,222”!

以下是客户端的代码:

socket.writeUTFBytes( coordString ); //an x,y pair
socket.flush(); //make sure it's sent

如何防止这种情况?是因为我要快速连续发送消息吗?

NB 可能通过不同格式发送的建议很好。在这一点上,我只是想保持简单。当用户在客户端上拖动鼠标时,消息主要是鼠标坐标。每隔一段时间就有一条状态信息。所有消息都很短......例如。 “GREEN”,“RED”等我可能还会发送整数,这将减少我发送的字节数。字符串“100”是3个字节,但我认为作为一个整数它可能需要2个字节...所以我在那里保存一个字节。此时,我看到服务器收到鼠标坐标并在服务器屏幕上移动某些内容时没有任何延迟。如果成为问题,我可能会发送字节。

对于那些已发现此问题并发送更复杂消息的人,也许AMF,JSON,XML会很好。

3 个答案:

答案 0 :(得分:4)

使用套接字的方式,这就是您想要的效果:链接消息可以将通信开销降至最低。您必须“打包”每条消息以使它们与众不同。如果您有多个消息类型并且需要保持干净的分离,则可以将每个消息包装在XML节点中,或者使用JSON表示法。

但是,如果您只想使用坐标,那么添加一个简单的分隔符(如;或空格或换行符)就足够了:

100,200;123,456;111,222; 

100,200 123,456 111,222

100,200
123,456
111,222

在服务器端,您必须添加代码以按该字符拆分接收的字符串,并处理每个单独的结果。我可能会选择换行符 - 它们提高了调试的可读性。

答案 1 :(得分:4)

这里的问题是你是否超越你的发送而不是在发送下一个之前等待一个完成。基本上你是在清空之前添加到缓冲区
所以要解决这个问题,你有2个选择 第一个是确保在发送更多数据之前您还没有发送数据。有点像在阵列或其他东西中将它们批处理 这种方法并不是那么好,因为在服务器端,客户端的功能并不重要。无论客户端发送什么服务器都应该能够处理它
现在第二个选择是纠正客户端和服务器 首先在客户端上,您需要以空字符结束每次发送到服务器。这通常是标准,因为它会告诉服务器这是这一轮数据的结束。

socket.writeUTFBytes( coordString + String.fromCharCode(0) );

在服务器端,您需要查找该空字符,以便了解何时收到完整数据包。

答案 2 :(得分:1)

不要使用数字的字符串表示来发送数字......这是多余的。此外,如果是这种情况,您可能需要阅读CRC(循环冗余校验)。其他海报建议使用现有的编码格式 - 这通常是一个很好的方法,但是,XML,JSON或CVS都是通过网络传输数据的非常糟糕的格式。 CVS可能是您所完成的简单任务的最佳选择,但它仍然是多余的。

如果你可以确定你要发送的数字的大小(它们是整数,固定大小,字节?短裤?双打吗?)你可以简单地写一个接一个的整数,从不担心丢失的数字或混淆,因为你总是从套接字读取完全相同的字节长度。还有一些技术可以明确地将可变长度整数写入流中,而不需要分隔符(Flash中常用的是UI29)。

但是,如果您打算发送其他类型的数据 - 请查看AMF格式。这种格式专门设计用于支持ECMAScript数据结构,并且与JSON不同,它很好地服务于目的(JSON不能代表多对多的关系,循环结构,并且实际上它实际上搞乱了字符串格式,除此之外,它太冗长了)。 即使您选择编写服务器的语言没有AMF库,编写起来也很简单,但大多数行业级语言都有一些AMF实现,所以这几乎不成问题。