关于Android 的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) .

修改后,速度快了很多。

在此记录下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风堂主人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值