文档章节

使用 weaving-socket教学-提升,像调用方法一样通信传输

dreamsfly
 dreamsfly
发布于 2017/05/06 12:13
字数 1319
阅读 1090
收藏 6

大多数的通信架构只保证里基本数据的传输,在大家编写的过程中还要自己自己编码或解码等内容。然后把数据用一大推的判断来分割起来,保证运行到想要的代码段。那么使用weaving-socket架构的朋友们,你们有福了,现在你只需要定义好方法名称增加一个修饰就可以直接像调用方法类似的手段运行到你只定的方法中。这很简单愉快。

首先把项目下载下来: http://git.oschina.net/dreamsfly900/universal-Data-Communication-System-for-windows

还有一个同胞项目

.NET Core的weaving-socket项目

http://git.oschina.net/dreamsfly900/weaving-socket-core 

第一步服务端编写:

新版本更新后MyInterface 变更命名WeaveBase。TCPCommand变更命名,WeaveTCPCommand请务必注意。

首先我们需要新建一个类库项目,注意是类库。起个名字content_manage,然后引用项目 MyInterface。

将你新建的类,继承MyInterface.TCPCommand ,实现MyInterface.TCPCommand中的必须要实现的方法。

 public class content_manage : MyInterface.TCPCommand
    {
        public override void Bm_errorMessageEvent(Socket soc, _baseModel _0x01, string message)
        {
             //错误异常事件,message为错误信息,soc为产生异常的连接
        }

        public override byte Getcommand()
        {
           //此CLASS的实例,代表的指令,指令从0-254,0x9c与0xff为内部指令不能使用。
            //0x01的意思是,只要是0x01的指令,都会进入本实例进行处理
            return 0x01;
        }

        public override bool Run(string data, Socket soc)
        {
//此事件是接收事件,data 是String类型的数据,soc是发送人。
            return true;
        }

        public override void TCPCommand_EventDeleteConnSoc(Socket soc)
        {
             //此事件是当有人中断了连接,此事件会被调用
        }

        public override void TCPCommand_EventUpdataConnSoc(Socket soc)
        {
               //此事件是当有人新加入了连接,此事件会被调用
        }
    }

里面有一个 public override bool Run(string data, Socket soc)的接收事件,发送的数据都会经过这里方法。题目说了,要自己可以定义方法的,那要怎么办呢?

比如我想在客户端看到当前有多少人在线。那么我们一般定义一个方法名:getnum。

那么在这里怎么办呢?看代码

 [InstallFun("forever")]
        public void getnum(Socket soc, _baseModel _0x01)
        {
            int num = 9987;//假设我人数为9987
            SendRoot<int>(soc, 0x01, _0x01.Request, num, 0, _0x01.Token);
           //发送人数给客户端
   //参数1,发送给客户端对象,参数2,发送给客户端对应的方法,参数3,人数的实例,参数4,此处无作用,参数5,客户端此次token
        }

只需要这样定义就可以了,[InstallFun("forever")] 代表了,此方法永久有效。

当然还有对应的 [InstallFun("once")]代表了,此方法只能被调用一次,立刻销毁。

   public void getnum(Socket soc, _baseModel _0x01),方法名可以随意更改,参数和返回值为固定的。

那么我们怎么告诉客户端我们有多少人呢?

SendRoot<int>(soc, 0x01, _0x01.Request, num, 0, _0x01.Token);就是这个方法了。

参数1,发送给客户端对象,参数2,发送给客户端对应的方法,参数3,人数的实例,参数4,此处无作用,参数5,客户端此次token

这样就完成了。完整代码:

public class content_manage : MyInterface.TCPCommand
    {
        public override void Bm_errorMessageEvent(Socket soc, _baseModel _0x01, string message)
        {
             
        }
        [InstallFun("forever")]
        public void getnum(Socket soc, _baseModel _0x01)
        {
            int num = 9987;
            SendRoot<int>(soc, 0x01, _0x01.Request, num, 0, _0x01.Token);
        }
        public override byte Getcommand()
        {
            return 0x01;
        }

        public override bool Run(string data, Socket soc)
        {
            return true;
        }

        public override void TCPCommand_EventDeleteConnSoc(Socket soc)
        {
             
        }

        public override void TCPCommand_EventUpdataConnSoc(Socket soc)
        {
             
        }
    }

 

然后对着你的项目右键-》属性-》生成事件-》后期生成事件命令行

填写copy $(TargetFileName) $(SolutionDir)\智信构建结构\bin\Debug\command

然后编译此代码,后会生成content_manage.dll的文件会自动进入

架构中通信服务端运行器项目的 command 目录中,可以先生成一边通信服务端运行器项目,

 在Debug目录中看一看有没有command 目录,没有的话,手动建一个。

然后运行 通信服务端运行器项目 , 

选择TCPSOKET,填写好端口号,点击添加监听,然后点击加载服务器插件,就开始运行了。

 

第二步客户端:

新建一个winform项目,引用MyInterface与TCPclient项目。

