news 2026/4/3 4:32:01

基于C#的Socket通信聊天程序实战分享

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于C#的Socket通信聊天程序实战分享

socket通信聊天程序,计算机通信成品源码,聊天程序demo,C#编写,含服务器和客户端,使用socket通信,多线程,服务器可以支持多连接,多客户端登录,登录的客户端可以给在线的其它账号发送信息(数据),可一对一或一对多,客户端有断线重连功能。 项目使用VS2017导入项目,共一千多行代码,可直接运行。

在计算机通信的世界里,Socket 是一种强大的工具,今天就来跟大家分享一个用 C# 编写的 Socket 通信聊天程序。这个程序不仅有完整的服务器和客户端代码,还支持多线程、多连接等实用功能。

整体架构概述

这个聊天程序分为服务器端和客户端两大部分。服务器端要支持多个客户端同时登录连接,并且能处理不同客户端之间一对一或一对多的消息发送。客户端则具备断线重连的贴心功能,确保通信的稳定性。

服务器端实现

关键代码片段

using System; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; class Server { private TcpListener listener; private List<TcpClient> clients = new List<TcpClient>(); private Thread listenThread; public Server(int port) { listener = new TcpListener(IPAddress.Any, port); listenThread = new Thread(ListenForClients); listenThread.Start(); } private void ListenForClients() { listener.Start(); while (true) { TcpClient client = listener.AcceptTcpClient(); lock (clients) { clients.Add(client); } Thread clientThread = new Thread(HandleClientComm); clientThread.Start(client); } } private void HandleClientComm(object clientObject) { TcpClient client = (TcpClient)clientObject; NetworkStream stream = client.GetStream(); byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = stream.Read(buffer, 0, buffer.Length))!= 0) { string message = Encoding.UTF8.GetString(buffer, 0, bytesRead); Console.WriteLine($"Received: {message}"); // 处理接收到的消息,这里可以做消息分发等逻辑 // 例如,判断消息格式,根据格式决定是一对一还是一对多发送 lock (clients) { foreach (TcpClient c in clients) { if (c!= client) { NetworkStream clientStream = c.GetStream(); clientStream.Write(buffer, 0, bytesRead); } } } } stream.Close(); client.Close(); lock (clients) { clients.Remove(client); } } }

代码分析

  1. 初始化部分Server类的构造函数中,初始化了TcpListener并开启一个线程listenThread用于监听客户端连接。TcpListener绑定到本地任意 IP 地址和指定端口。
  2. 监听客户端连接ListenForClients方法中,listener.Start()开始监听,然后通过listener.AcceptTcpClient()等待客户端连接。一旦有客户端连接,将其加入clients列表,并开启一个新线程HandleClientComm专门处理该客户端的通信。
  3. 处理客户端通信HandleClientComm方法中,从客户端连接获取NetworkStream用于读写数据。通过stream.Read读取客户端发送的数据,然后简单地将数据广播给其他所有客户端(实际应用中可以根据消息格式实现一对一或一对多发送逻辑)。最后,当客户端断开连接时,关闭流和客户端连接,并从clients列表中移除。

客户端实现

关键代码片段

using System; using System.Net.Sockets; using System.Text; using System.Threading; class Client { private TcpClient client; private NetworkStream stream; private Thread receiveThread; private string serverIp; private int serverPort; public Client(string ip, int port) { serverIp = ip; serverPort = port; Connect(); } private void Connect() { while (true) { try { client = new TcpClient(serverIp, serverPort); stream = client.GetStream(); receiveThread = new Thread(ReceiveMessages); receiveThread.Start(); break; } catch (Exception ex) { Console.WriteLine($"Connection failed: {ex.Message}. Retrying in 5 seconds..."); Thread.Sleep(5000); } } } private void ReceiveMessages() { byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = stream.Read(buffer, 0, buffer.Length))!= 0) { string message = Encoding.UTF8.GetString(buffer, 0, bytesRead); Console.WriteLine($"Received: {message}"); } stream.Close(); client.Close(); Connect(); } public void SendMessage(string message) { if (client.Connected) { byte[] buffer = Encoding.UTF8.GetBytes(message); stream.Write(buffer, 0, buffer.Length); } else { Console.WriteLine("Not connected. Cannot send message."); } } }

