事件驱动的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的可靠保证,是它的三次握手双向机制,这一 ...
随机推荐
- python csv 数据切割定制jmeter数据
需求压测随机抽取10w数据中自定义区间的指定数量数据进行压测: jmeter csv/txt配置: 需要获取{data: [${myList}] } jmeter需要数据类型 获取展读取csv数据 ...
- coturn服务器配置中英对比
coturn服务器配置中英对比 默认配置位置 /etc/turnserver.conf # RFC5766-TURN-SERVER configuration file # RFC5766-TURN- ...
- SQLite - C/C++接口 API(二)
1.打开数据库 SQLITE_API int sqlite3_open16( const void *filename, /* Database filename (UTF-16) */ sqlite ...
- jq 常用语句
//jq post 请求 $.post("demo_ajax_gethint.asp",{suggest:txt},function(result){ }); // jq get ...
- Java 11 New Features
前言 北京时间 2018年9 月 26 日,Oracle 官方宣布 Java 11 正式发布.这是 Java 大版本周期变化后的第一个长期支持版本,非常值得关注.从官网即可下载, 最新发布的 Java ...
- tkinter学习(1)
1.hit_me的一个简单tk窗口学习1.1 代码: import tkinter as tk win = tk.Tk() win.title('my first window') #定义标题,如果未 ...
- 吴裕雄 python 神经网络——TensorFlow TFRecord样例程序
import numpy as np import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_dat ...
- springboot pom问题及注解
springboot pom不需要指定版本号 springboot会自己管理版本号 <!-- 支持热部署 --> <dependency> <groupId>org ...
- 单播反向路径转发uRPF
uRPF将数据包的源地址和存储在转发信息库(FIB)中的信息进行对照,以判定数据包的合法性.FIB是Cisco CEF技术中的一张表,包含从路由表中复制过来的转发信息,可以将其视为路由表的镜像,FIB ...
- Servlet里面request处理外部POST请求的输入流的工具类
package etcom.servlet; import java.io.BufferedReader; import java.io.IOException; import java.io.Inp ...