【C#】一文教你搭个简易的Socket服务器
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服务器相关推荐
- 用python写管理系统局域网_详解用python -m http.server搭一个简易的本地局域网
工作时同事间几mb小文件的传输,一般使用QQ或者微信就足够了,但当传输文件几百MB或者几十G时,这种方法的效率就显得不足了.本篇就是简单说明一个python小功能,让大家能利用python方便的搭建一 ...
- netty系列之:轻轻松松搭个支持中文的服务器
文章目录 简介 netty的HTTP支持 netty中使用HTTP的原理 100 (Continue) Status 为netty搭建HTTP服务器 总结 简介 之前讲了那么多关于netty的文章,都 ...
- express 搭建简易的本地服务器
express 搭建简易的本地服务器 基于nade.js平台,开发极简的web开发框架 安装node.js(此文章省略) 安装express npm initnpm i express -D 安装成功 ...
- Python简易web静态服务器程序搭建
Python简易web静态服务器程序搭建 Python自带简易静态web服务器搭建 http.server模块 DIY简易静态web服务器程序搭建 普通版 步骤 具体代码 面向对象版 代码 命令行版 ...
- 快速搭建一个简易的HTTP服务器用于文件分享与下载
需要快速搭建一个简易的HTTP服务器进行文件的分享与下载.主要有以下两种方法: 1. 使用python 来实现 import http.server import socketserverPORT = ...
- 偷个懒,公号抠腚早报80%自动化——4.用Flask搭个简易(陋)后台
简述 在上一节「偷个懒,公号抠腚早报80%自动化--3.Flask速成大法」中,快速地把 Flask的基本语法撸了一遍,本节直接开冲,用Flask来写下抠腚男孩的后台. PS:笔者没有真正参加过前后端 ...
- 用python -m http.server搭一个简易的本地局域网
工作时同事间几mb小文件的传输,一般使用QQ或者微信就足够了,但当传输文件几百MB或者几十G时,这种方法的效率就显得不足了.本篇就是简单说明一个python小功能,让大家能利用python方便的搭建一 ...
- python -m http.server 搭建一个简易web下载服务器(可用于快速发送大文件)
在工作过程中需要经常发送安装包等大文件给同事,亲测共享文件夹拷贝.QQ.微信等聊天工具,大文件传输速度效率不高. 然而局域网内使用python搭建的简易下载服务器速度比较快,百兆网卡下载速度随便达到1 ...
- 简易华为人工智能服务器,华为发布昇腾AI全栈软件平台:极致性能、简单易用...
8月10日,在深圳举行的昇腾AI新品全球发布会HAI 2020上,华为发了布业界领先的昇腾AI全栈软件平台,包括异构计算架构CANN 3.0.全流程开发工具链MindStudio.昇腾应用使能Mind ...
- 傻瓜式图文教你在linux下搭建VNC服务器
1 检查系统中是否已经安装了vnc-server [root@real02 ~]# rpm -qa vnc-server vnc-server-4.1.2-14.el5_6.6 这表示已经安装了,如果 ...
最新文章
- FMS(Flash Media Server)共享内存问题解决
- Ubuntu18.04安装Scala
- 【Java语法】StringBuilder 可变字符序列 和普通String的对比
- 悬剑武器库之5种工具学习(shiro检测插件、子域名、信息收集、暴力破解等)
- 统计了50万人的身高数据才发现:大家都爱虚报身高
- 【转载】 vs2005视频教程 之 抽象类和接口 四 [视频]
- Redis实战(十三)Redis的三种集群方式
- mybatis实现模糊查询时%%的处理
- 传智播客 机器学习基础 学习笔记
- html获取当前ip地址_科普文:Node.js 安全攻防 - 如何伪造和获取用户真实 IP ?
- Python抓取妹子图
- ul阻燃标准有几个等级_UL阻燃等级介绍说明
- COMSOL数据导入的案例
- matlab sae模型,发动机平均值模型的三篇SAE论文
- 二元一次方程有唯一解的条件_一个二元一次方程的一个解是
- 什么是T1 mapping?
- 判断四张扑克牌能否凑成24点游戏算法
- (转载)Windows文件系统过滤驱动开发教程
- 广域网技术——iFIT
- 你在日常的测试工作中遇到过哪些困境呢?