事件驱动的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 ...