查看: 34920|回复: 55
收起左侧

[旅行的拾荒者] 使用SuperSocket框架实现简单的服务器和客户端网络通信【二】

  [复制链接]

[旅行的拾荒者] 使用SuperSocket框架实现简单的服务器和客户端网络通信【二】  [复制链接]

旅行的拾荒者 发表于 2017-3-30 15:13:48 [显示全部楼层] 回帖奖励 |倒序浏览 |阅读模式 回复:  55 浏览:  34920
上次把服务器端的代码稍微写了一下,能够正常通信,并没有去做客户端。今天把客户端的代码稍微写了一下,包括协议的发送接收。
SuperSocket提供了接收客户端协议的一个类,我们只需进行重写一下,就可以接收来自客户端的数据了。
SuperSocket协议类的代码
[AppleScript] 纯文本查看 复制代码
using SuperSocket.SocketBase.Command;
using SuperSocket.SocketBase.Protocol;
using System;

namespace WpfSuperSocket.SuperSocket
{
    public class TestCommand1 : CommandBase<SHZSession, StringRequestInfo>
    {
        public override void ExecuteCommand(SHZSession session, StringRequestInfo requestInfo)
        {
            MainWindow.instance.Dispatcher.Invoke((Action)delegate ()
            {
                //显示在UI面板上
                MainWindow.instance.InfoLbl.Content += "\r\n" + requestInfo.Body + "\r\n";

                string TestJson = "{\"action\":10001,\"serverId\":1,\"playerId\":1001,\"address\":{\"street\":\"HongQiao road.\",\"city\":\"Changning, Shanghai\",\"country\":\"China\"},\"links\":[{\"name\":\"Shihuangzhe\",\"url\":\"http://www.shihuangzhe.org\"},{\"name\":\"Shihuangzhe\",\"url\":\"http://www.shihuangzhe.org\"}]}";
                //向客户端发送数据
                session.Send(TestJson);
            });
        }
        
    }


}


用于和服务器通信
[AppleScript] 纯文本查看 复制代码
using LitJson;
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using UnityEngine;

public class DMNetControl : MonoBehaviour
{
    public delegate void RespondOfHttpJD(JsonData jsonStr);
    public delegate void RespondOfHttpDic(Dictionary<string, object> jsonDic);
    public static DMNetControl Instance;
    private Socket ClinetSocket;
    private const string Ip = "127.0.0.1";
    private const int Prot = 2017;
    void Awake()
    {
        Instance = this;
        ClinetSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        IPAddress ipAddress = IPAddress.Parse(Ip);
        IPEndPoint point = new IPEndPoint(ipAddress, Prot);
        ClinetSocket.Connect(point);
    }
    
    #region Socket通信代码
    /// <summary>
    /// 向服务器发送消息,并接收来自服务器的回复消息
    /// </summary>
    /// <param name="_strBytes">发送给服务器的字节</param>
    /// <param name="_respondFunction">服务器返回给客户端的回调数据</param>
    void ReceiveMessage(byte[] _strBytes, RespondOfHttpJD _respondFunction)
    {
        try
        {
            this.ClinetSocket.Send(_strBytes);
            if (_respondFunction != null)
            {
                _respondFunction(AsynRecive(ClinetSocket));
            }
        }
        catch (Exception ex)
        {
            Debug.LogError("写Error日志"+ex.ToString());
        }
    }

    /// <summary>
    /// Socket 消息回传
    /// </summary>
    /// <returns></returns>
    public JsonData AsynRecive(Socket socket)
    {
        try
        {
            byte[] msg = new byte[1024];
            var da = Encoding.UTF8.GetString(msg);
            int recv=socket.Receive(msg);
            //因为SuperSocket发送的数据带有\r\n换行符,所以在接收到数据的时候要进行特殊处理,
            //要把‘\r\n’去掉,否则json转换会出错
            string str = Encoding.UTF8.GetString(msg, 0, recv).Replace("\r\n", " ");
            JsonData jd = JsonMapper.ToObject(str);
            return jd;
        }
        catch (Exception ex)
        {
            socket.Close();
            return "Socket 消息回传,写Error日志" + ex.Message;
        }
    }
    /// <summary>
    /// 发送给服务器的数据
    /// </summary>
    /// <param name="_scriptName">服务器端,协议类名</param>
    /// <param name="_netForm">发送给服务器的json数据</param>
    /// <param name="respondFunction">服务器返回给客户端的数据</param>
    public void RequestOfSocket(string _scriptName, DMNetForm _netForm, RespondOfHttpJD respondFunction)
    {
        string jdStr = JsonMapper.ToJson(_netForm.GetSendObj);
        string jd = _scriptName + jdStr + "\r\n";
        Debug.LogError(jd);
        byte[] strBytes = Encoding.UTF8.GetBytes(jd);
        ReceiveMessage(strBytes, respondFunction);
    }
    #endregion
}


向服务器发送的json数据存储
[AppleScript] 纯文本查看 复制代码
using System.Collections.Generic;

public  class DMNetForm
{
    public DMNetForm()
    {
    }

