当我们写一个tcp服务器和客户端的时候,我们在写什么?(一)

本篇只聊服务端。

最近想搞一个服务器的协议,然后捏,简单搓个tcp服务器协议看看效果,主要是最近实在是没事干,闲得没事搓个服务器看看,当然了,Qt中的我已经有了,现在我需要的是一个C#上的服务器。

当然了,我写这个服务器不会是从很学术的角度出发,而是从工业的实用角度出发,那就必须要先提一下使用场景:这个服务器的使用场景是在本地局域网环境下的进行数据收发,所以这里我可能就没有做什么所谓的io和补包了,可能就是简单的tcp server

不过无所谓,反正就自己写着玩的

1.需要的接口

当然了,既然要写,那么就得先把接口规定好是不?既然如此,我们来看一下编写完成的库需要哪些接口,首先看服务端:

服务端:需要如下接口

  1. Initialization初始化,也许直接在构造函数中就可以实现了
  2. StartServer开启服务器,也许需要输入ip和端口,也许不需要ip,最好是自己直接检索本地ip执行连接,当然了一定要提供选择,因为一定会存在双网卡的情况。
  3. SocketSetting连接设置(可选),当然了也需要对连接做一些设置,比如缓冲区大小等等
  4. SendData发送数据,当然了,需要能决定向谁发送什么内容,这个是最基本的
  5. RecDataEventHandler接受到数据的事件,当客户端发送来了数据之后肯定是要接受的,还需要一个事件去触发处理
  6. ConnEventHandler连接事件,当客户端连接到之后,肯定是需要一个事件来处理的

需要注意:

  1. 我们当然希望tcp服务器的消息系统是异步的。
  2. 接收的消息理论上是需要一个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服务端的时候,我们在写什么?(一)的更多相关文章

  1. wsgiref手写一个web服务端

    ''' 通过wsgiref写一个web服务端先讲讲wsgiref吧,基于网络通信其根本就是基于socket,所以wsgiref同样也是通过对socket进行封装,避免写过多的代码,将一系列的操作封装成 ...

  2. 03-案例——多任务版TCP服务端程序开发

    案例——多任务版TCP服务端程序开发   1. 需求     目前我们开发的TCP服务端程序只能服务于一个客户端,如何开发一个多任务版的TCP服务端程序能够服务于多个客户端呢?完成多任务,可以使用线程 ...

  3. TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端)、UDP客户端

    目录 说明 TCP/UDP通信主要结构 管理多个Socket的解决方案 框架中TCP部分的使用 框架中UDP部分的使用 框架源码结构 补充说明 源码地址 说明 之前有好几篇博客在讲TCP/UDP通信方 ...

  4. 【转】TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端)、UDP客户端

    [转]TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端).UDP客户端 目录 说明 TCP/UDP通信主要结构 管理多个Socket的解决方案 框架中TCP部分的使用 框架中UDP ...

  5. 适合新手:从零开发一个IM服务端(基于Netty,有完整源码)

    本文由“yuanrw”分享,博客:juejin.im/user/5cefab8451882510eb758606,收录时内容有改动和修订. 0.引言 站长提示:本文适合IM新手阅读,但最好有一定的网络 ...

  6. TCP服务端开发为例--web开发不同url请求走不同control方法

    拿java的web开发为例子,相信有很多小伙伴是做j2EE开发的,htpp请求,json数据传输都是工作中经常用的,查询请求,添加请求,修改请求前端配个url,例如https://localhost/ ...

  7. TCP服务端开发为例--web开发不同url请求为何会走不同方法

    拿java的web开发为例子,相信有很多小伙伴是做j2EE开发的,htpp请求,json数据传输都是工作中经常用的,查询请求,添加请求,修改请求前端配个url,例如https://localhost/ ...

  8. 【Python】如何基于Python写一个TCP反向连接后门

    首发安全客 如何基于Python写一个TCP反向连接后门 https://www.anquanke.com/post/id/92401 0x0 介绍 在Linux系统做未授权测试,我们须准备一个安全的 ...

  9. python网络编程-TCP服务端的开发

    #TCP服务端开发 2 #方法说明 3 """ 4 bind(host,port)表示绑定端口号,host是ip地址,ip地址一般不进 行绑定,表示本机的任何一个ip地址 ...

  10. 网络编程之TCP客户端开发和TCP服务端开发

    开发 TCP 客户端程序开发步骤 创建客户端套接字对象 和服务端套接字建立连接 发送数据 接收数据 关闭客户端套接字 import socket if __name__ == '__main__': ...

随机推荐

  1. C与Verilog差别

    C没有时钟概念,Verilog有时钟边沿触发. C无建立保持时间要求,Verilog要计算建立保持时间,并进行优化 C与工艺无关,Verilog依赖底层工艺cell,相同代码不同cell差异较大. V ...

  2. 技术Leader:像李云龙一样打造学习型团队

    今天跟大家分享一下怎么样构建一个学习型的团队. 首先对于计算机行业而言,不明而喻,我们要接受的东西真的太多了.我们接触的信息和变化也太多了.如果只是因循守旧,排斥新东西,那么我们被时代淘汰只是个时间问 ...

  3. A Novel Cascade Binary Tagging Framework for Relational Triple Extraction(论文研读与复现)

    A Novel Cascade Binary Tagging Framework for Relational Triple Extraction Zhepei Wei,Jianlin Su, Yue ...

  4. xml的语法总结

    xml的语法总结

  5. Python——第一章:用户交互

    变量 = input(提示语)首先会在屏幕中显示出提示语, 用户输入内容. 然后把用户输入的内容交给前面的变量 案例1: a = input("请输入第一个数字:") #括号里是提 ...

  6. 在CentOS安装BIND,把所有DNS请求日志转发到syslog服务器去

    在CentOS安装BIND,把所有DNS请求日志转发到syslog服务器去 在vim /etc/named.conf里配置的内容 logging { channel default_debug { f ...

  7. yml与json互转、yaml转json、json转yml

    yml与json互转.yaml转json.json转yml 使用jackson下的格式化模块实现 依赖: <dependency> <groupId>com.fasterxml ...

  8. window10 AppX Deployment Service (AppXSVC)占用大量内存导致资源管理器卡死无响应

    window10 AppX Deployment Service (AppXSVC)占用大量内存导致资源管理器卡死无响应,导致无法进入桌面打开软件等等. 1.打开任务管理的情况下,先结束卡死的资源管理 ...

  9. 文心一言 VS 讯飞星火 VS chatgpt (35)-- 算法导论5.3 5题

    五.证明:在过程 PERMUTE-BY-SORTING的数组 P中,所有元素都唯一的概率至少是1-1/n. 文心一言: 证明: 在过程PERMUTE-BY-SORTING中,对于输入数组P中的每个元素 ...

  10. HDU 4705 立方和拆解

    HDU 4705 立方和拆解 题意 给一棵树,找出所有的(A,B,C)三元组的数量,满足ABC不能同时被一条路径覆盖 思路 首先可以明确的是,对于每个入度大于等于3的点(也就是有两个或以上儿子的节点) ...