当我们写一个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. 【总结】IntelliJ IDEA 插件

    1..iBATIS/MyBatis plugin轻松通过快捷键找到MyBatis中对应的Mapper和XML,CTRL+ALT+B 2.iBATIS/MyBatis plugin轻松通过快捷键找到My ...

  2. AI浪潮下,大模型如何在音视频领域运用与实践?

    视频云大模型算法「方法论」. 刘国栋|演讲者 在AI技术发展如火如荼的当下,大模型的运用与实践在各行各业以千姿百态的形式展开.音视频技术在多场景.多行业的应用中,对于智能化和效果性能的体验优化有较为极 ...

  3. 组合式api-跨层级组件通信provide和inject

    vue2的provide和inject:https://v2.cn.vuejs.org/v2/api/#provide-inject 主要作用: 跨层级传递数据(响应和非相应数据都可以).方法(函数) ...

  4. vue3组合式api生命周期

    生命周期钩子函数 Vue3:https://cn.vuejs.org/api/composition-api-lifecycle.html Vue2:https://v2.cn.vuejs.org/v ...

  5. 【电影推荐系统】Spring Boot + Vue3 前后端分离项目

    目录 0 前言 1 项目前端介绍 1.1 项目启动和编译 1.1.1 项目启动 1.1.2 项目编译 1.2 前端技术栈 1.3 功能模块前端界面展示 1.3.1 基础功能模块 1.3.2 用户模块 ...

  6. Windows桌面自动化测试工具:WinAppDriver

    大家好,今天给大家介绍一款Windows桌面自动化测试工具:WinAppDriver. 1.介绍 WinAppDriver是一个开源的自动化测试工具,用于测试Windows应用程序.它是一个Windo ...

  7. Spring事务状态处理

    Spring事务提交后执行:深入理解和实践 在Java开发中,Spring框架的事务管理是一个核心概念,尤其是在企业级应用中.理解和正确使用Spring事务对于保证应用的数据一致性和稳定性至关重要.本 ...

  8. 2023-09-05:请用go语言编写。一个图像有n个像素点,存储在一个长度为n的数组arr里, 每个像素点的取值范围[0,s]的整数, 请你给图像每个像素点值加上一个整数k(可以是负数), 像素值会

    2023-09-05:请用go语言编写.一个图像有n个像素点,存储在一个长度为n的数组arr里, 每个像素点的取值范围[0,s]的整数, 请你给图像每个像素点值加上一个整数k(可以是负数), 像素值会 ...

  9. 如何快速部署本地训练的 Bert-VITS2 语音模型到 Hugging Face

    Hugging Face是一个机器学习(ML)和数据科学平台和社区,帮助用户构建.部署和训练机器学习模型.它提供基础设施,用于在实时应用中演示.运行和部署人工智能(AI).用户还可以浏览其他用户上传的 ...

  10. 解锁华为云AI如何助力无人车飞驰“新姿势”,大赛冠军有话说

    摘要:在2020年第二届华为云人工智能大赛•无人车挑战杯赛道中,"华中科技大学无人车一队"借助华为云一站式AI开发与管理平台ModelArts及HiLens端云协同AI开发应用平台 ...