TCP/IP连接与多线程说话聊天应用程序



我有一个像这样的TCP聊天服务器代码示例,它正确地创建了多个线程,但它没有将消息发送到所有线程。我希望消息被发送到所有线程,像一个组聊天。你能帮我吗?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Threading;
class NewClient
{
public Socket newServerSocket;
public NewClient(Socket client)
{
this.newServerSocket = client;
}
public void speakWithClient()
{
int recv;
byte[] data = new byte[1024];
IPEndPoint clientep = (IPEndPoint) newServerSocket.RemoteEndPoint;
Console.WriteLine("Connected with {0} at port {1}",
clientep.Address, clientep.Port);

string welcome = "Welcome to my test server";
data = Encoding.ASCII.GetBytes(welcome);
newServerSocket.Send(data, data.Length,SocketFlags.None);

在这里,它将给定的消息发送回客户端,但它不会将消息发送给所有线程。

while (true)
{
data = new byte[1024];
recv = newServerSocket.Receive(data);
if (recv == 0)
break;
Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
newServerSocket.Send(data, recv, SocketFlags.None);
}
Console.WriteLine("Disconnected from {0}",
clientep.Address);
newServerSocket.Close();
}

}
class SimpleTcpSrvr
{
public static void Main()
{
int recv;
byte[] data = new byte[1024];
IPEndPoint ipep = new IPEndPoint(IPAddress.Any,9060);
Socket newsock = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, 
ProtocolType.Tcp);
newsock.Bind(ipep);
newsock.Listen(10);
Console.WriteLine("Waiting for a client...");
while (true)
{
Socket client = newsock.Accept();
NewClient threadliclient = new NewClient(client);
Thread newthread = new Thread(new ThreadStart(threadliclient.speakWithClient));
newthread.Start();
}

}
}

自从我做任何套接字编程以来已经有一段时间了,但是……难道您不需要保存客户端套接字的列表,并在每次接收消息时遍历它们吗?

public static List<Socket> Clients = new List<Socket>();
while (true)
{
Socket client = newsock.Accept();
Clients.Add(client);
NewClient threadliclient = new NewClient(client);
Thread newthread = new Thread(new ThreadStart(threadliclient.speakWithClient));
newthread.Start();
}
public void speakWithClient()
{
int recv;
byte[] data = new byte[1024];
IPEndPoint clientep = (IPEndPoint) newServerSocket.RemoteEndPoint;
Console.WriteLine("Connected with {0} at port {1}", clientep.Address, clientep.Port);
string welcome = "Welcome to my test server";
data = Encoding.ASCII.GetBytes(welcome);

newServerSocket.Send(data, data.Length,SocketFlags.None);
while (true)
{
data = new byte[1024];
recv = newServerSocket.Receive(data);
if (recv == 0)
break;
Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
foreach (Socket client in SimpleTcpSrvr.Clients)
{
client.Send(data, recv, SocketFlags.None);
}
}

最新更新