最近在做网络版的斗地主,设计是这样子的:
1,游戏的房间等信息用Socket的问答形式,也就是说,每一个请求都启动一个Socket,请求玩,直接关闭Socket
2.游戏过程中的数据用Socket的长连接实现。保证消息的及时性。
1,游戏的房间等信息用Socket的问答形式,也就是说,每一个请求都启动一个Socket,请求玩,直接关闭Socket
2.游戏过程中的数据用Socket的长连接实现。保证消息的及时性。
但是在开发的过程中遇到一个问题,就是在没有网络的情况下游戏运行速度很快,但是在有网络的情况下,游戏运行很卡,甚至报ANR。
源码:
/**
* 执行操作
*/
public void doLinker(final YOutMsg out) {
try {
LogUtil.logD(TAG, "连接全局服务器,ip=" + SocketConstant.SOCKET_IP + ", 端口:" + SocketConstant.SOCKET_PORT);
Socket OsSocket = new Socket(SocketConstant.SOCKET_IP, SocketConstant.SOCKET_PORT);
DataOutputStream osOutPut = new DataOutputStream(OsSocket.getOutputStream());
osOutPut.write(out.msgData());
osOutPut.flush();
YMsgController OsController = new YMsgController();
DataInputStream osInput = new DataInputStream(OsSocket.getInputStream());
boolean OsIsController = true;
byte[] tmp = new byte[1024];
while (OsIsController) {
if (OsClientExit) {
break;
}
int len = osInput.read(tmp);
Log.e(TAG, "len:" + len);
if (len > 0) {
Log.e(TAG, "len > 0");
byte[] da = new byte[len];
// src - 源数组。
// srcPos - 源数组中的起始位置。
// dest - 目标数组。
// destPos - 目标数据中的起始位置。
// length - 要复制的数组元素的数量。
System.arraycopy(tmp, 0, da, 0, len);
if (OsController.addParseData(da) > 0) {
in = OsController.takeMsg();
mMsgCallBack.osMessageHandler(in);
}
} else if (0 == len) {
OsIsController = false;
Log.e(TAG, "(0 == len)退出OS 服务");
break;
}
}
Log.d(TAG, "read sucess");
osInput.close();
OsController = null;
osOutPut.close();
OsSocket.close();
} catch (Exception e) {
Log.d(TAG, "Error " + e); // 出错,则打印出错信息
Database.HAS_ROOM_INFO_REQUEST = false;
Database.HAS_LOGING_REQUEST = false;
}
}
跟踪发现,每次数据都有请求到,也就是说读取数据的时候并没有阻塞,也没有读到异常(0 == len),经过排查,发现读到最后,数据的len=-1,也就是说读完了,但是服务器接口那边并没有按约定给我(len=0).只有我这边再加一个条件,即读完的条件(0 == len || -1 == len) .
修改后,速度快了很多。
在此记录下。