事件驱动的TCP协议Socket通信
事件驱动的TCP协议Socket通信
介绍
常规的Socket通信案例一般都是在某个线程中建立连接,然后用一个while(true)循环判断是或否有数据传输,但是这种方法有局限性。
1、收到消息在处理过程中无法接受新消息
2、线程容易堵塞
3、需要客户端服务端双发进行心跳响应
事件驱动的方式可以有效的提高Socket通信效率,让在一端有操作的同时,可以触发另一端的事件。
类似工具库:Cowboy.Socket、FastSocket
使用方法
1、打开VS,在Nuget里搜索SuperSocket
2、安装SuperSocket.Client和SuperSocket

3、服务端监听端口以及注册事件
AppServer appServer;
appServer = new AppServer();
            if (!appServer.Setup(int.Parse(txt_port.Text)))
            {
                SetMessage("Failed to Setup");
                return;
            }
            if (!appServer.Start())
            {
                SetMessage("Failed to Start");
                return;
            }
            else
            {
                SetMessage("开启监听");
            }
            //SuperSocket自定义了三个事件 ,连接事件,接收事件,关闭事件
            appServer.NewSessionConnected += appServer_NewSessionConnected;
            appServer.NewRequestReceived += appServer_NewRequestReceived;
            appServer.SessionClosed += appServer_SessionClosed;
4、服务端事件
void appServer_NewSessionConnected(AppSession session)
        {
            //有新连接的时候,添加记录  session.LocalEndPoint属性获取当前session的ip和端口号
            //AppSession 代表一个和客户端的逻辑连接,基于连接的操作应该定于在该类之中。你可以用该类的实例发送数据到客户端,接收客户端发送的数据或者关闭连接。
            //获取远程客户端的ip端口号
            ipAddress_Connect = session.RemoteEndPoint.ToString();
            ComboboxHandle(ipAddress_Connect, OperateType.Add);
            sessionList.Add(ipAddress_Connect, session);
            SetMessage(ipAddress_Connect + "已连接!");
        }
        /// <summary>
        /// 接收数据
        /// </summary>
        /// <param name="session"></param>
        /// <param name="requestInfo"></param>
        void appServer_NewRequestReceived(AppSession session, StringRequestInfo requestInfo)
        {
            //requestInfo.Key 是请求的命令行用空格分隔开的第一部分
            //requestInfo.Parameters 是用空格分隔开的其余部分
            //requestInfo.Body 是出了请求头之外的所有内容
            ipAddress_Receive = session.RemoteEndPoint.ToString();
            SetMessage("收到" + ipAddress_Receive + "数据: "+requestInfo.Key +" "+ requestInfo.Body);
        }
        /// <summary>
        /// 关闭连接
        /// </summary>
        /// <param name="session"></param>
        /// <param name="value"></param>
        void appServer_SessionClosed(AppSession session, SocketBase.CloseReason value)
        {
            ipAddress_Close = session.RemoteEndPoint.ToString();
            ComboboxHandle(ipAddress_Close, OperateType.Remove);
            sessionList.Remove(ipAddress_Close);
            SetMessage(ipAddress_Close + "已关闭连接!");
        }
5、客户端建立连接以及注册事件
SuperSocket.ClientEngine.AsyncTcpSession async=new AsyncTcpSession();
async.Connect(new IPEndPoint(IPAddress.Parse(ip), port));
async.Connected += client_Connected;
            // 发生错误的处理
            async.Error += client_Error;
            // 收到服务器数据事件
            async.DataReceived += client_DataReceived;
            async.Closed += client_Closed;
6、客户端事件
        void client_Error(object sender, ErrorEventArgs e)
        {
            Console.WriteLine(e.Exception.Message);
        }
        void client_Connected(object sender, EventArgs e)
        {
            Console.WriteLine("连接成功");
        }
        void client_DataReceived(object sender, DataEventArgs e)
        {
            string msg = Encoding.Default.GetString(e.Data);
            MessageBox.Show(msg.ToString());
            Console.WriteLine(msg);
        }
        void client_Closed(object sender, EventArgs e)
        {
            Console.WriteLine("连接断开");
        }
7、客户端/服务端发送消息
Client:
string message = "123";
            byte[] data = Encoding.Default.GetBytes(message);
            async.Send(data,0,data.Length);
8、其他
服务端接受消息必须要有回车加换行符:\r\n
源码地址
码云地址:https://gitee.com/PErobin/Socket.git
SVN地址:svn://gitee.com/PErobin/Socket
事件驱动的TCP协议Socket通信的更多相关文章
- 基于TCP协议Socket通信
		