    public DMNetForm(int pact)
    {
        fromdic.Add("action" ,pact);
    }
    Dictionary<string,object>fromdic=new Dictionary<string, object>(); 
    public Dictionary<string, object> GetSendObj { get {return fromdic;} }

    public void addField(string _key, object _value, int data = 0)
    {
        if (fromdic.ContainsKey(_key))
        {
            fromdic[_key] = _value;
            return;
        }
        fromdic.Add(_key,_value);
    }


}

客户端协议脚本
[AppleScript] 纯文本查看 复制代码
using LitJson;
using UnityEngine;
using UnityEngine.UI;

public class Client : MonoBehaviour
{
    public Text text;
    public InputField input;
    
    private DMNetForm netForm;
    
    public void Send()
    {
        //向服务器发送数据的格式。
        //服务器端,协议类名
        string scriptName = "TestCommand1 ";
        //协议号(和服务器约定好的)
        netForm=new DMNetForm(10001);
        //下面是给向服务器发送的数据
        netForm.addField("serverId",1);
        netForm.addField("playerId", 1001);
        //发送的json格式:TestCommand1 {"action":10001,"serverId":1,"playerId":1001}
        //====================================================================
        //接收来自于服务器回复的消息
        //接收的json格式: 
        /*
 {
  "action": 10001,
  "serverId": 1,
  "playerId": 1001,
  "address": {
    "street": "Science Park Road.",
    "city": "Suzhou, Jiangsu",
    "country": "China"
  },
  "links": [
    {
      "name": "Shihuangzhe",
      "url": "http://www.shihuangzhe.org"
    },
    {
      "name": "Shihuangzhe",
      "url": "http://www.shihuangzhe.org"
    }
  ]
}
         */
        DMNetControl.Instance.RequestOfSocket(scriptName,netForm, delegate (JsonData jd) {
            Debug.Log(jd["action"].ValueAsInt());
            Debug.Log(jd["serverId"].ValueAsInt());
            for (int i = 0; i < jd["address"].Count; i++)
            {
                Debug.Log(jd["address"][i].ValueAsString());
            }
            for (int i = 0; i < jd["links"].Count; i++)
            {
                Debug.Log(jd["links"][i]["name"].ValueAsString());
            }
        });
    }
}

Demo下载
游客,如果您要查看本帖隐藏内容请回复


Untiy3D新手交流群 158831907
使用SuperSocket框架实现简单的服务器和客户端网络通信【二】 | 拾荒者 https://www.noobdev.cn/?p=613

评分

参与人数 2泰斗币 +1 热心值 +2 收起 理由
admin + 1 + 1
冷筱曦 + 1 很给力!

查看全部评分

+1
34968°C
55
  • isygqn1
  • Joy的池塘
  • TAO_Y
  • 开心丶
  • 逆爱Blue
过: 他们
因分享而快乐,学习以自强!
isygqn1 发表于 2017-3-30 21:47:20 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
因分享而快乐,学习以自强!
Joy的池塘 发表于 2017-3-31 11:59:29 显示全部楼层
看起来蛮清晰的,还不错。。。
因分享而快乐,学习以自强!
TAO_Y 发表于 2017-3-31 12:51:31 显示全部楼层
提示: 该帖被管理员或版主屏蔽
因分享而快乐,学习以自强!
开心丶 发表于 2017-3-31 13:31:54 显示全部楼层
强  感谢
因分享而快乐,学习以自强!
逆爱Blue 发表于 2017-3-31 17:41:43 显示全部楼层
看起来蛮清晰的,还不错。。。
因分享而快乐,学习以自强!
oxford561 发表于 2017-3-31 20:34:35 显示全部楼层
谢谢分享,学习了
因分享而快乐,学习以自强!
风的幻者 发表于 2017-4-1 10:47:29 显示全部楼层
赞一下哈!~~~~学习了 谢谢@~~~~~~
因分享而快乐,学习以自强!
阿莫 发表于 2017-4-1 12:29:11 显示全部楼层
学习学习  下载下来喽喽
因分享而快乐,学习以自强!
阿莫 发表于 2017-4-1 14:04:59 显示全部楼层
下载看看  学习中
因分享而快乐,学习以自强!
piuabc 发表于 2017-4-6 09:26:29 显示全部楼层
不错的Demo,对我刚开始接触有很好的帮助。
因分享而快乐,学习以自强!
zgbjmy2008 发表于 2017-4-7 21:37:31 显示全部楼层
楼主,你是一个大好人!!
因分享而快乐,学习以自强!
xenost 发表于 2017-4-7 21:46:49 显示全部楼层
好东西,感谢楼主分享
因分享而快乐,学习以自强!
爱殇 发表于 2017-4-10 23:06:17 显示全部楼层
看着很不错啊
因分享而快乐,学习以自强!
sfbirp 发表于 2017-4-17 11:23:50 显示全部楼层
正好学习一下,感谢
因分享而快乐,学习以自强!
1234下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

VR/AR版块|Unity3d|Unreal4|新手报道|小黑屋|站点地图|沪ICP备14023207号-9|【泰斗社区】-专注互联网游戏和应用的开发者平台 ( 沪ICP备14023207号-9 )|网站地图

© 2001-2013 Comsenz Inc.  Powered by Discuz! X3.4

1
QQ