[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通信]一个基于socket的3DARPG网络游戏(一):建立连接和事件分发

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

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

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

Unity3d中的Tcp socket通信(开源)

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和...
  • hiramtan
  • hiramtan
  • 2017年05月22日 10:19
  • 2291

Unity3d网络游戏Socket通讯

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

ARPG即时同步服务器+客户端源码发放

Arpg同步对于热衷于游戏开发的新手来说可能还是一个略带神秘色彩的的东西。 我前几天研究了下写了个demo,本来是给一个Arpg外包项目用的,可能现在用不到了,所以现在把源码发出来。 这完全是一套以事...
  • meichen8050753
  • meichen8050753
  • 2013年08月11日 01:57
  • 2764

Unity3D ARPG游戏开发《最初的幻想》之强化敌人AI,折腾的GUI

 昨天搞了死亡的完善与提示栏的工作。今天的话,首先再升级一下敌人的Ai吧。毕竟在玩家在敌人身后使劲攻击的话,这敌人也都不会有反应的,太不合理了。 打开Enemy脚本,在最前面“变量”标签中,先...
  • donghong2008
  • donghong2008
  • 2014年08月14日 09:49
  • 1331

Unity使用Socket与后台连接,包含Json的读写

第一篇真正意义的博文,就从最近两天学习的东西开始吧
  • n_moling
  • n_moling
  • 2017年05月09日 17:10
  • 1167

同时开发两款H5的ARPG游戏的设计和实践

前话这里主要是想记录一下自己的想法,以及一些设计思想,然后在实际开发过程中,是否会遇到一些自己所想不到的事情,以及怎么的解决过程。事实上,写这种文章,远比写技术性的文章难多了,个人感觉还很难写好。这里...
  • sujun10
  • sujun10
  • 2017年05月21日 14:24
  • 2581

1.蛮牛ARPG网络实战-客户端 服务端测试

using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Ne...
  • u013108312
  • u013108312
  • 2017年04月23日 19:29
  • 529

基于Socket的游戏服务器通信框架的设计与实现

博客地址:blog.liujunliang.com.cn开发工具:VS2017、Unity2017本文介绍使用Socket/TCP来开发客户端与服务器端通信框架博主使用过PhotonServer,由于...
  • qq_33747722
  • qq_33747722
  • 2017年11月13日 09:19
  • 278
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[Unity通信]一个基于socket的3DARPG网络游戏(二):消息分类处理和json的使用
举报原因:
原因补充:

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