c# - 多个客户端异步连接,同步发送/接收

标签 c# sockets client-server

我是 C#、OOP、网络和 TCP/IP 套接字的新手...

我对异步 TCP/IP 套接字通信的使用有误解。
我正在尝试创建一个等待多个客户端的服务器,并且每次客户端连接时,它都会显示类似“用户 192.168.1.105:2421 已加入”的内容

我认为当您使用 BeginAccept() 时,将创建一个新线程……每当有新用户连接时,它将负责与该特定客户端的通信。但是,以下代码块......并且不显示第二个客户端的消息。

我应该改变什么,以便为每个连接的客户端我有一个单独的线程来处理执行?

class Server
{
    Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    //constructor 
    public Server()
    {
        listener.Bind(new IPEndPoint(IPAddress.Parse("192.168.1.100"), 9050));
        listener.Listen(10);
        listener.BeginAccept(new AsyncCallback(OnConnectRequest), listener);
        Console.Write("Server Running...\r\n");
    }

    public void OnConnectRequest(IAsyncResult ar)
    {
        Socket listener = (Socket)ar.AsyncState;
        NewConnection(listener.EndAccept(ar));
        listener.BeginAccept(new AsyncCallback(OnConnectRequest), listener);
    }

    //send a string message over a TCP socket 
    public void sendMSG(string msg,Socket socket)
    {
     //some code which sends data according to my protocol
    }

    public byte[] receiveMSG(ref Socket socket)
    {
     //some code which receives data according to my protocol
    }


    //function called whenever a NEW CLIENT is connected
    public void NewConnection(Socket sockClient)
    {
        Console.WriteLine("user {0} has joined",sockClient.RemoteEndPoint);
        byte[] msg = new byte[20];
        sockClient.Receive(msg);
    }

最佳答案

BeginAccept()接受一个请求,因此您的异步回调只会为第一个请求调用一次。这是标准的 C# 异步模式。

如果您想接受多个请求,您需要调用BeginAccept()当您处理完您的请求后再次。

另见 Asynchronous server socket multiple clients .

编辑:

您应该调用 BeginAccept() EndAccept()之间和 NewConnection()如果您想允许并发请求:

public void OnConnectRequest(IAsyncResult ar)
{
    Socket listener = (Socket)ar.AsyncState;
    Socket accepted = listener.EndAccept(ar);
    listener.BeginAccept(new AsyncCallback(OnConnectRequest), listener);
    NewConnection(accepted);
}

关于c# - 多个客户端异步连接,同步发送/接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14031720/

相关文章:

c# - 在 XML 功能区中以编程方式访问功能区元素

c# - 具有多个客户端和 Web 界面的复杂套接字应用程序

c++ - 通过本地 UNIX 套接字发送双倍

apache - 一段时间后使用 HTTP 连接的 FIN pkt

c# - 只读取以特定前缀开头的行

c# - 准时双排版

c++ - 从服务器套接字创建守护进程处理

java - 桌面 TCP 流式传输 (java)

qt - QSslSocket:无法解析 SSLV2_client_method

xml - 避免 XML 响应中不需要的 XML 结构