.Net TCP探索(一)——TCP服务端开发(同时监听多个客户端请求)
最近在园子里看了大神写的(面试官,不要再问我三次握手和四次挥手),忍不住写段程序来测试一番。
在网上找了很多例子,大多只实现了TCP点对点通讯,但实际应用中,一个服务器端口往往要监听多个客户端发来的消息。
测试工具下载:https://download.csdn.net/download/nbyanghuichao/11872360
本例采用System.Threading实现多线程监听,下面只介绍核心代码,省略了消息提示和错误处理,可以从我的GitHub获取完整代码:https://github.com/FB208/CodeSpace/tree/master/CodeSpace.CSharp/TCP.Client
数据声明:
private string _ip;//IP
private int _port;//端口
//客户端集合
public static List<TcpClientModel> clients = new List<TcpClientModel>
private static byte[] bytes = new byte[1024 * 100];
/// <summary>
/// 用于存储客户端
/// </summary>
public class TcpClientModel
{
/// <summary>
/// IP:Port
/// </summary>
public string RemoteEndPoint { get; set; }
/// <summary>
/// 客户端链接对象
/// </summary>
public TcpClient TcpClient { get; set; }
}
启动监听:
///启动监听
void Init()
{
try
{
IPAddress ip = IPAddress.Parse(_ip);
int port = _port;
TcpListener listener = new TcpListener(ip, port);
//启动监听
listener.Start();
tb_console.AppendText($"Listener...\r\n");
//异步接收 递归循环接收多个客户端
listener.BeginAcceptTcpClient(new AsyncCallback(GetAcceptTcpclient), listener);
}
catch (Exception ex)
{
}
}
接收客户端:
private void GetAcceptTcpclient(IAsyncResult State)
{
//处理多个客户端接入
TcpListener listener = (TcpListener)State.AsyncState;
//接收到客户端请求
TcpClient client = listener.EndAcceptTcpClient(State);
//保存到客户端集合中
clients.Add(new TcpClientModel() { TcpClient = client, RemoteEndPoint = client.Client.RemoteEndPoint.ToString() });
//开启线程用来持续接收来自客户端的数据
Thread myThread = new Thread(() =>
{
ReceiveMsgFromClient(client);
});
myThread.Start();
listener.BeginAcceptTcpClient(new AsyncCallback(GetAcceptTcpclient), listener);
}
接收消息并响应客户端:
private void ReceiveMsgFromClient(object reciveClient)
{
TcpClient client = reciveClient as TcpClient;
if (client == null)
{
return;
}
while (true)
{
try
{
NetworkStream stream = client.GetStream();
int num = stream.Read(bytes, 0, bytes.Length); //将数据读到result中,并返回字符长度
if (num != 0)
{
//把字节数组中流存储的数据以字符串方式赋值给str
//这里就是接收到的客户端消息
string str = Encoding.UTF8.GetString(bytes, 0, num);
//给客户端返回一个消息
string msg = "Your message has been received by the server[" + str + "]";
bool result = TCPHelper.SendToClient(client, msg, out msg);
if (!result)
{
//发送失败
}
}
else
{
//这里需要注意 当num=0时表明客户端已经断开连接,需要结束循环,不然会死循环一直卡住
break;
}
}
catch (Exception ex)
{
//链接失败 从集合中移除出错客户端
clients.Remove(clients.FirstOrDefault(m => m.RemoteEndPoint == client.Client.RemoteEndPoint.ToString()));
break;
}
}
}
从服务器向客户端发送消息的工具类:
public static class TCPHelper
{
public static bool SendToClient(TcpClient client, string message,out string errorMsg)
{
try
{
byte[] bytes = new byte[1024 * 100];
bytes = Encoding.UTF8.GetBytes(message);
NetworkStream stream = client.GetStream();
stream.Write(bytes, 0, bytes.Length);
stream.Flush();
errorMsg = "";
return true;
}
catch (Exception ex)
{
errorMsg = ex.Message;
return false;
}
}
}
测试效果:

