在日常碰到的项目中,经常碰到需要收发二进制数据的场景。比如要发送一张图片,要发送一首音频,要发送一个压缩包,要发送一个视频等等。这些数据并非字符串,而是二进制字节流数据。那么如何如何使用SharpSocket来收发此类数据呢?其中要掌握的关键点是什么呢?

TCP服务端的实现

设置授权

第一步:在引用了SharpSocket.dll之后,调用SharpSocket方法之前,一定要先通过下面代码来设置授权信息,如果是试用版,直接输入Test即可。

1
KeyMgr.SetKey("Test", "Test");

获取ITcpServer的示例

从之前的一篇博文中,我们介绍了一张图看懂SharpSocket,从那篇文章我们可以看出,SharpSocket通过ITCPServer来实现tcp服务端。那么如何获取该接口的示例,从而使用该接口提供的各个方法呢?请看下面的代码:

1
2
3
4
if (tcpServerIntance == null)
{
tcpServerIntance = SocketFactory.GetBinaryTcpServer(8888, new BinaryFormattHelper());
}

在上段代码中,通过工厂类获取了二进制数据流的tcp服务接口的示例,里边通过传入监听的端口号,从而监听该端口。同时传入关键的BinaryFormatHelper类。该类非常关键,SharpSocket通过该帮助类,来解析收发的数据流,将其拆分为消息头和消息体。它的定义如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
//实现了IBinaryFormatHelper接口
public class BinaryFormattHelper : IBinaryFormatHelper
{
public int DataHeaderLength
{
get { return 8; }
}

public int ParseDataBodyLength(byte[] head)
{
return BitConverter.ToInt32(head, 0);
}
}

绑定事件

获取到了ITCPServer的示例后,为其绑定各个事件,比如客户端连接,断开连接,收到数据等等。这里要注意关键的是收到数据的事件MessageReceived。每当引擎按照BinaryFormattHelper解析到了一帧数据后,就会将数据上交给该事件的响应函数上,您就可以进行下一步的分析了。比如解压,解密等后续操作。

1
2
3
4
this.tcpServerIntance.ClientCountChanged += new SGDelegate<int>(ClientCountChanged);
this.tcpServerIntance.ClientConnected += new SGDelegate<System.Net.IPEndPoint>(ClientConnected);
this.tcpServerIntance.ClientDisconnected += new SGDelegate<System.Net.IPEndPoint>(ClientDisconnected);
this.tcpServerIntance.MessageReceived += new SGDelegate<IPEndPoint, byte[]>(MessageReceived);

启动监听

处理完上述步骤后,开始监听了,服务就正式启动了。如下:

1
tcpServerIntance.Initialize();

断开连接

您可以随时断开所有连接,即停止服务。

1
2
tcpServerIntance.CloseAllClient();
tcpServerIntance.Dispose();

服务端主动向指定的客户端推送数据

您可以随时向任意的客户端连接发送数据,这通常被称为推送数据。代码如下:

1
2
3
byte[] resMessage = new byte[100];
....//赋值
tcpServerIntance.PostDataToClient(client, resMessage);

其中client为IPEndPoint类型,即包含IP和端口号。就是一个特定的客户端tcp连接。

TCP客户端的实现

设置授权

第一步:在引用了SharpSocket.dll之后,调用SharpSocket方法之前,一定要先通过下面代码来设置授权信息,如果是试用版,直接输入Test即可。

1
KeyMgr.SetKey("Test", "Test");

获取ITCPClient示例

第二步:获取ITCPClient的示例。代码如下:

1
2
//获取tcp客户端接口实例
clientInstance = SocketFactory.GetBinaryTcpClient(this.txtIP.Text, int.Parse(this.txtPort.Text), new BinaryFormattHelper());

绑定事件

第三步:绑定相关的事件,比如连接建立和断开,收到数据等,关键的也是MessageReceived,每当引擎收到服务端发来的数据,都会传递给该事件的响应函数。如下:

1
2
3
4
//绑定事件
clientInstance.MessageReceived += new SGDelegate<System.Net.IPEndPoint, byte[]>(MessageReceived);
clientInstance.ConnectionDisconnected += new SGDelegate(ConnectionInterrupted);
clientInstance.ConnectionReconnectSucceed += new SGDelegate(ConnectionRebuildSucceed);

开始连接服务端

上述步骤处理完成后,准备工作就做好了,下边可以开始连接服务端,建议tcp连接了,您可以在连接建立前,决定是否让引擎帮助您进行断线重连,代码如下:

1
2
3
4
5
//启动掉线自动重连
clientInstance.AutoReconnect = true;

//开始初始化,SharpSocket将初始化和服务端的连接
clientInstance.Initialize();

发送数据到服务端

您可以随时发送数据到服务端,如下:

1
2
//发送请求消息
clientInstance.PostDataToServer(reqMessage);

demo源码下载:

点击下载源码