当我们写一个tcp服务器和客户端的时候,我们在写什么?(一)
本篇只聊服务端。
最近想搞一个服务器的协议,然后捏,简单搓个tcp服务器协议看看效果,主要是最近实在是没事干,闲得没事搓个服务器看看,当然了,Qt中的我已经有了,现在我需要的是一个C#上的服务器。
当然了,我写这个服务器不会是从很学术的角度出发,而是从工业的实用角度出发,那就必须要先提一下使用场景:这个服务器的使用场景是在本地局域网环境下的进行数据收发,所以这里我可能就没有做什么所谓的io和补包了,可能就是简单的tcp server
不过无所谓,反正就自己写着玩的
1.需要的接口
当然了,既然要写,那么就得先把接口规定好是不?既然如此,我们来看一下编写完成的库需要哪些接口,首先看服务端:
服务端:需要如下接口
- Initialization初始化,也许直接在构造函数中就可以实现了
- StartServer开启服务器,也许需要输入ip和端口,也许不需要ip,最好是自己直接检索本地ip执行连接,当然了一定要提供选择,因为一定会存在双网卡的情况。
- SocketSetting连接设置(可选),当然了也需要对连接做一些设置,比如缓冲区大小等等
- SendData发送数据,当然了,需要能决定向谁发送什么内容,这个是最基本的
- RecDataEventHandler接受到数据的事件,当客户端发送来了数据之后肯定是要接受的,还需要一个事件去触发处理
- ConnEventHandler连接事件,当客户端连接到之后,肯定是需要一个事件来处理的
需要注意:
- 我们当然希望tcp服务器的消息系统是异步的。
- 接收的消息理论上是需要一个buffer缓冲区去保存的,以此来接受一个个包,也可以方便我们评判这是否是异常包。
以上就是服务端最基本的接口了,在C++中可能还需要创建socket绑定端口什么的操作,不过在.net的强大原生库之后已经为我们做了很多东西了,所以绑定socket通信实际上相当简单,如下所示:
private void StartListen(string ipAddress, int port)
{
IPAddress localIpAddress = IPAddress.Parse(ipAddress);
IPEndPoint localEndPoint = new IPEndPoint(localIpAddress, port);
listenSocket = new Socket(localIpAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
listenSocket.Bind(localEndPoint);
listenSocket.Listen(this.socketSetting.Bakclog);
StartAccept();
}
ok,开始连线后,就需要进入一个循环,也就是这个StartAccept();
private void StartAccept()
{
SocketAsyncEventArgs acceptEventArg;
if (this.poolOfAcceptSaea.Count > 1)
{
try
{
acceptEventArg = this.poolOfAcceptSaea.Pop();
}
catch
{
acceptEventArg = CreateNewSaeaForAccept();
}
}
else
{
acceptEventArg = CreateNewSaeaForAccept();
}
//开始一个异步操作
bool willRaiseEvent = listenSocket.AcceptAsync(acceptEventArg);
//如果是同步完成操作
if (!willRaiseEvent)
{
ProcessAccept(acceptEventArg);
}
}
标签:listenSocket,需要,tcp,服务器,acceptEventArg,我们,服务端
From: https://www.cnblogs.com/Leventure/p/17610171.html