完整代码请关注:https://github.com/FB208/CodeSpace/tree/master/CodeSpace.CSharp/TCP.Client
.Net TCP探索(一)——TCP服务端开发(同时监听多个客户端请求)的更多相关文章
- TCP状态机:当服务端主动发FIN进TIME_WAIT,客户端源端口复用会发生什么
0X01 正常情况下TCP连接会通过4次挥手进行拆链(也有通过RST拆除连接的可能,见为什么服务器突然回复RST--小心网络中的安全设备),下图TCP状态机展示了TCP连接的状态变化过程: 我们重点看 ...
- 自己封装的Socket组件,实现服务端多进程共享Socket对象,协同处理客户端请求
DotNet.Net.MySocket是SLB.NET(Server Load Balance服务器负载均衡)项目中的核心组件. 在实际的项目中发现,单进程的服务端处理高并发的客户请求能力有限. 所以 ...
- python网络编程TCP服务多客户端的服务端开发
#服务多客户端TCP服务端开发 2 #方法说明 3 """ 4 bind(host,port)表示绑定端口号,host是ip地址,ip地址一般不进 行绑定,表示本机的任何 ...
- 网络编程之TCP客户端开发和TCP服务端开发
开发 TCP 客户端程序开发步骤 创建客户端套接字对象 和服务端套接字建立连接 发送数据 接收数据 关闭客户端套接字 import socket if __name__ == '__main__': ...
- 异步tcp通信——APM.Core 服务端概述
为什么使用异步 异步线程是由线程池负责管理,而多线程,我们可以自己控制,当然在多线程中我们也可以使用线程池.就拿网络扒虫而言,如果使用异步模式去实现,它使用线程池进行管理.异步操作执行时,会将操作丢给 ...
- TCP协议下的服务端并发,GIL全局解释器锁,死锁,信号量,event事件,线程q
TCP协议下的服务端并发,GIL全局解释器锁,死锁,信号量,event事件,线程q 一.TCP协议下的服务端并发 ''' 将不同的功能尽量拆分成不同的函数,拆分出来的功能可以被多个地方使用 TCP服务 ...
- java 网络编程基础 TCP/IP协议:服务端ServerSocket;客户端Socket; 采用多线程方式处理网络请求
1.Java中客户端和服务器端通信的简单实例 Java中能接收其他通信实体连接请求的类是ServerSocket,ServerSocket对象用于监听来自客户端的Socket连接,如果没有连接,它将一 ...
- socket服务端开发之测试使用threading和gevent框架
socket服务端开发之测试使用threading和gevent框架 话题是测试下多线程和gevent在socket服务端的小包表现能力,测试的方法不太严谨,也没有用event loop + pool ...
- 俯瞰 Java 服务端开发
原文首发于 github ,欢迎 star . Java 服务端开发是一个非常宽广的领域,要概括其全貌,即使是几本书也讲不完,该文将会提到许多的技术及工具,但不会深入去讲解,旨在以一个俯瞰的视角去探寻 ...
随机推荐
- IDC是什么?
IDC:互联网数据中心,是电信部门利用已有的互联网通信线路.贷款资源,建立标准化的电信专业级机房环境,为企业.政府提供服务器托管.服务器租用以及相关增值等方面服务.IDC是全球协作的特定设备网络,用来 ...
- 玩转 SpringBoot 2 快速整合 | Thymeleaf 篇
前言 Thymeleaf是一个适用于Web和独立环境的现代服务器端Java模板引擎. Thymeleaf的主要目标是为您的开发工作流程带来优雅的自然模板 - 可以在浏览器中正确显示的HTML,也可以用 ...
- 【第十篇】easyui-datagrid排序 (转)
本文体验datagrid的排序. □ 思路 当点击datagrid的标题,视图传递给Controller的Form Data类似这样:page=1&rows=10&sort=Custo ...
- Android入门学习教程PDF免费下载
场景 CSDN: https://blog.csdn.net/badao_liumang_qizhi 博客园: https://www.cnblogs.com/badaoliumangqizhi/ 哔 ...
- mysql数据库事务隔离原理
今天在学习JDBC的时候看到了关于MySQL的事务的隔离级别的问题,感觉内容挺高级的,所以记录一篇文章,以备后面使用. 数据库隔离级别有四种,应用<高性能mysql>一书中的说明: 然后说 ...
- Java面试-容器的遍历
当我们用增强for循环遍历非并发容器(HashMap.ArrayList等),如果修改其结构,会抛出异常ConcurrentModificationException,因此在阿里巴巴的Java规范中有 ...
- python函数练习
1:下载一首英文的歌词或文章 love story-taylor swiftwe were both young when i first saw youi close my eyes and the ...
- 初识数据库(MySql)
一.简介 1.MySql是关系型数据库. 2.是一种开放源码软件, 3.是一种关联数据库管理系统. 4.服务器工作于客户端/服务端模式之下,或者是嵌入系统中. 数据库管理软件分类: 分两大类: 关系型 ...
- [DE] ML on Big data: MLlib
Pipeline的最终目的就是学会Spark MLlib,这里先瞧瞧做到心里有数:知道之后要学什么,怎么学. 首要问题 一.哪些机器学习算法可以并行实现? 四类算法:分类.回归.聚类.协同过滤 以及特 ...
- [Linux] linux下vim对于意外退出的文档的再次开启
转载自博客:https://blog.csdn.net/ljp1919/article/details/48372615 1.对于同一个文件如果上次已经打开,而未关闭的情况下,又打开该文件进行编辑时, ...