Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.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
Flash 通过套接字发送坐标,但消息有时是批处理在一起的,如何防止这种情况?_Flash_Actionscript 3_Sockets_Air - Fatal编程技术网

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

Flash 通过套接字发送坐标,但消息有时是批处理在一起的,如何防止这种情况?,flash,actionscript-3,sockets,air,Flash,Actionscript 3,Sockets,Air,我有一个接收信息的空中服务器。我有正在发送消息的Flash客户端应用程序。现在我只是用一个客户端进行测试。我担心,当我有两个客户端发送坐标时,这个问题可能会变得更糟…还没有测试出来 我将客户端的鼠标坐标作为一系列字符串消息发送,例如100200,然后在服务器端对其进行解析。当用户在客户机上移动鼠标时,我会连续快速地向服务器发送大量此类消息 在服务器上的大多数时间,当我阅读消息时,我得到一个x,y…这很好。有时,当我阅读信息时,坐标被批处理在一起 所以,如果我很快连续发送 100200 12345

我有一个接收信息的空中服务器。我有正在发送消息的Flash客户端应用程序。现在我只是用一个客户端进行测试。我担心,当我有两个客户端发送坐标时,这个问题可能会变得更糟…还没有测试出来

我将客户端的鼠标坐标作为一系列字符串消息发送,例如100200,然后在服务器端对其进行解析。当用户在客户机上移动鼠标时,我会连续快速地向服务器发送大量此类消息

在服务器上的大多数时间,当我阅读消息时,我得到一个x,y…这很好。有时,当我阅读信息时,坐标被批处理在一起

所以,如果我很快连续发送

100200

123456

111222

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

100200123456111222

以下是客户端的代码:

socket.writeUTFBytes( coordString ); //an x,y pair
socket.flush(); //make sure it's sent
我如何预防这种情况?是因为我在快速连续地发送消息吗

铌 关于可能通过不同格式发送的建议很好。在这一点上,我只是想保持简单。当用户在客户机上拖动鼠标时,消息主要是鼠标坐标。每隔一段时间就会有一条状态信息。所有的信息都很短。绿色、红色等。我还可能发送整数,这将减少我发送的字节数。字符串100是3个字节,但我认为作为一个整数可能需要2个“是”…所以我在这里保存了一个字节。在这一点上,当服务器接收到鼠标坐标并在服务器屏幕上移动某些东西时,我看不到任何延迟。如果出现问题,我可能会发送字节


对于那些发现了这个问题并正在发送更复杂消息的人来说,也许AMF、JSON、XML会更好。

套接字的使用方式正是您想要的效果:链接消息将通信开销保持在最低限度。您必须对每条消息进行打包,以保持其可区分性。如果您有多个消息类型,并且需要保持干净的分隔,那么可以将每个消息包装在一个XML节点中,或者使用JSON表示法

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

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

100,200 123,456 111,222

100,200
123,456
111,222

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

这里的问题是,您的发送超出了预期,而不是等待一次发送完成后再发送下一次。基本上是在缓冲区清空之前添加缓冲区。 所以要解决这个问题,你有两个选择。 第一种方法是在发送更多数据之前,确保您尚未发送数据。有点像把它们分批放在一个数组里。 这种方法并不是那么好,因为在服务器端,客户机做什么并不重要。无论客户端发送什么,服务器都应该能够处理它。 现在,第二个选项是同时更正客户端和服务器。 首先,在客户机上,您需要使用空字符结束对服务器的每次发送。这通常是标准,因为它会告诉服务器这轮数据到此结束

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

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

不要使用数字的字符串表示来发送数字。。。那是多余的。此外,如果是这种情况,您可能需要读取CRC循环冗余校验。其他海报建议使用现有的编码格式——这通常是一种很好的方式,然而,XML、JSON或CVS都是非常糟糕的通过网络传输数据的格式。CVS可能最适合您所追求的过于简单的任务,但它仍然是多余的

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

但是,如果您计划发送其他类型的数据,请查看AMF格式。这种格式是专门为支持ECMAScript数据结构而设计的,与JSON不同的是,JSON不能很好地表示多对多关系、循环结构,而且它实际上在某种程度上弄乱了字符串格式,而且过于冗长。 即使您选择的编写服务器的语言没有AMF库,编写起来也非常简单,但大多数是行业级lan
语言有一些AMF的实现,所以这应该不会是一个问题。

+1用于发送数字而不是字符串表示的建议。+1用于使用另一个字符终止coords,以及有关超出发送范围的信息。:保持简单是件好事。我认为,就我发送的数据量而言,用XML或JSON包装消息会造成太多的负担。但对于我未来项目中更复杂的数据,这是一个很好的建议