在界面上加一个按钮:

  public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        P2Pclient p2pc = new P2Pclient(false);//初始化
        private void Form1_Load(object sender, EventArgs e)
        {
            p2pc.receiveServerEvent += P2pc_receiveServerEvent;//接收数据事件
            p2pc.timeoutevent += P2pc_timeoutevent;//超时(掉线)事件
            p2pc.start("127.0.0.1", 8989, false);//11002 是网关的端口号,刚才WEB网关占用了11001,我改成11002了
            p2pc.AddListenClass(this);//这是表示  [InstallFun("forever")]的方法,在哪个类中,全部加载出来。
           
        }
        [InstallFun("forever")]//客户端也支持像服务端那样写,刚才看懂返回的内容也是getnum,所以客户端也要把方法命名getnum
        public void getnum(System.Net.Sockets.Socket soc, _baseModel _0x01)//服务端返回内容调用的方法getnum,所以命名为getnum。
        {
            MessageBox.Show(_0x01.GetRoot<int>().ToString());//弹出返回值
          
        }
        private void P2pc_timeoutevent()
        {
            if (!p2pc.Isline)
            {
                p2pc.Restart(true);//断线重连
            }
        }

        private void P2pc_receiveServerEvent(byte command, string text)
        {
           
        }
     
        private void button1_Click(object sender, EventArgs e)
        {
            //在加个发送
            p2pc.Tokan = "随便写一个";
            p2pc.SendRoot<int>(0x01, "getnum", 0,0);//调用服务端方法getnum,是服务端的方法。
            //这样就可以了,我们试试
        }
    }

写代码

 

 

© 著作权归作者所有

dreamsfly

dreamsfly

粉丝 31
博文 6
码字总数 12763
作品 3
郑州
CTO(技术副总裁)
私信 提问
dreamsfly/weaving-socket-core

#weaving-socket-core weaving-socket 架构的.net core跨平台版本 QQ交流群17375149 新版本更新: weaving-socket PC以及IOT,与安卓项目 点这里 2017-5-3更新新版本。老版本在多协议公用业务...

dreamsfly
2017/05/05
0
0
dreamsfly/weaving-socket

图文版教程:https://my.oschina.net/u/2476624/blog QQ交流群17375149 新版本更新: 2015-8-8 增加U3D游戏客户的通讯项目支持,并提供示例内容。 2017-5-3更新新版本。老版本在多协议公用业务...

dreamsfly
2015/12/21
0
0
Unity3D游戏,TCP,WEBCOSKT,HTTP通信架构-weaving-socket

项目简介 WMQ 产品单独拉出一个项目,可关注 https://gitee.com/dreamsfly900/WMQ U3d太空大战,图文教程 1:http://blog.csdn.net/superlinmeng/article/details/78618298 2:http://blog.c......

dreamsfly
2016/06/22
8.8K
12
gRPC学习笔记——(一)学习铺垫

(如有不全,烦请指出,后续不断跟进修正) 一、什么是RPC?为什么要学习RPC?有没有RPC的代替品? ——今后所有的学习笔记都将以此三问起头。关于编程,个人觉得由此三问,可助于编码人更加...

志明丶
2017/11/29
0
0
HTTP,TCP, socket,RPC 与gRPC都是啥?

TCP/HTTP与socket 首先回顾下计算机网络的五(七)层协议:物理层、数据链路层、网络层、传输层、(会话层、表示层)和应用层。那么从协议上来讲: TCP是传输层协议,主要解决数据如何在网络中传...

RichardBillion
2018/04/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

axios 使用步骤很简单,首先在前端项目中,引入 axios:

  前端网络访问,主流方案就是 Ajax,Vue 也不例外,在 Vue2.0 之前,网络访问较多的采用 vue-resources,Vue2.0 之后,官方不再建议使用 vue-resources ,这个项目本身也停止维护,目前建...

SEOwhywhy
19分钟前
2
0
c++ 创建对象的三种方法

c++有三种方法创建对象 结合代码来看 1 #include <iostream> 2 using namespace std; 3 class Test { 4 5 private: 6 public: 7 add() 8 { 9 ......

天王盖地虎626
33分钟前
1
0
ant 中的fileset include等拷贝

拷贝一个目录到指定目录下 例:<copy todir="${basedir}/new"> <fileset dir="${basedir}/old"> <include name="appgen" /> <include name="appgen/" /> <include name=appgen/**" /> <incl......

shzwork
39分钟前
2
0
react-jianshu项目的创建

创建项目 1、github上创建仓库react-jianshu 2、将项目克隆到本地git clone git@github.com:startjcu/react-jianshu.git 3、在当前目录(项目目录的上级目录)下执行create-react-app react-...

星闪海洋
48分钟前
2
0
OSChina 周二乱弹 —— 小哥哥,你可以教我写代码吗

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @nnnm: 生活大爆炸,结束了,这部陪伴了漫长时间的情景喜剧,最终是以诺贝尔奖和大团圆收尾的。虽然,不算精彩,但也是温馨。而少年谢尔顿的...

小小编辑
今天
663
13

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部