情况就是这样。我想制作游戏,客户端是用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更多的控制权。
答案 0 :(得分:2)
在输出初始化中添加BufferedOutputStream
,如下所示:
Output = new DataOutputStream(new BufferedOutputStream(connection.getOutputStream()));
答案 1 :(得分:1)
基本上,您需要将邮件格式从[type, data]
切换为[type, length, data]
。然后,等待处理数据,直到bytesAvailable
> = length
,否则将其放入缓冲区。
以下是使用此逻辑的示例SOCKET_DATA
处理程序: