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); } } }代码分析
- 初始化部分:
Server类的构造函数中,初始化了TcpListener并开启一个线程listenThread用于监听客户端连接。TcpListener绑定到本地任意 IP 地址和指定端口。 - 监听客户端连接:
ListenForClients方法中,listener.Start()开始监听,然后通过listener.AcceptTcpClient()等待客户端连接。一旦有客户端连接,将其加入clients列表,并开启一个新线程HandleClientComm专门处理该客户端的通信。 - 处理客户端通信:
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."); } } }代码分析
- 初始化与连接:
Client类构造函数接收服务器 IP 和端口,然后调用Connect方法尝试连接服务器。在Connect方法中,使用try - catch块处理连接失败的情况,如果连接失败,会提示错误信息并在 5 秒后重试,直到连接成功。连接成功后开启一个线程receiveThread用于接收服务器发送的消息。 - 接收消息:
ReceiveMessages方法从NetworkStream中读取数据,将其转换为字符串并输出到控制台。当读取到流结束(即服务器关闭连接)时,关闭流和客户端连接,并重新调用Connect方法尝试重连。 - 发送消息:
SendMessage方法首先检查客户端是否已连接,若已连接则将消息转换为字节数组并通过NetworkStream发送给服务器,否则提示未连接不能发送消息。
项目使用说明
这个项目使用 VS2017 导入即可,总共一千多行代码,导入后可直接运行。无论是想深入学习 Socket 通信原理,还是想在其基础上开发更复杂的聊天应用,这个项目都是一个不错的起点。
socket通信聊天程序,计算机通信成品源码,聊天程序demo,C#编写,含服务器和客户端,使用socket通信,多线程,服务器可以支持多连接,多客户端登录,登录的客户端可以给在线的其它账号发送信息(数据),可一对一或一对多,客户端有断线重连功能。 项目使用VS2017导入项目,共一千多行代码,可直接运行。
希望通过这篇博文,能让大家对基于 C# 的 Socket 通信聊天程序有更清晰的认识和理解,大家可以根据实际需求对代码进行扩展和优化。