TCP聊天服务程序类怎么写
时间: 2023-07-26 19:15:25 浏览: 45
下面是一个简单的TCP聊天服务程序类的示例代码:
```c#
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
public class TcpChatServer
{
private TcpListener listener;
private readonly ManualResetEvent allDone = new ManualResetEvent(false);
private readonly StringBuilder sb = new StringBuilder();
public void Start(int port)
{
try
{
listener = new TcpListener(IPAddress.Any, port);
listener.Start();
Console.WriteLine("TCP chat server started on port " + port);
while (true)
{
allDone.Reset();
listener.BeginAcceptTcpClient(new AsyncCallback(ClientConnected), listener);
allDone.WaitOne();
}
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex.Message);
}
}
private void ClientConnected(IAsyncResult ar)
{
allDone.Set();
TcpListener listener = (TcpListener)ar.AsyncState;
try
{
TcpClient client = listener.EndAcceptTcpClient(ar);
Console.WriteLine("Client connected: " + client.Client.RemoteEndPoint);
Thread thread = new Thread(new ParameterizedThreadStart(ClientThread));
thread.Start(client);
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex.Message);
}
}
private void ClientThread(object obj)
{
TcpClient client = (TcpClient)obj;
NetworkStream stream = client.GetStream();
try
{
byte[] buffer = new byte[1024];
int bytesRead;
while (true)
{
bytesRead = stream.Read(buffer, 0, buffer.Length);
if (bytesRead > 0)
{
string message = Encoding.UTF8.GetString(buffer, 0, bytesRead);
sb.Append(message);
if (sb.ToString().IndexOf("\r\n") > -1)
{
string[] messages = sb.ToString().Split(new[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
foreach (string msg in messages)
{
Console.WriteLine(client.Client.RemoteEndPoint + ": " + msg);
Broadcast(client, msg);
}
sb.Clear();
}
}
else
{
break;
}
}
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex.Message);
}
finally
{
client.Close();
Console.WriteLine("Client disconnected: " + client.Client.RemoteEndPoint);
}
}
private void Broadcast(TcpClient sender, string message)
{
byte[] buffer = Encoding.UTF8.GetBytes(message + "\r\n");
foreach (TcpClient client in listener.Pending())
{
if (client != null && client != sender)
{
NetworkStream stream = client.GetStream();
stream.Write(buffer, 0, buffer.Length);
}
}
}
public void Stop()
{
if (listener != null)
{
listener.Stop();
Console.WriteLine("TCP chat server stopped");
}
}
}
```
这个示例代码实现了一个TCP聊天服务程序,它监听指定的端口并接受客户端连接,每个客户端连接都会启动一个新线程处理。客户端发送的消息会广播给所有连接的客户端。你可以在控制台上运行这个程序并使用Telnet或其他TCP客户端连接到它来测试。