一、写在前面
本文所用例子为个人学习的小结,如有不足之处请各位多多海涵,欢迎小伙伴一起学习进步,如果想法可在评论区指出,我会尽快回复您,不胜感激!
所公布代码或截图均为运行成功后展示。
嘿嘿,小小免责声明一下!部分代码可能与其他网络例子相似,如原作者看到有不满,请联系我修改,感谢理解与支持!
二、本文内容
首先引入上一章的地址,需要了解客户端代码的小伙伴可以移步:[ C# ] C#中客户端通过Tcp协议和服务端通讯-CSDN博客文章浏览阅读515次,点赞17次,收藏9次。C# 实现客户端TCP通讯的小例子https://blog.csdn.net/wxf5522/article/details/135407454 在上一章中我们介绍了C#中客户端如何通过TCP协议向服务器发起请求,这一章我们将学习Tcp服务端如何起线程监听客户端的请求并根据请求信息解析并回复结果。
Tips:
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它是互联网协议套件(TCP/IP)的核心协议之一。
TCP协议的主要特点和功能包括:
1. 面向连接:在数据传输之前,发送端和接收端需要建立连接。这个过程通常被称为三次握手。
2. 可靠传输:TCP提供了确认、重传和超时重发等机制,确保数据能够可靠地从发送端传输到接收端。
3. 流量控制:TCP使用滑动窗口机制进行流量控制,防止发送端发送数据的速度超过接收端接收数据的速度。
4. 拥塞控制:当网络出现拥塞时,TCP会减少数据的发送速度,避免网络拥塞的情况进一步恶化。
5. 有序数据传输:TCP会对数据进行编号,确保所有的数据都能按照发送的顺序被接收。
6. 全双工通信:TCP连接的两端都可以同时发送和接收数据。
TCP协议广泛应用于各种网络应用,如Web浏览(HTTP/HTTPS协议)、邮件传输(SMTP协议)、文件传输(FTP协议)等。
三、开发环境
1.开发语言:C#
2.开发框架:.Net Framework 4.8
2.界面框架:Winform
3.开发工具:Visual Studio 2022
四、代码实现
4.1定义基础变量
public Socket TCPServerSocket { get; set; }
public Dictionary<string, Socket> Sockets { get; set; } = new Dictionary<string, Socket>();
4.2定义创建服务端TCP服务
/// <summary>
/// 创建服务端Socket
/// </summary>
/// <param name="ip"></param>
/// <param name="port"></param>
/// <returns></returns>
private Socket CreateSocket(string ip, string port)
{
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress address = IPAddress.Parse(ip);
IPEndPoint endPoint = new IPEndPoint(address, int.Parse(port));
socket.Bind(endPoint);
socket.Listen(20);
return socket;
}
4.3定义监听客户端请求的线程并启动
/// <summary>
/// 创建监听客户端的线程并启动
/// </summary>
private void CreateThread()
{
Thread watchThread = new Thread(WatchConnection);
watchThread.IsBackground = true;
watchThread.Start();
}
/// <summary>
/// 监听客户端请求
/// </summary>
private void WatchConnection()
{
while (true)
{
Socket clientSocket = null;
try
{
clientSocket = TCPServerSocket.Accept();
IPEndPoint endPoint = (IPEndPoint)clientSocket.RemoteEndPoint;
string ip = endPoint.Address.ToString();
string port = endPoint.Port.ToString();
Sockets.Add(ip + ":" + port, clientSocket);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
break;
}
ParameterizedThreadStart pts = new ParameterizedThreadStart(ClientReceiver);
Thread clientThread = new Thread(pts);
clientThread.IsBackground = true;
clientThread.Start(clientSocket);
}
}
/// <summary>
///
/// </summary>
/// <param name="socket"></param>
private void ClientReceiver(object socket)
{
Socket clientSocket = socket as Socket;
int ReceiveBufferSize = 10240;
while (true)
{
int receivedLength = 0;
byte[] r_buffer = new byte[ReceiveBufferSize];
byte[] buffer = new byte[ReceiveBufferSize];
try
{
List<byte> ls = new List<byte>();
if (clientSocket != null)
{
receivedLength = clientSocket.Receive(r_buffer);
buffer = new byte[receivedLength];
if (receivedLength > 0)
{
Console.WriteLine("receivedLength:" + receivedLength);
Buffer.BlockCopy(r_buffer, 0, buffer, 0, receivedLength);
string msg = "Receive Success " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
byte[] datas = System.Text.Encoding.UTF8.GetBytes(msg);
Console.WriteLine(BitConverter.ToString(buffer).Replace("-", " "));
byte[] responseBuffer = null;
byte messageType = buffer[1];
switch (messageType)
{
case 0:
break;
case 1:
if (buffer[7] == 1)
{
if (buffer[6] == 0)
responseBuffer = new byte[] { 0x5A, 0x01, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x5a, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00 };
}
//省略
break;
//TODO
default:
break;
}
Console.WriteLine(BitConverter.ToString(responseBuffer).Replace("-", " "));
clientSocket.Send(responseBuffer);
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
break;
}
}
}
4.4定义启动服务器的方法
/// <summary>
/// 启动服务器
/// </summary>
/// <param name="ip"></param>
/// <param name="port"></param>
public void TCPServerStart(string ip, string port)
{
TCPServerSocket = CreateSocket(ip, port);
CreateThread();
}
4.5在main或需要启动的地方调用
TCPServerStart("127.0.0.1", "15800");
五、小结
C# 的TCP服务端的代码就是这样,总结一下:
1.启动TCP服务端并监听端口
2.开启线程接收服务端监听到的客户端
3.开启线程监听客户端发送的消息,处理并返回需要的结果
六、感谢
感谢各位大佬的莅临,学习之路漫漫,吾将上下而求索。有任何想法请在评论区留言哦!
再次感谢!
文章来源:https://www.toymoban.com/news/detail-799843.html
文章来源地址https://www.toymoban.com/news/detail-799843.html
到了这里,关于[ C# ] C#中TCP服务端的实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!