0

我正在为一些简单的代码而苦苦挣扎。但是,我无法完成它。我有这个服务器,它必须接受来自多个客户端的连接(显然是异步的)。所以我有:

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("Client connected"),但是服务器什么也没写。我该如何解决这个问题?

我想我没有将正确的参数传递给第一个 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);
}

但是我会遇到我标记它的错误。在第一个版本中没有任何修改,所以我认为这是代码的第一个版本中的问题。

4

1 回答 1

2

首先,您不需要Server. 即使没有 ,TcpListener您也应该简单地调用。Start()Bind

其次,EndAccept()它也应该被调用TcpListener并返回一个TcpClient您必须用于发送和接收数据的实例。

我刚才所说的一个简单的例子可以表示为:

{
    TcpListener listener = new TcpListener(IPAddress.Any, 8082);
    listener.Start();

    AcceptClient();
}

void AcceptClient()
{ 
    listener.BeginAccept(ClientConnected, null);
}

void ClientConnected(IAsyncResult ar)
{
    TcpClient client = listener.EndAccept();
    AcceptClient();

    // Now you can send or receive data using the client variable.
}
于 2013-09-01T09:43:37.313 回答