【发布时间】:2013-01-20 23:13:27
【问题描述】:
static void Main(string[] args)
{
Console.Title = "Socket Server";
Console.WriteLine("Listening for client messages");
Socket serverSocket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
IPAddress serverIp = IPAddress.Any;
IPEndPoint serverEP = new IPEndPoint(serverIp, 8000);
SocketPermission socketPermission = new SocketPermission(NetworkAccess.Accept,
TransportType.Tcp,
"127.0.0.1", 8000);
serverSocket.Bind(serverEP);
serverSocket.Listen(2);
while(true)
{
//Socket connection = serverSocket.Accept();
connection = serverSocket.Accept();
Thread clientThread = new Thread(new ParameterizedThreadStart(MultiUser));
clientThread.Start(connection);
}
}
public static void MultiUser(object connection)
{
byte[] serverBuffer = new byte[10025];
string message = string.Empty;
int bytes = ((Socket)connection).Receive(serverBuffer, serverBuffer.Length, 0);
message += Encoding.ASCII.GetString(serverBuffer, 0, bytes);
Console.WriteLine(message);
TcpClient client = new TcpClient();
client.Client = ((Socket)connection);
IntPtr handle = client.Client.Handle;
}
我想写一个聊天程序,它有一个服务器和两个客户端。问题是,我无法通过服务器将来自客户端 1 的消息定向到客户端 2。服务器如何区分线程,以便将收到的消息从client1发送到client2?
【问题讨论】:
-
一种简单的方法是创建一个
Message类,其中包含to、from、message等字段......然后将此对象发送到您的服务器.然后,您的服务器可以读取to字段并将其发送给另一个客户端。 -
您需要保留一个已连接客户端的列表(散列、向量),对其进行迭代,然后发送给所有其他个客户端。由于您使用的是线程,因此在访问该列表时需要提供一些互斥。
-
@HunterMcMillen 如果两个客户端都使用“127.0.0.1”,我如何通过创建 Message 类来区分它们?
-
您应该使用异步套接字而不是创建自己的线程——更具可扩展性。
标签: c# multithreading sockets tcpclient