赞
踩
服务器端发送的内容如下:
客户端所接受的内容如下:
是一样的,不是传输问题,少了一个解码的过程,之前那个addMessage函数应该是不能解码的!
具体解析一下数据包的内容:上边的是成功的,下面的是失败的。
0000001e0000000000000000000000030000000e7b2276616c7565223a747275657d
0000001f0000000000000000000000030000000f7b2276616c7565223a66616c73657d
服务器中发包代码如下:读完就知道问题了,客户端这边的addMessage函数的名字到时候也要改
- public void write(int type, int area, int command, object message)
- {
- SocketModel socketModel = new SocketModel(type, area, command, (string) null);
- if (message != null)
- socketModel.Message = Coding<object>.encode(message);
- int num1 = 16;
- if (socketModel.Message != null)
- num1 += socketModel.Message.Length;
- ByteArray byteArray = new ByteArray();
- byteArray.WriteInt(num1);
- byteArray.WriteInt(socketModel.Type);
- byteArray.WriteInt(socketModel.Area);
- byteArray.WriteInt(socketModel.Command);
- if (socketModel.Message != null)
- {
- int num2 = num1 + socketModel.Message.Length;
- byteArray.WriteInt(socketModel.Message.Length);
- byteArray.WriteUTFBytes(socketModel.Message);
- }
- else
- byteArray.WriteInt(0);
- this.socket.Send(byteArray.Buffer);
- Console.WriteLine("session.write返回给客户端的消息长度" + (object)byteArray.Buffer.Length);
- foreach (byte b in byteArray.Buffer)
- {
- Console.Write(b.ToString("x2"));//是不是还有个大小端的问题
- }
- Console.WriteLine(byteArray.Buffer.ToString());
- //MyLog.form.textAdd("消息长度" + (object) byteArray.Buffer.Length);
- }
- }
0000001f:byteArray.WriteInt(num1); 16+message,含义是个16+消息长度。
00000000:byteArray.WriteInt(socketModel.Type);
00000000:byteArray.WriteInt(socketModel.Area);
00000003:byteArray.WriteInt(socketModel.Command);
0000000e:byteArray.WriteInt(socketModel.Message.Length);含义是消息长度。
剩下的都是消息内容:byteArray.WriteUTFBytes(socketModel.Message);
此时的message是一个encode的object,并不是简单的明文传输!所以客户端一定是要有解码函数的。
第一个位置的错误,因为服务器没有读前四个字节出来(0000001f:),加上以后!
MessageManager中的UpDate已经可以读出正确的message,但是type aera 和 command明显存在大小端的问题!改客户端的收包或者改服务器的发包都可以。
ByteArray这个类是自定义的,无论是客户端还是服务器,客户端是源代码,服务器是逆向代码,估计难免有些问题。
左右一对比,差距立竿见影,修改服务器这边的WriteInt就是上策!颠倒一下大小端的顺序即可。
原代码:
- public void WriteInt(int value)
- {
- this.bytes.AddRange((IEnumerable<byte>) new byte[4]
- {
- (byte) (value >> 24),
- (byte) (value >> 16),
- (byte) (value >> 8),
- (byte) value
- });
- }
修改后的代码:
- public void WriteInt(int value)
- {
- this.bytes.AddRange((IEnumerable<byte>) new byte[4]
- {
- //(byte) (value >> 24),
- (byte) value,
- (byte) (value >> 8),
- (byte) (value >> 16),
- //(byte) (value >> 8),
- (byte) (value >> 24)
- });
- }
终于成功了:
在主界面上以文字的形式显示一下注册结果。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。