热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

supersocke接收不到数据_使用SuperSocket框架实现简单的服务器和客户端网络通信【二】...

上次把服务器端的代码稍微写了一下,能够正常通信,并没有去做客户端。今天把客户端的代码稍微写了一下,包括协议的发送接收。SuperSocke

上次把服务器端的代码稍微写了一下,能够正常通信,并没有去做客户端。今天把客户端的代码稍微写了一下,包括协议的发送接收。

SuperSocket提供了接收客户端协议的一个类,我们只需进行重写一下,就可以接收来自客户端的数据了。

SuperSocket协议类的代码

using SuperSocket.SocketBase.Command;

using SuperSocket.SocketBase.Protocol;

using System;

namespace WpfSuperSocket.SuperSocket

{

public class TestCommand1 : CommandBase

{

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);

});

}

}

}

用于和服务器通信

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 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通信代码

///

/// 向服务器发送消息,并接收来自服务器的回复消息

///

/// 发送给服务器的字节

/// 服务器返回给客户端的回调数据

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());

}

}

///

/// Socket 消息回传

///

///

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;

}

}

///

/// 发送给服务器的数据

///

/// 服务器端,协议类名

/// 发送给服务器的json数据

/// 服务器返回给客户端的数据

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数据存储

using System.Collections.Generic;

public class DMNetForm

{

public DMNetForm()

{

}

public DMNetForm(int pact)

{

fromdic.Add("action" ,pact);

}

Dictionaryfromdic=new Dictionary();

public Dictionary 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);

}

}

客户端协议脚本

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

{

Debug.Log(jd["address"][i].ValueAsString());

}

for (int i = 0; i

{

Debug.Log(jd["links"][i]["name"].ValueAsString());

}

});

}

}

Demo下载

链接:http://pan.baidu.com/s/1o7KnnvG 密码:y325

最后编辑:2017-03-30作者:shengruqing

这个作者貌似有点懒,什么都没有留下。

捐 赠如果您觉得这篇文章有用处,请支持作者!鼓励作者写出更好更多的文章!



推荐阅读
  • Android获取app应用程序大小的方法
    Android获取app应用程序大小的方法-Android对这种方法进行了封装,我们没有权限去调用这个方法,所以我们只能通过AIDL,然后利用Java的反射机制去调用系统级的方法。 ... [详细]
  • 本文介绍了pack布局管理器在Perl/Tk中的使用方法及注意事项。通过调用pack()方法,可以控制部件在显示窗口中的位置和大小。同时,本文还提到了在使用pack布局管理器时,应注意将部件分组以便在水平和垂直方向上进行堆放。此外,还介绍了使用Frame部件或Toplevel部件来组织部件在窗口内的方法。最后,本文强调了在使用pack布局管理器时,应避免在中间切换到grid布局管理器,以免造成混乱。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • 使用eclipse创建一个Java项目的步骤
    本文介绍了使用eclipse创建一个Java项目的步骤,包括启动eclipse、选择New Project命令、在对话框中输入项目名称等。同时还介绍了Java Settings对话框中的一些选项,以及如何修改Java程序的输出目录。 ... [详细]
  • REVERT权限切换的操作步骤和注意事项
    本文介绍了在SQL Server中进行REVERT权限切换的操作步骤和注意事项。首先登录到SQL Server,其中包括一个具有很小权限的普通用户和一个系统管理员角色中的成员。然后通过添加Windows登录到SQL Server,并将其添加到AdventureWorks数据库中的用户列表中。最后通过REVERT命令切换权限。在操作过程中需要注意的是,确保登录名和数据库名的正确性,并遵循安全措施,以防止权限泄露和数据损坏。 ... [详细]
  • Iamtryingtocreateanarrayofstructinstanceslikethis:我试图创建一个这样的struct实例数组:letinstallers: ... [详细]
  • 使用C++编写程序实现增加或删除桌面的右键列表项
    本文介绍了使用C++编写程序实现增加或删除桌面的右键列表项的方法。首先通过操作注册表来实现增加或删除右键列表项的目的,然后使用管理注册表的函数来编写程序。文章详细介绍了使用的五种函数:RegCreateKey、RegSetValueEx、RegOpenKeyEx、RegDeleteKey和RegCloseKey,并给出了增加一项的函数写法。通过本文的方法,可以方便地自定义桌面的右键列表项。 ... [详细]
  • 本文介绍了解决mysql 5.1启动问题的方法,通过修改my.ini文件中的相关配置,包括innodb_data_home_dir和skip-innodb等,可以解决启动问题。同时还介绍了如何调整内存池来存储metadata信息。 ... [详细]
  • 如何优化Webpack打包后的代码分割
    本文介绍了如何通过优化Webpack的代码分割来减小打包后的文件大小。主要包括拆分业务逻辑代码和引入第三方包的代码、配置Webpack插件、异步代码的处理、代码分割重命名、配置vendors和cacheGroups等方面的内容。通过合理配置和优化,可以有效减小打包后的文件大小,提高应用的加载速度。 ... [详细]
author-avatar
ub皓祉
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有