• Unity中引入Supersocket.ClientEngine并测试


    在使用Supersocket Server的过程中,发现Server是不支持.net 3.5的.


    1.Server端中的几个Command:

     1 namespace SuperSocketProtoServer.Protocol.Command
     2 {
     3     public class CallMessage : CommandBase<ProtobufAppSession, ProtobufRequestInfo>
     4     {
     5         public override void ExecuteCommand(ProtobufAppSession session, ProtobufRequestInfo requestInfo)
     6         {            
     7             Console.WriteLine("CallMessage:{0}", requestInfo.Body.CallMessage.Content);
     8             var backMessage = global::SuperSocketProtoServer.Pack.BackMessage.CreateBuilder().SetContent("Hello I am from C# server by SuperSocket")
     9                 .Build();
    10 
    11             var message = DefeatMessage.CreateBuilder().SetType(DefeatMessage.Types.Type.BackMessage)
    12                 .SetBackMessage(backMessage).Build();
    13             using (var stream = new MemoryStream())
    14             {
    15                 CodedOutputStream cos = CodedOutputStream.CreateInstance(stream);
    16                 cos.WriteMessageNoTag(message);
    17                 cos.Flush();
    18                 byte[] data = stream.ToArray();
    19                 session.Send(new ArraySegment<byte>(data));
    20             }
    21         }
    22     }
    23 }
    24 
    25 namespace SuperSocketProtoServer.Protocol.Command
    26 {
    27     public class BackMessage : CommandBase<ProtobufAppSession, ProtobufRequestInfo>
    28     {
    29         public override void ExecuteCommand(ProtobufAppSession session, ProtobufRequestInfo requestInfo)
    30         {
    31             Console.WriteLine("BackMessage:{0}", requestInfo.Body.BackMessage.Content);
    32         }
    33     }
    34 }
    35 
    36 namespace SuperSocketProtoServer.Protocol.Command
    37 {
    38     public class PersonMessage:CommandBase<ProtobufAppSession, ProtobufRequestInfo>
    39     {
    40         public override void ExecuteCommand(ProtobufAppSession session, ProtobufRequestInfo requestInfo)
    41         {
    42             Console.WriteLine("Recv Person Message From Client.");
    43             Console.WriteLine("person's id = {0}, person's name = {1}, person's sex = {2}, person's phone = {3}", 
    44                 requestInfo.Body.PersonMessage.Id, 
    45                 requestInfo.Body.PersonMessage.Name, 
    46                 requestInfo.Body.PersonMessage.Sex, 
    47                 requestInfo.Body.PersonMessage.Phone);
    48 
    49             var person = Pack.PersonMessage.CreateBuilder().SetAge(58).SetId(333)
    50                 .SetName("native .net to unity3d message").SetSex(Pack.PersonMessage.Types.Sex.Male).SetPhone("+86 110")
    51                 .Build();
    52             var message = DefeatMessage.CreateBuilder().SetType(DefeatMessage.Types.Type.PersonMessage)
    53                 .SetPersonMessage(person).Build();
    54             using (var stream = new MemoryStream())
    55             {
    56                 CodedOutputStream cos = CodedOutputStream.CreateInstance(stream);
    57                 cos.WriteMessageNoTag(message);
    58                 cos.Flush();
    59                 byte[] data = stream.ToArray();
    60                 session.Send(new ArraySegment<byte>(data));
    61             }
    62         }
    63     }
    64 }
    View Code

    2.Client(unity3d)端中的代码:

     1 using System;
     2 using System.IO;
     3 using System.Net;
     4 using Google.ProtocolBuffers;
     5 using Pack;
     6 using SuperSocket.ClientEngine;
     7 using SuperSocketProtoClient.Protocol;
     8 using UnityEngine;
     9 
    10 public class SupersocketClientHelper : SingletonGeneric<SupersocketClientHelper>
    11 {
    12     private EasyClient client;
    13     private static SupersocketClientHelperStub stub = new GameObject("SupersocketClientHelperStub").AddComponent<SupersocketClientHelperStub>();
    14 
    15     private SupersocketClientHelper()
    16     {
    17         
    18     }
    19 
    20     public void Initialize()
    21     {
    22         client = new EasyClient();
    23         client.Initialize(new ProtobufReceiveFilter(), packageInfo =>
    24         {
    25             switch (packageInfo.Type)
    26             {
    27                 case DefeatMessage.Types.Type.BackMessage:
    28                     Debug.LogFormat("BackMessage:{0}", packageInfo.Body.BackMessage.Content);
    29                     break;
    30                 case DefeatMessage.Types.Type.CallMessage:
    31                     Debug.LogFormat("CallMessage:{0}", packageInfo.Body.CallMessage.Content);
    32                     break;
    33                 case DefeatMessage.Types.Type.PersonMessage:
    34                     Debug.Log("Recv Person Message From SuperSocket Server.");
    35                     Debug.LogFormat("person's id = {0}, person's name = {1}, person's sex = {2}, person's phone = {3}",
    36                         packageInfo.Body.PersonMessage.Id,
    37                         packageInfo.Body.PersonMessage.Name,
    38                         packageInfo.Body.PersonMessage.Sex,
    39                         packageInfo.Body.PersonMessage.Phone);
    40                     break;
    41             }
    42         });
    43 
    44         // .net35的SuperSocket.ClientEngine没有实现或者说不支持该函数
    45         //var flag = client.ConnectAsync(new DnsEndPoint("127.0.0.1", 2017));
    46         client.BeginConnect(new DnsEndPoint("127.0.0.1", 2017));
    47         client.Connected += (sender, args) =>
    48         {
    49             var callMessage = CallMessage.CreateBuilder()
    50                 .SetContent("Hello I am form C# client by SuperSocket ClientEngine").Build();
    51             var message = DefeatMessage.CreateBuilder()
    52                 .SetType(DefeatMessage.Types.Type.CallMessage)
    53                 .SetCallMessage(callMessage).Build();
    54 
    55             using (var stream = new MemoryStream())
    56             {
    57                 CodedOutputStream os = CodedOutputStream.CreateInstance(stream);
    58                 os.WriteMessageNoTag(message);
    59                 os.Flush();
    60                 byte[] data = stream.ToArray();
    61                 client.Send(new ArraySegment<byte>(data));
    62             }
    63 
    64             // 发送PersonMessage
    65             var personMessage = PersonMessage.CreateBuilder()
    66                 .SetId(123).SetAge(33).SetSex(PersonMessage.Types.Sex.Male).SetName("zstudio").SetPhone("110").Build();
    67             message = DefeatMessage.CreateBuilder().SetType(DefeatMessage.Types.Type.PersonMessage)
    68                 .SetPersonMessage(personMessage).Build();
    69             using (var stream = new MemoryStream())
    70             {
    71                 CodedOutputStream cos = CodedOutputStream.CreateInstance(stream);
    72                 cos.WriteMessageNoTag(message);
    73                 cos.Flush();
    74                 byte[] data = stream.ToArray();
    75                 client.Send(new ArraySegment<byte>(data));
    76             }
    77         };
    78     }
    79 
    80     public void Destory()
    81     {
    82         client.Close();
    83     }
    84 }
    85 
    86 internal sealed class SupersocketClientHelperStub : MonoBehaviour
    87 {
    88     private void Awake()
    89     {
    90         DontDestroyOnLoad(this);
    91     }
    92 
    93     private void OnDestroy()
    94     {
    95         SupersocketClientHelper.Instance.Destory();
    96     }
    97 }
    View Code

    3.消息使用Google.ProtocolBuffers:

    message CallMessage
    {
    	optional string content = 1;
    }
    
    message BackMessage
    {
    	optional string content = 1;
    }
    
    message PersonMessage
    {
    	required int32 id = 1;
    	required string name = 2;
    	enum Sex
    	{
    		Male = 1;
    		Female = 2;
    	}
    	required Sex sex = 3 [default = Male];
    	required uint32 age = 4;
    	required string phone = 5;
    }
    
    import "BackMessage.proto";
    import "CallMessage.proto";
    import "PersonMessage.proto";
    
    message DefeatMessage
    {
    	enum Type
    	{
    		CallMessage = 1;
    		BackMessage = 2;
    		PersonMessage = 3;
    	}
    	required Type type = 1;
    	optional CallMessage callMessage = 2;
    	optional BackMessage backMessage = 3;
    	optional PersonMessage personMessage = 4;
    }
    View Code

     

  • 相关阅读:
    Chrome滚动条透明的问题
    JavaScript版的简单动画
    关于AS3的事件移除释疑
    JavaScript的Hook
    JavaScript正则表达式的零宽断言
    webgame开发中的文件解密
    GMIC2011:熊俊谈从数据看iOS移动应用开发
    世上最伟大的十个公式
    OS X Lion 正式版制作安装盘全新安装方法说明
    市面上VB.NET的书比较少,推荐一本,下载地址在下面!
  • 原文地址:https://www.cnblogs.com/linxmouse/p/7932399.html
Copyright © 2020-2023  润新知