服务器线程处理类 package demo4; import java.io.*; import java.net.Socket; /** * 服务器线程处理类 * @ClassName Server ...
 - python 之网络编程(基于TCP协议Socket通信的粘包问题及解决)
		
8.4 粘包问题 粘包问题发生的原因: 1.发送端需要等缓冲区满才发送出去,造成粘包(发送数据时间间隔很短,数据了很小,会合到一起,产生粘包),这样接收端,就难于分辨出来了,必须提供科学的拆包机制. ...
 - iOS-----使用CFNetwork实现TCP协议的通信
		
使用CFNetwork实现TCP协议的通信 TCP/IP通信协议是一种可靠的网络协议,它在通信的两端各建立一个通信接口,从而在通信的两端之间形成网络虚拟链路.一旦建立了虚拟的网络链路,两端的程序就可以 ...
 - python中基于tcp协议的通信(数据传输)
		
tcp协议:流式协议(以数据流的形式通信传输).安全协议(收发信息都需收到确认信息才能完成收发,是一种双向通道的通信) tcp协议在OSI七层协议中属于传输层,它上承用户层的数据收发,下启网络层.数据 ...
 - Linux下tcp协议socket的recv函数返回时机分析(粘包)
		
http://www.vckbase.com/index.php/wv/10http://blog.csdn.net/zlzlei/article/details/7689409 文章一: 当前在网络 ...
 - IOS 基于TCP的socket通信详解(原创)
		
最近在整理通信层相关知识,这篇文章是边整理边写的,有些地方可能不够准确,还请各位路过的大牛专家指出来.这次整理的socket通信是基于TCP的,实现方式是GCD形式,以下记录的都是些理论知识,方便自己 ...
 - 网络编程——TCP协议和通信
		
第1章 TCP通信 TCP通信同UDP通信一样,都能实现两台计算机之间的通信,通信的两端都需要创建socket对象. 区别在于,UDP中只有发送端和接收端,不区分客户端与服务器端,计算机之间可以任意地 ...
 - 基于tcp的socket通信
		
# socket # socekt是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,socket其实就是一个门面模式,它 # 把复杂的tcp/ip协议族隐藏在socket接 ...
 - 为何基于tcp协议的通信比基于udp协议的通信更可靠?
		
tcp协议一定是先建好双向链接,发一个数据包要得到确认才算发送完成,没有收到就一直给你重发:udp协议没有链接存在,udp直接丢数据,不管你有没有收到. TCP的可靠保证,是它的三次握手双向机制,这一 ...
 
随机推荐
- dfs(学姐的红包)
			
链接:https://ac.nowcoder.com/acm/contest/3402/I 盼啊,盼啊,伴随着时钟的敲响,我们即将迎来了美好的传统佳节-春节.为了给新年增添浓浓节日气息,师弟师妹 ...
 - 【C语言】输入一个正整数,判断其是否为素数
			
素数的定义: 素数(prime number)又称质数,有无限个. 素数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数,这样的数称为素数.代码1: #include<stdio.h& ...
 - php7 Memcached
			
PHP7 Memcached 扩展 wget https://codeload.github.com/websupport-sk/pecl-memcache/zip/php7/pecl-memcach ...
 - Java入门笔记 03-面向对象(下)
			
介绍:除了前面介绍的关于类.对象的基本语法之外,下面继续介绍Java面向对象的特性. 一. 包装类: 从JDK 1.5以后,Java就提供了自动装箱和自动拆箱操作,即: 自动装箱:将一个基本类型的变量 ...
 - 探讨 Git 代码托管平台的若干问题
			
关于 Git 版本控制软件种类繁多,维基百科收录的最早的版本控制系统是 1972 年贝尔实验室开发的 Source Code Control System.1986 年 Concurrent Vers ...
 - python学习笔记:分支 与 循环
			
if 语句 if 条件: ...... # 条件为真的时候,执行缩进的代码 if 条件: ...... # 条件为真的时候执行 else: ...... # 条件为假的时候执行 if 条件1: ... ...
 - PyQt5四大布局方式
			
1.绝对布局方式'''绝对布局方式,通过move的XY坐标方式来控制控件的位置'''from PyQt5.QtWidgets import *import sys,math class absolut ...
 - 201771010135杨蓉庆《面向对象程序设计(java)》第二周学习总结
			
第一部分:理论知识学习部分 3.1 标识符:由字母.下划线.美元符号和数字组成, 且第一个符号不能为数字,可用作:类名.变量名.方法名.数组名.文件名等.有Hello.$1234.程序名.www_12 ...
 - 树莓派 Ubuntu mate 16.04 下开启vncserver(自动启动+改分辨率)
			
树莓派 Ubuntu mate 16.04 下开启vncserver(自动启动+改分辨率) 参考博文:https://blog.csdn.net/Mr_dhy/article/details/8282 ...
 - Oracle常用SQL时间函数
			
1.查询当前日期和时间 select sysdate from dual; 2.查询本月最后一天 select last_day(sysdate) from dual; 3.查询前后多少月 ) fro ...