多个客户端的TcpListener句柄

时间:2017-05-09 08:10:29

标签: tcplistener

我创建了MyListener,它将在创建时开始在自己的线程上监听(使用TcpListener)。 TcpListener应该处理多个客户端,所以我在infinte中运行,并在特殊任务中处理每个客户端。

这是我的代码:

public class MyListener
{
    public event EventHandler<MessageEventArgs> MessageReceived;

    public MyListener()
    {
        var thread = new Thread(Listen);
        thread.Start();
    }

    private void Listen()
    {
        TcpListener server = null;

        try
        {
            server = new TcpListener(IPAddress.Any, 8977);
            server.Start();

            while (true)
            {
                var client = server.AcceptTcpClient();
                Task.Run(() =>
                {
                    try
                    {
                        var msg = GetMessageFromClient(client);
                        MessageReceived?.Invoke(this, new MessageEventArgs { Message = msg });
                    }
                    catch (Exception)
                    {


                    }
                    finally
                    {
                        client.Close();
                    }
                });
            }
        }
        catch (Exception)
        {

        }
        finally
        {
            if (server != null)
                server.Stop();
        }

    }

    private string GetMessageFromClient(TcpClient client)
    {
        var bytes = new byte[client.ReceiveBufferSize];
        var stream = client.GetStream();
        var i = stream.Read(bytes, 0, bytes.Length);
        var message = Encoding.UTF8.GetString(bytes, 0, i);
        return message;
    }
}

这是我的问题:

  1. 我如何确保任务处理客户端将使用我在启动任务时传递给它的客户端而不是不同的客户端(因为在任务启动后我们返回到AcceptTcpClient方法并且可能获得新客户端)
  2. 在我的示例中,并且使用相同的方法处理多个客户端(&#34; GetMessageFromClient&#34;)我是否需要对此进行某种锁定 方法

0 个答案:

没有答案