[Unity通信]一个基于socket的3DARPG网络游戏(二):消息分类处理和json的使用

LitJson是一个开源项目,github地址为:

https://github.com/lbv/litjson/tree/v0.9.0


解决LitJson读取中文的问题:

http://blog.sina.com.cn/s/blog_6819cb9b01010l7h.html


LitJson下载(解决了读取中文的问题):

http://pan.baidu.com/s/1bn0qPMR


//

一.客户端

1.对消息进行枚举处理

public enum ModuleTypeEnum
{
    Login,
    CharacterControl,
}

public enum MessageTypeEnum
{
    Login_Login,
    Login_Register,

    Character,
}


2.定义DTO(方便与json字符串相互转化)

public class LoginDTO {

    public string Account { get; set; }
    public string Password { get; set; }

    public LoginDTO()
    {
    }

    public LoginDTO(string account, string password)
    {
        Account = account;
        Password = password;
    }

}

public class BoolDTO {

    public bool Value { get; set; }

    public BoolDTO()
    {
    }

    public BoolDTO(bool value)
    {
        Value = value;
    }
}

3.定义处理DTO和json转化的类

using LitJson;

public class SocketTool<T> {

    public static string ToJson(T o)
    {
        return JsonMapper.ToJson(o);
    }

    public static T ToObject(string s)
    {
        return JsonMapper.ToObject<T>(s);
    }

}


4.定义消息处理类

using UnityEngine;
using System.Collections;

public class LoginHandler : SocketHandler {

    public override void Handle(SocketMessage sm)
    {
        if (sm.ModuleType == (int)(ModuleTypeEnum.Login))
        {
            if (sm.MessageType == (int)(MessageTypeEnum.Login_Login))
            {
                BoolDTO b = SocketTool<BoolDTO>.ToObject(sm.Message);
                if (b.Value)
                {
                    Debug.Log("login success");
                }
                else
                {
                    Debug.Log("login fail");
                }
            }
        }
    }
}

5.发送消息(以点击登录按钮为例)

private void Login()
    {
        if ((accountText.text != string.Empty) && (passwordText.text != string.Empty))
        {
            LoginDTO l = new LoginDTO(accountText.text, passwordText.text);
            string s = SocketTool<LoginDTO>.ToJson(l);
 
            SocketMessage sm = new SocketMessage((int)ModuleTypeEnum.Login, (int)MessageTypeEnum.Login_Login, s);
            SocketSingletion.Instance.GetSocketClient().AsynSend(sm);
        }
    }


二.服务器端

1.接受消息

public static void HandleMessage(SocketClient sc, SocketMessage sm)
    {
        Console.WriteLine(sc.GetSocket().RemoteEndPoint.ToString() + "   " + 
            sm.Length + "   " + sm.ModuleType + "   " + sm.MessageType + "   " + sm.Message);

        if (sm.ModuleType == (int)(ModuleTypeEnum.Login))
        {
            if (sm.MessageType == (int)(MessageTypeEnum.Login_Login))
            {
                BoolDTO b;
                LoginDTO l = SocketTool<LoginDTO>.ToObject(sm.Message);
                if(l.Account.Equals(l.Password))
                {
                    b = new BoolDTO(true);
                }
                else
                {
                    b = new BoolDTO(false);
                }
                
                string s = SocketTool<BoolDTO>.ToJson(b);
                sc.AsynSend(new SocketMessage((int)ModuleTypeEnum.Login, (int)MessageTypeEnum.Login_Login, s));
            }
        }
    }


源码下载:

http://pan.baidu.com/s/1gdUftLp

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值