C#里面提供了Socket类,通过该类,可以很轻松地搭建起Socket服务端和客户端。本文将尽量以最简单的方式、最少的代码量来说明一个简易的Socket服务器是怎么搭建起来的。

首先,大概讲下整个思路和流程:

(1)首先要明白一个概念:整个服务器,实际上就是由一个Socket对象监听端口;

(2)我们会通过一个新的线程监听客户端发起连接请求,这样的好处是避免堵塞主线程;

(3)当与客户端建立起连接之后,我们还会新建线程来专门接受该socket客户端的数据。

先新建各类:

public class SocketServer
{}

定义一些属性变量:

        //端口号private int SocketServerPort = 5002;//处理连接请求的线程private Thread acceptConnectReqThd;

然后写一个服务器启动的函数Start

       /// <summary>/// 启动服务器/// </summary>public bool Start(){try{//创建一个socket对象Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//获取IPIPAddress ip = IPAddress.Any;//创建端口号IPEndPoint port = new IPEndPoint(ip, SocketServerPort);//监听socketWatch.Bind(port);Console.WriteLine("监听成功");socketWatch.Listen(20);  //设定最大的挂起长度//新建线程来处理连接请求acceptConnectReqThd = new Thread(AcceptConnectReqHandler);acceptConnectReqThd.IsBackground = true;acceptConnectReqThd.Start(socketWatch);  //把socket对象当做参数传递给到线程里面的方法return true;}catch(Exception e){return false;}}

执行Start函数之后,我们就创建了一个socket对象,并监听我们设定的端口号5002。并添加了个线程来处理客户端的连接请求。

接下来我们实现AcceptConnectReqHandler方法,即线程驱动的方法:

       /// <summary>/// 连接请求的处理函数/// </summary>/// <param name="_socket"></param>private void AcceptConnectReqHandler(object _socket){try{//服务端的socket对象Socket serverSocket = (Socket)_socket;while (true){//获取客户端socket。Accept方法处理任何传入的连接请求,并返回可用于与远程主机通信数据的Socket对象,即客户端的socket。//这一句话会卡主线程。只要没有新的链接进来,就会一直卡主不动(等待中)。//收到连接事件后,会往下执行,通过while又回到这里继续等待Socket clientSocket = serverSocket.Accept();  //创建接受客户端消息的线程Thread acceptMsgReqThd = new Thread(ReciveMsgReqHandler);acceptMsgReqThd.IsBackground = true;acceptMsgReqThd.Start(clientSocket);}}catch (Exception e){Console.WriteLine("服务端处理连接事件异常:" + e.ToString());}}

这个线程驱动的函数里面,只要收到一个客户端的请求链接,就会再新建一个线程来收数据。有N个客户端链接,就会添加N个线程。

现在我们来实现收数据的方法ReciveMsgReqHandler

       /// <summary>/// 接收客户端socket消息/// </summary>/// <param name="_socket"></param>private void ReciveMsgReqHandler(object _socket){Socket clientSocket = (Socket)_socket;try{while(true){//客户端连接成功后,接受来自客户端的消息if (clientSocket == null){continue;}byte[] buffer = new byte[MAX_SEND_FILE_LENGTH];  //数据缓冲区。//实际接收到的有效字节数//Receive也是个卡线程的方法Console.WriteLine("等待接受客户端的数据:");int dataLength = clientSocket.Receive(buffer);Console.WriteLine("接受到客户端的数据,字节数:" + dataLength);//如果客户端关闭,发送的数据就为空,就跳出循环if (dataLength == 0){break;}//假设收到的是个字符串(先这么假定),转成字符串处理string strMsg = Encoding.UTF8.GetString(buffer, 1, dataLength - 1);Console.WriteLine("接受到客户端的消息:" + strMsg);}//中止当前线程Thread.CurrentThread.Abort();}catch(Exception e){SocketException socketExp = e as SocketException;if (socketExp!=null && socketExp.NativeErrorCode == 10054){Console.WriteLine("socket客户端关闭:" + e.ToString());}else{Console.WriteLine("======接受消息异常:" + e.ToString());}//中止当前线程Thread.CurrentThread.Abort();}}

就这样一个简易的socket服务器就搭建起来了。

调用方式:

SGSocketServer socketServer = new SGSocketServer();
socketServer.Start();

当然,要达到工程应用级别,还要做更多一些工作。但千里之行始于足下,有了这个基础之后就可以不断地往里面添加业务逻辑。

