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

原创 2015年11月21日 21:24:50

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

版权声明:欢迎转载,欢迎讨论,大家一起共同进步!呵呵哒~

Unity传递复杂Json数据

由于项目中需要Unity和后台服务器间传递数据,而服务器程序采用Java语音编写,所以采用Json作为传递数据格式。 最开始使用Unity自带解决方案,5.3版本以上内置JsonUtility类来进...

Cocos2d-x游戏开发之Lua 5.1 参考手册

Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de Figueiredo, Waldemar Celes 云风 译 www.coding...

Cocos2d-x-Lua 游戏中使用Lua脚本进行游戏开发

对于游戏公司而言,采用游戏脚本lua、python等进行开发也很常见,但是很多童鞋对脚本并没有很熟悉的概念,本篇则向大家简单介绍脚本的用途以及在Cocos2dx基础用法; Lua和python这...

[Unity通信]一个基于socket的3DARPG网络游戏(一):建立连接和事件分发

一.客户端 1.定义一个消息体,服务器和客户端通信的时候,传输的就是这样的信息。 using System.Collections; using System.Text; public cl...
  • lyh916
  • lyh916
  • 2015年11月19日 20:08
  • 4039

在Unity3D的网络游戏中Json实现资源动态加载

用Unity3D制作基于web的网络游戏,不可避免的会用到一个技术-资源动态加载。比如想加载一个大场景的资源,不应该在游戏的开始让用户长时间等待全部资源的加载完毕。应该优先加载用户附近的场景资源,在游...

Unity3d网络游戏Socket通讯

网络游戏是一种人们娱乐休闲互交的应用软件。既然是互交,当然需要彼此间的了解通讯。要通讯那必须需要Socket:我们今天要实现的主角即套接字。Socket的英文原义是“孔”或“插座”,正如其英文原意那样...

[Unity3D ARPG网络游戏编程实践] 网络连接 :unity NetWork与socket的对比(一)

unity3d ARPG网络游戏编程实践 作者:A神 目录 1 网络连接 (unity NetWork与socket的对比) 2 登录界面 (登录协议与模型定制 及流程开发) 3 角色选择 (...
  • kepoon
  • kepoon
  • 2015年05月08日 17:28
  • 5539

直接用Socket TCP开发网络游戏(二)

01,如何解决SQL的注入问题 用这种方法的话就不会出现那种恶意输入的情况,代码实现如下: using System; using System.Collections.Generic; using...

flex与c#基于socket的实时互动网络游戏编程教程二

这节讲讲如何用flex与c#进行socket通讯。Flex端(当然你也完全可以用flash来写)使用import flash.net.Socket;包来做。通过ProgressEvent.SOCKET...
  • jwxkk
  • jwxkk
  • 2011年04月13日 21:10
  • 1547
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[Unity通信]一个基于socket的3DARPG网络游戏(二):消息分类处理和json的使用
举报原因:
原因补充:

(最多只允许输入30个字)