c#TCP聊天室实现
时间: 2025-07-24 22:17:19 AIGC 浏览: 18
### C# TCP 聧谈室实现示例
在C#中实现一个TCP聊天室需要使用`System.Net.Sockets`命名空间中的类,例如`TcpListener`和`TcpClient`。以下是一个简单的TCP聊天室的实现示例,包括服务器端和客户端代码。
#### 服务器端代码
服务器端负责监听客户端连接,并将消息广播给所有连接的客户端。
```csharp
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
class TcpChatServer
{
private static List<TcpClient> _clients = new List<TcpClient>();
private static bool _isRunning = true;
public static void Main()
{
TcpListener listener = new TcpListener(IPAddress.Any, 13000);
listener.Start();
Console.WriteLine("Server started. Waiting for connections...");
Thread listenThread = new Thread(() =>
{
while (_isRunning)
{
try
{
TcpClient client = listener.AcceptTcpClient();
_clients.Add(client);
Console.WriteLine("Client connected.");
Thread clientThread = new Thread(HandleClient);
clientThread.Start(client);
}
catch (Exception ex)
{
if (_isRunning)
Console.WriteLine($"Error: {ex.Message}");
}
}
});
listenThread.Start();
Console.ReadLine(); // Keep the server running until user input
_isRunning = false;
listener.Stop();
Console.WriteLine("Server stopped.");
}
private static void HandleClient(object obj)
{
TcpClient client = (TcpClient)obj;
NetworkStream stream = client.GetStream();
byte[] buffer = new byte[1024];
try
{
while (true)
{
int bytesRead = stream.Read(buffer, 0, buffer.Length);
if (bytesRead == 0)
break;
string message = Encoding.UTF8.GetString(buffer, 0, bytesRead);
BroadcastMessage(message, client);
}
}
catch
{
// Client disconnected
}
finally
{
lock (_clients)
{
_clients.Remove(client);
}
client.Close();
}
}
private static void BroadcastMessage(string message, TcpClient sender)
{
lock (_clients)
{
foreach (var client in _clients)
{
if (client != sender)
{
try
{
NetworkStream stream = client.GetStream();
byte[] buffer = Encoding.UTF8.GetBytes(message);
stream.Write(buffer, 0, buffer.Length);
}
catch
{
_clients.Remove(client);
client.Close();
}
}
}
}
}
}
```
#### 客户端代码
客户端负责连接到服务器并发送/接收消息。
```csharp
using System;
using System.Net.Sockets;
using System.Text;
using System.Threading;
class TcpChatClient
{
private static TcpClient _client;
private static NetworkStream _stream;
public static void Main()
{
try
{
_client = new TcpClient("127.0.0.1", 13000);
_stream = _client.GetStream();
Thread receiveThread = new Thread(ReceiveMessages);
receiveThread.Start();
while (true)
{
Console.Write("Enter message: ");
string message = Console.ReadLine();
Send_message(message);
}
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
finally
{
_client?.Close();
}
}
private static void Send_message(string message)
{
byte[] buffer = Encoding.UTF8.GetBytes(message);
_stream.Write(buffer, 0, buffer.Length);
}
private static void ReceiveMessages()
{
byte[] buffer = new byte[1024];
while (true)
{
try
{
int bytesRead = _stream.Read(buffer, 0, buffer.Length);
if (bytesRead > 0)
{
string message = Encoding.UTF8.GetString(buffer, 0, bytesRead);
Console.WriteLine($"Received: {message}");
}
}
catch
{
Console.WriteLine("Disconnected from server.");
break;
}
}
}
}
```
### 说明
- 服务器端通过`TcpListener`监听客户端连接,并为每个客户端创建一个线程来处理消息。
- 客户端通过`TcpClient`连接到服务器,并在一个单独的线程中接收消息[^1]。
- 消息以UTF-8编码的形式在客户端和服务器之间传输。
#### 注意事项
- 上述代码仅为简单示例,实际应用中需要考虑异常处理、线程安全等问题。
- 在生产环境中,建议使用更高级的通信协议(如WebSocket或MQTT)来替代原始TCP连接[^2]。
阅读全文
相关推荐


