【C#】一文教你搭个简易的Socket服务器相关推荐

  1. 用python写管理系统局域网_详解用python -m http.server搭一个简易的本地局域网

    工作时同事间几mb小文件的传输,一般使用QQ或者微信就足够了,但当传输文件几百MB或者几十G时,这种方法的效率就显得不足了.本篇就是简单说明一个python小功能,让大家能利用python方便的搭建一 ...

  2. netty系列之:轻轻松松搭个支持中文的服务器

    文章目录 简介 netty的HTTP支持 netty中使用HTTP的原理 100 (Continue) Status 为netty搭建HTTP服务器 总结 简介 之前讲了那么多关于netty的文章,都 ...

  3. express 搭建简易的本地服务器

    express 搭建简易的本地服务器 基于nade.js平台,开发极简的web开发框架 安装node.js(此文章省略) 安装express npm initnpm i express -D 安装成功 ...

  4. Python简易web静态服务器程序搭建

    Python简易web静态服务器程序搭建 Python自带简易静态web服务器搭建 http.server模块 DIY简易静态web服务器程序搭建 普通版 步骤 具体代码 面向对象版 代码 命令行版 ...

  5. 快速搭建一个简易的HTTP服务器用于文件分享与下载

    需要快速搭建一个简易的HTTP服务器进行文件的分享与下载.主要有以下两种方法: 1. 使用python 来实现 import http.server import socketserverPORT = ...

  6. 偷个懒,公号抠腚早报80%自动化——4.用Flask搭个简易(陋)后台

    简述 在上一节「偷个懒,公号抠腚早报80%自动化--3.Flask速成大法」中,快速地把 Flask的基本语法撸了一遍,本节直接开冲,用Flask来写下抠腚男孩的后台. PS:笔者没有真正参加过前后端 ...

  7. 用python -m http.server搭一个简易的本地局域网

    工作时同事间几mb小文件的传输,一般使用QQ或者微信就足够了,但当传输文件几百MB或者几十G时,这种方法的效率就显得不足了.本篇就是简单说明一个python小功能,让大家能利用python方便的搭建一 ...

  8. python -m http.server 搭建一个简易web下载服务器(可用于快速发送大文件)

    在工作过程中需要经常发送安装包等大文件给同事,亲测共享文件夹拷贝.QQ.微信等聊天工具,大文件传输速度效率不高. 然而局域网内使用python搭建的简易下载服务器速度比较快,百兆网卡下载速度随便达到1 ...

  9. 简易华为人工智能服务器,华为发布昇腾AI全栈软件平台:极致性能、简单易用...

    8月10日,在深圳举行的昇腾AI新品全球发布会HAI 2020上,华为发了布业界领先的昇腾AI全栈软件平台,包括异构计算架构CANN 3.0.全流程开发工具链MindStudio.昇腾应用使能Mind ...

  10. 傻瓜式图文教你在linux下搭建VNC服务器

    1 检查系统中是否已经安装了vnc-server [root@real02 ~]# rpm -qa vnc-server vnc-server-4.1.2-14.el5_6.6 这表示已经安装了,如果 ...

最新文章

  1. FMS(Flash Media Server)共享内存问题解决
  2. Ubuntu18.04安装Scala
  3. 【Java语法】StringBuilder 可变字符序列 和普通String的对比
  4. 悬剑武器库之5种工具学习(shiro检测插件、子域名、信息收集、暴力破解等)
  5. 统计了50万人的身高数据才发现:大家都爱虚报身高
  6. 【转载】 vs2005视频教程 之 抽象类和接口 四 [视频]
  7. Redis实战(十三)Redis的三种集群方式
  8. mybatis实现模糊查询时%%的处理
  9. 传智播客 机器学习基础 学习笔记
  10. html获取当前ip地址_科普文:Node.js 安全攻防 - 如何伪造和获取用户真实 IP ?
  11. Python抓取妹子图
  12. ul阻燃标准有几个等级_UL阻燃等级介绍说明
  13. COMSOL数据导入的案例
  14. matlab sae模型,发动机平均值模型的三篇SAE论文
  15. 二元一次方程有唯一解的条件_一个二元一次方程的一个解是
  16. 什么是T1 mapping?
  17. 判断四张扑克牌能否凑成24点游戏算法
  18. (转载)Windows文件系统过滤驱动开发教程
  19. 广域网技术——iFIT
  20. 你在日常的测试工作中遇到过哪些困境呢?

热门文章

  1. smartupload java_jspSmartUpload组件使用(一)
  2. 机器人顶会RSS 2021各奖项出炉,CMU华人博士生摘得最佳论文
  3. MATLAB绘图—三维曲线绘图-(plot3)
  4. 哲学中的推理规则 —— 《自然哲学之数学原理》
  5. 大工《画法几何与机械制图》课程设计大作业离线作业
  6. 电工电子技术计算机用学吗,电工电子技术是学什么
  7. GPU硬件加速原理 /转
  8. 锐捷交换机-负载均衡方式配置说明
  9. 地图经纬度转换(百度,高德,谷歌,Leaflet)
  10. 印刷五大要素:原稿、印版、油墨、承印物、印刷机械