2

情况就是这样。我想制作一个游戏,客户端在 Flash 中制作,服务器在 java 上制作。从服务器端,我在流上写入的第一个字节是协议 ID,如下所示:

try 
{
 Output.writeByte(LOGIN);
 Output.writeByte((byte)ID);
 Output.writeByte(new_position.x);
 Output.writeByte(new_position.y);
 Output.flush();
} 

触发 'onResponse' 事件后,套接字读取如下:

type:int = socket_client.readByte();
if (type == 0x1)
FP.console.log("You are logged as " + socket_client.readByte() + " in x:" + socket_client.readByte() + " y:" +  socket_client.readByte() );
else if (type == 0x2)
      FP.console.log("You are now in x:" + socket_client.readByte() + " y:" +  socket_client.readByte());

正如您现在可能已经猜到的那样,这给我带来了一些问题。有时,服务器将信息分成两部分发送,因此上面的代码会引发 EOF 异常。跟踪以下代码有时会给我这个结果:

trace("SIZE: " + socket_client.bytesAvailable);
//var type:int = socket_client.readByte();
var values:String = "";
while (socket_client.bytesAvailable > 0)
       values += socket_client.readByte() + " ";
trace(values);`

价值观:

 SIZE: 1
 2 
 SIZE: 2
 2 6 

第一个 '2' 是协议 id,第二个和第三个代表 x 和 y 值。现在,问题是,我怎样才能防止这种情况发生?我怎么能“等”到我得到所有需要的信息?顺便说一句,在 java 上这永远不会发生,但我没有比 as3 更多的控制权。

4

2 回答 2

2

像这样添加BufferedOutputStream输出初始化:

Output = new DataOutputStream(new BufferedOutputStream(connection.getOutputStream()));
于 2012-12-10T02:14:57.340 回答
1

基本上,您需要将消息格式从 切换[type, data][type, length, data]. 然后,等待处理数据直到bytesAvailable>= length,否则将其放入缓冲区。

SOCKET_DATA这是一个使用此逻辑的示例处理程序:

https://github.com/magicalhobo/Flash-CS5-mobile-proxy/blob/master/com/magicalhobo/mobile/proxy/MobileClient.as#L110

于 2012-12-10T02:28:38.557 回答