我正在努力处理一些简单的代码。但是,我无法完成它。我有这个服务器,它必须接受来自多个客户端的连接(显然是异步的)。所以,我有:
IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, 8082);
TcpListener tcpListener = new TcpListener(IPAddress.Any, 8082);
server = tcpListener.Server;
server.Bind(ipEndPoint);
server.Listen(4);
server.BeginAccept(new AsyncCallback(beginConnection), server);
和
static void beginConnection(IAsyncResult iar)
{
Console.WriteLine("Client connected");
Socket s = (Socket)iar.AsyncState;
server = s.EndAccept(iar);
server.Listen(4);
server.BeginAccept(beginConnection, s);
}
然后,当我尝试连接自己时,第一个客户端工作正常。它只是向该服务器发送一条消息,然后服务器将其发送回客户端。服务器充当回声。但是,当我尝试连接其他客户端时,它不起作用。我也把Console.WriteLine(“客户端连接”),但服务器没有写任何东西。 我该如何解决这个问题?
我想我没有将正确的参数传递给第一个BeginAccept方法。我应该传递tcpListener而不是服务器套接字。
然后我会:
static void beginConnection(IAsyncResult iar)
{
Console.WriteLine("Client connected");
TcpListener tcpListener = (TcpListener)iar.AsyncState;
Socket s = tcpListener.Server.EndAccept(iar);
tcpListener.Server = s; // But I would have this error
server.Listen(2);
server.BeginAccept(beginConnection, s);
}
但我会错误地将其标记出来。在第一个版本中没有任何修改,所以我认为这是代码的第一个版本中的问题。
答案 0 :(得分:2)
首先,您不需要Server
的{{1}}属性。即使没有TcpListener
,您也应该致电Start()
。
其次,还应在Bind
调用EndAccept()
并返回TcpListener
实例,您必须使用该实例发送和接收数据。
我刚才所说的一个简单例子可能会显示为:
TcpClient