unity学习(26)——客户端与服务器合力完成注册功能(8)json编解码问题,大结局

服务器端发送的内容如下:

客户端所接受的内容如下:

是一样的,不是传输问题,少了一个解码的过程,之前那个addMessage函数应该是不能解码的

具体解析一下数据包的内容:上边的是成功的,下面的是失败的。

0000001e0000000000000000000000030000000e7b2276616c7565223a747275657d

0000001f0000000000000000000000030000000f7b2276616c7565223a66616c73657d

服务器中发包代码如下:读完就知道问题了,客户端这边的addMessage函数的名字到时候也要改

cs 复制代码
  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就是上策!颠倒一下大小端的顺序即可。

原代码:

cs 复制代码
public void WriteInt(int value)
{
  this.bytes.AddRange((IEnumerable<byte>) new byte[4]
  {
    (byte) (value >> 24),
    (byte) (value >> 16),
    (byte) (value >> 8),
    (byte) value
  });
}

修改后的代码:

cs 复制代码
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)
  });
}

终于成功了:

在主界面上以文字的形式显示一下注册结果。

相关推荐
InterestOriented36 分钟前
破解银发学习痛点 兴趣岛 “普惠 + 品质” 模式打造积极老龄化范本
大数据·人工智能·学习
HyperAI超神经1 小时前
IQuest-Coder-V1:基于代码流训练的编程逻辑增强模型;Human Face Emotions:基于多标注维度的人脸情绪识别数据集
人工智能·深度学习·学习·机器学习·ai编程
testpassportcn2 小时前
UiPath-ADPV1 認證介紹|Automation Developer Professional v1
网络·学习·改行学it
生擒小朵拉2 小时前
ROS1学习笔记(二)
笔记·学习
Gorgous—l4 小时前
数据结构算法学习:LeetCode热题100-动态规划篇(下)(单词拆分、最长递增子序列、乘积最大子数组、分割等和子集、最长有效括号)
数据结构·学习·算法
窗边鸟5 小时前
小白日记之java方法(java复习)
java·学习
魔芋红茶6 小时前
Spring Security 学习笔记 4:用户/密码认证
笔记·学习·spring
爱宁~6 小时前
UnityShader学习笔记[二百九十九]UGUI中的Mask遮罩半透明Shader
笔记·学习
啦哈拉哈8 小时前
【Python】知识点零碎学习4
python·学习·算法
HyperAI超神经8 小时前
【vLLM 学习】Rlhf Utils
人工智能·深度学习·学习·机器学习·ai编程·vllm