关闭

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

标签: socketunity
1316人阅读 评论(2) 收藏 举报
分类:

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
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:457081次
    • 积分:5916
    • 等级:
    • 排名:第4278名
    • 原创:134篇
    • 转载:88篇
    • 译文:2篇
    • 评论:187条
    最新评论