代码分析

  1. 初始化与连接Client类构造函数接收服务器 IP 和端口,然后调用Connect方法尝试连接服务器。在Connect方法中,使用try - catch块处理连接失败的情况,如果连接失败,会提示错误信息并在 5 秒后重试,直到连接成功。连接成功后开启一个线程receiveThread用于接收服务器发送的消息。
  2. 接收消息ReceiveMessages方法从NetworkStream中读取数据,将其转换为字符串并输出到控制台。当读取到流结束(即服务器关闭连接)时,关闭流和客户端连接,并重新调用Connect方法尝试重连。
  3. 发送消息SendMessage方法首先检查客户端是否已连接,若已连接则将消息转换为字节数组并通过NetworkStream发送给服务器,否则提示未连接不能发送消息。

项目使用说明

这个项目使用 VS2017 导入即可,总共一千多行代码,导入后可直接运行。无论是想深入学习 Socket 通信原理,还是想在其基础上开发更复杂的聊天应用,这个项目都是一个不错的起点。

socket通信聊天程序,计算机通信成品源码,聊天程序demo,C#编写,含服务器和客户端,使用socket通信,多线程,服务器可以支持多连接,多客户端登录,登录的客户端可以给在线的其它账号发送信息(数据),可一对一或一对多,客户端有断线重连功能。 项目使用VS2017导入项目,共一千多行代码,可直接运行。

希望通过这篇博文,能让大家对基于 C# 的 Socket 通信聊天程序有更清晰的认识和理解,大家可以根据实际需求对代码进行扩展和优化。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/30 10:13:00

探索MATLAB图像检索的多样世界

MATLAB图像检索&#xff0c;有各种方法的&#xff0c;词袋的&#xff0c;颜色特征&#xff0c;形状特征&#xff0c;hu不变矩&#xff0c;lbp纹理特征等在图像处理领域&#xff0c;图像检索一直是个热门话题。MATLAB作为强大的工具&#xff0c;为我们提供了实现多种图像检索方法…

作者头像 李华
网站建设 2026/4/1 4:52:31

ArcGIS大师之路500技---062调整面要素到指定面积

文章目录前言一、需求说明二、比例工具的使用前言 本文介绍使用ArcGIS比例工具实现调整面要素至指定面积。 一、需求说明 我们有一个面要素类&#xff0c;然后绘制一个圆形&#xff0c;添加面积字段&#xff0c;并计算其面积为&#xff1a;53895.2892平方米。 目标&#xff1…

作者头像 李华
网站建设 2026/3/31 12:45:04

【课程设计/毕业设计】基于微信小程序的健康生活服务系统设计与实现基于django+微信小程序的健康生活系统【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/1 1:53:13

电机NVH分析之根原因查找与谐波计算工具探索

电机NVH分析&#xff0c;根原因查找。 定子,转子谐波次数与电磁力波次数对应关系表。 excel格式&#xff0c;输入极槽等参数可以自动计算。在电机领域&#xff0c;NVH&#xff08;Noise, Vibration, Harshness&#xff0c;噪声、振动与声振粗糙度&#xff09;分析至关重要&…

作者头像 李华
网站建设 2026/4/3 0:09:37

知网vs维普AIGC检测对比:哪个更严?实测数据告诉你答案

知网vs维普AIGC检测对比&#xff1a;哪个更严&#xff1f;实测数据告诉你答案 TL;DR&#xff1a;同一篇论文&#xff0c;知网和维普的AIGC检测结果可能相差20%-46%。实测发现维普检测更严格&#xff0c;知网相对宽松。以学校指定平台为准是第一原则。不管用哪个平台检测&#x…

作者头像 李华
网站建设 2026/4/1 21:37:48

【开题答辩全过程】以 高校体育赛事管理系统的设计与实现为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

作者头像 李华