[工程开发]当我们写一个tcp服务端的时候,我们在写什么?(一)
当我们写一个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);
}
}
[工程开发]当我们写一个tcp服务端的时候,我们在写什么?(一)的更多相关文章
- wsgiref手写一个web服务端
''' 通过wsgiref写一个web服务端先讲讲wsgiref吧,基于网络通信其根本就是基于socket,所以wsgiref同样也是通过对socket进行封装,避免写过多的代码,将一系列的操作封装成 ...
- 03-案例——多任务版TCP服务端程序开发
案例——多任务版TCP服务端程序开发 1. 需求 目前我们开发的TCP服务端程序只能服务于一个客户端,如何开发一个多任务版的TCP服务端程序能够服务于多个客户端呢?完成多任务,可以使用线程 ...
- TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端)、UDP客户端
目录 说明 TCP/UDP通信主要结构 管理多个Socket的解决方案 框架中TCP部分的使用 框架中UDP部分的使用 框架源码结构 补充说明 源码地址 说明 之前有好几篇博客在讲TCP/UDP通信方 ...
- 【转】TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端)、UDP客户端
[转]TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端).UDP客户端 目录 说明 TCP/UDP通信主要结构 管理多个Socket的解决方案 框架中TCP部分的使用 框架中UDP ...
- 适合新手:从零开发一个IM服务端(基于Netty,有完整源码)
本文由“yuanrw”分享,博客:juejin.im/user/5cefab8451882510eb758606,收录时内容有改动和修订. 0.引言 站长提示:本文适合IM新手阅读,但最好有一定的网络 ...
- TCP服务端开发为例--web开发不同url请求走不同control方法
拿java的web开发为例子,相信有很多小伙伴是做j2EE开发的,htpp请求,json数据传输都是工作中经常用的,查询请求,添加请求,修改请求前端配个url,例如https://localhost/ ...
- TCP服务端开发为例--web开发不同url请求为何会走不同方法
拿java的web开发为例子,相信有很多小伙伴是做j2EE开发的,htpp请求,json数据传输都是工作中经常用的,查询请求,添加请求,修改请求前端配个url,例如https://localhost/ ...
- 【Python】如何基于Python写一个TCP反向连接后门
首发安全客 如何基于Python写一个TCP反向连接后门 https://www.anquanke.com/post/id/92401 0x0 介绍 在Linux系统做未授权测试,我们须准备一个安全的 ...
- python网络编程-TCP服务端的开发
#TCP服务端开发 2 #方法说明 3 """ 4 bind(host,port)表示绑定端口号,host是ip地址,ip地址一般不进 行绑定,表示本机的任何一个ip地址 ...
- 网络编程之TCP客户端开发和TCP服务端开发
开发 TCP 客户端程序开发步骤 创建客户端套接字对象 和服务端套接字建立连接 发送数据 接收数据 关闭客户端套接字 import socket if __name__ == '__main__': ...
随机推荐
- Pattern类和Matcher类的使用
1.先看好数据源 先将一个String对象确定为程序要对其进行操作的数据源. String b="hello,good morning"; 2.建立Pattern类的对象 Stri ...
- Linux笔记03: Linux常用命令_3.3文件操作命令
3.3 文件操作命令 3.3.1 stat命令 ●命令名称:stat. ●英文原意:display file or file system status. ●所在路径:/usr/bin/stat. ● ...
- 一步一步教你写kubernetes sidecar
本文分享自华为云社区<一步一步教你写kubernetes sidecar>,作者: 张俭. 什么是sidecar? sidecar,直译为边车. 如上图所示,边车就是加装在摩托车旁来达到拓 ...
- linux rz/sz 拖动文件上传
不需要第三方上传文件直接 rz上传 拖动.以及 sz下载文件 多舒服 那么 他来了 安装与使用 yum安装 yum -y install lrzsz 使用上传文件,执行命令rz,会跳出文件选择窗口,选 ...
- 编写.NET的Dockerfile文件构建镜像
创建一个WebApi项目,并且创建一个Dockerfile空文件,添加以下代码,7.0代表的你项目使用的SDK的版本,构建的时候也需要选择好指定的镜像tag FROM mcr.microsoft.co ...
- 华硕AX系列路由器选购,以及华硕WIFI6路由器智能设备家电无法互联的解决方法。
家里昨天换了一整套wifi6路由器(华硕AX82U+XD4R),刚刚换上就发现原来的欧普智能灯和部分其他设备无法使用了,而小米等设备等都可以互联,智能家居绝大部分用的是2.4G的协议,所以说,问题出现 ...
- Http 编码格式简介
Http 格式简介 Http 是用于在客户端和服务端之间进行通信的一种消息格式,一般由以下几个部分组成: 起始行:这部分在 Http 响应中也被称为状态行,针对不同的 Http 类型,其中包含的内容也 ...
- [极客大挑战 2019]EasySQL 1
[极客大挑战 2019]EasySQL 1 观察题目,发现为登录界面,判断这道题的考点是SQL注入. 知识点 万能密码 知识点原理 当用户尝试登录时 网站后台会进行SQL查询,比如 [select * ...
- 2023-11-29:用go语言,给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。 需保证 返回结果的字典序最小。 要求不能打乱其他字符的相对位置)。 输入:s = “cba
2023-11-29:用go语言,给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次. 需保证 返回结果的字典序最小. 要求不能打乱其他字符的相对位置). 输入:s = &quo ...
- 在xml中比较运算符
SQL 中,可以使用比较运算符来比较两个值,如使用小于运算符 < 比较两个值大小.但是,在 SQL 查询中,有时候需要将小于运算符 < 用于 XML 或 HTML 语法中,这会导致语法冲突 ...