【问题标题】:multithreading using tcplistener使用 tcplistener 的多线程
【发布时间】:2010-07-08 21:47:40
【问题描述】:

我写了下面的代码从用户那里得到一个字符串(加密的),我需要使用一个线程。

        TcpListener TCPListen = new TcpListener(IP2, port);

        TCPListen.Start();


        TcpClient TCP = TCPListen.AcceptTcpClient();


        NetworkStream NetStream = TCP.GetStream();





        RijndaelManaged RMCrypto = new RijndaelManaged();


        byte[] Key = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16 };
        byte[] IV = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16 };




        CryptoStream CryptStream = new CryptoStream(NetStream,
           RMCrypto.CreateDecryptor(Key, IV),
           CryptoStreamMode.Read);

        StreamReader SReader = new StreamReader(CryptStream);

我的问题是我应该在 TCPListen.Start(); 之后使用线程;否则会出错**(每个套接字地址(协议/网络地址/端口)通常只允许使用一次)** 我该如何解决这个问题?

【问题讨论】:

  • 所以我认为你想接受客户端连接,然后将 TcpClient 工作移动到另一个线程,允许主线程接受另一个客户端。对吗?
  • 这在 MSDN 上有很好的描述。你可能想看看那里;这个问题(stackoverflow.com/questions/706117/socket-programming/…)也很相似。

标签: c#


【解决方案1】:

除了将阻塞调用移动到新线程之外,您还可以使用 BeginConnect、BeginReceive、BeginSend 方法及其对应的 End(Connect | Receive | Send),如 here 所述。

编辑:RE:来自 OP 的以下问题...
您可以调用BeginConnect(),而不是调用Connect(),并提供BeginConnect() 一个在有人连接时调用的方法(称为“回调”)。这个回调将被调用,以便您可以做任何您需要做的工作。您的代码应该做的第一件事是调用EndConnect()。问题是调用Connect() 会阻塞(即停止该线程上的所有代码执行),直到它返回。使用BeginXXX()EndXXX() 辅助解决此问题。这个话题实在是太丰富了,无法在这里进行任何有用的深度解释。在上面链接的 MSDN 文档中学习。如果您在使用一段时间后有具体问题,请将其发回此处,我会尽力回答。 :)

【讨论】:

  • 你能给我详细一点吗?
【解决方案2】:

您只需为每个端口设置一个侦听器,因为连接请求会排队,然后分配它们自己的 TCP 客户端。您可以查看下面的链接以获取更多信息,但本质上您不应该尝试附加多个侦听器,而且我认为新线程不会让您这样做。

http://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    • 2012-12-26
    • 2012-10-28
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多