当前位置: 首页 > news >正文

基于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 通信聊天程序有更清晰的认识和理解,大家可以根据实际需求对代码进行扩展和优化。

http://www.cnnetsun.cn/news/704243.html

相关文章:

  • 整车性能仿真:Cruise与Matlab联合的五年经验分享
  • 大学校园体育运动会管理系统开题报告
  • 探索基于 S7 - 200 的消防泵稳压控制系统程序
  • 探索基于五次多项式的智能车横向避障模型
  • 毕业季必备:5款降AI工具帮你论文顺利通关
  • 【开题答辩全过程】以 基于springboot的医药公司药品仓库管理系统为例,包含答辩的问题和答案
  • 配电网二阶锥节点电价(DLMP)优化模型MATLAB代码功能介绍
  • SCI投稿必备:6款期刊级降AI工具深度测评
  • 2026年8款免费降AI率工具实测推荐,亲测有效
  • 机构级项目和散户项目的分水岭,就一句话
  • 盘点全网最火的5款论文降AI神器:AI率狂飙90%怎么办?这几款工具一键去除AI痕迹
  • AI赋能智汇高校 - 从零掌握大模型本地部署与微调全流程
  • 小程序计算机毕设之基于nodejs的大众点评美食版小程序美食点餐下单(完整前后端代码+说明文档+LW,调试定制等)
  • 计算机小程序毕设实战-基于nodejs的大众点评点餐美食版小程序【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 手把手教你用逻辑重构法降AI,不伤文不伤术语
  • 2026年8款免费降AI率工具实测推荐,毕业论文党必收藏
  • 基于python的知识产权代管理系统设计与实现
  • JSM466M 低功耗高灵敏度全极霍尔开关芯片
  • 范式转移:从基于规则的“特征码”到基于统计的“特征向量”
  • 黑盒之光——机器学习三要素在安全领域的投影
  • 野路子编问卷 VS 科学设计?宏智树 AI 让实证数据告别 “无效废纸”
  • AI 写论文哪个软件最好?实测宏智树 AI:把毕业论文写成 “优秀范本” 的智能神器
  • 9 款 AI 写论文哪个好?实测封神!宏智树 AI 凭硬核实力 C 位领跑
  • 测试的创造性:AI无法替代的人类灵感
  • AI测试工具的同质化危机:创新停滞的警示
  • 【计算机毕业设计案例】基于net+微信小程序的智慧城建市容监察管理系统设计(程序+文档+讲解+定制)
  • 【转行网安全攻略】非常详细的零基础路线:从入门到精通,收藏这一篇就够!
  • mybatis - 动态语句、批量注册mapper、分页插件
  • springMvc 快速体验
  • 电力线路器材行业LIMS系统应用全解析