news 2026/4/18 13:12:12

基于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/4/18 5:42:22

交变磁场下含感应材料沥青路面温度:奇妙的物理与技术融合

交变磁场下含感应材料沥青路面温度在道路工程领域&#xff0c;沥青路面是我们再熟悉不过的存在。然而&#xff0c;你是否想过&#xff0c;通过交变磁场与含感应材料的结合&#xff0c;能让沥青路面的温度产生神奇的变化&#xff1f;这背后蕴含着有趣的物理原理和潜在的应用价值…

作者头像 李华
网站建设 2026/4/18 7:04:52

昆仑通态直接控制变频器程序及通讯那些事儿

昆仑通态直接控制变频器程序及通讯。在工业自动化领域&#xff0c;昆仑通态人机界面与变频器的协同工作是实现精准控制与高效生产的关键环节。今天就来唠唠昆仑通态如何直接控制变频器程序及通讯。 一、通讯基础准备 昆仑通态与变频器通讯&#xff0c;首先要明确通讯协议。常见…

作者头像 李华
网站建设 2026/4/17 22:04:35

django基于数据挖掘技术的台风灾害预测系统-计算机毕业设计源码+无LW文档

Django基于大数据旅游数据分析与推荐系统的设计与实现 摘要 本文阐述了一个基于Django框架&#xff0c;结合大数据技术的旅游数据分析与推荐系统的设计与实现过程。该系统旨在利用大数据分析技术深入挖掘旅游数据&#xff0c;为游客提供精准的旅游推荐和全面的旅游资讯&#xf…

作者头像 李华
网站建设 2026/4/18 5:23:11

永磁同步电机(PMSM)矢量控制之旅:从理论到MATLAB仿真

永磁同步电机(PMSM)矢量控制&#xff0c;坐标变换到d-q轴后&#xff0c;采用SVPWM调制算法&#xff0c;进行速度电流双闭环控制&#xff0c;控制算法为PID&#xff0c;仿真结果如图所示。 (默认发MATLAB R2018b版本)永磁同步电机&#xff08;PMSM&#xff09;因其高效、功率密度…

作者头像 李华
网站建设 2026/4/18 11:25:33

英文论文降AI工具横评:留学生亲测这3款最靠谱

英文论文降AI工具横评&#xff1a;留学生亲测这3款最靠谱 TL;DR&#xff1a;留学生英文论文降AI首选AIGCleaner&#xff08;达标率95%&#xff0c;支持Turnitin/GPTZero&#xff09;&#xff0c;其次是HumText&#xff08;专注学术英文&#xff0c;6.8元起&#xff09;&#xf…

作者头像 李华
网站建设 2026/4/18 7:33:51

Google Cloud与AWS大数据AI服务对比(2026)

Google Cloud 与 AWS 的大数据 AI 服务&#xff0c;核心差异在于 “GCP 强 AI 原生与数据密集型任务性价比&#xff0c;AWS 胜在生态完整与企业级灵活可控”。选 GCP 优先用于深度学习、实时分析、生成式 AI 与数据仓库&#xff1b;选 AWS 优先用于企业级 MLOps、混合云、多元数…

作者头像 李华