【问题标题】:C# TcpListener AcceptSocket does not work in separate threadC# TcpListener AcceptSocket 在单独的线程中不起作用
【发布时间】:2012-12-26 04:17:38
【问题描述】:

我有一个基于 TcpListener 的简单 TCP 服务器。因为我想在 Windows 窗体应用程序中使用它,所以我让它在一个单独的线程中运行,如下所示:

 public void Start() {          
        this.serverThread = new Thread(new ThreadStart(this.ThreadProcess));
        this.serverThread.Name = "Tcp-Server";
        this.serverThread.Start();
    }
 protected void ThreadProcess() {
        try
        {
            IPAddress ipAd = IPAddress.Parse("169.254.42.86");
            this.listener = new TcpListener(ipAd, this.port);
            this.listener.Start();
            Socket mySocket = this.listener.AcceptSocket();
            while (true)
            {                    
                if (mySocket.Connected)
                {                        
                    byte[] RecvBytes = new byte[8192];
                    int byteNo = mySocket.Receive(RecvBytes, RecvBytes.Length, 0);                     
                    ASCIIEncoding asen = new ASCIIEncoding();
                    mySocket.Send(asen.GetBytes("srv reply msg"));                     
                }
                else
                {
                    WriteLine("socket not connected.");
                }
            }
        }
        finally {
            StopListener();
        }
    }

如果我在控制台应用程序中将此服务器用作:

static void Main(string[] args)
    {
        try
        {                
            int port = 8001;
            Server server = new Server(port);
            server.Start();                             
            while (true) {
                //server is running in separate thread          
            }   
            ...

一切都按预期进行。但是,当我尝试将它包含在单击按钮时启动服务器的 Windows 窗体应用程序中时,代码不再起作用。服务器线程正在启​​动,但它不接受任何套接字。 有什么我想念的吗?我一直在谷歌上搜索高低没有结果...... 感谢您的帮助!

【问题讨论】:

  • 我看不出代码不能在 Windows 窗体应用程序中运行的任何原因。问题似乎出在其他地方。
  • 可能会发生异常并调用 StopListener。这是一个 TCP 连接,客户端断开不正确会导致异常,你应该在循环中尝试一下以弥补这一点
  • 能否请您发布在 WinForms 应用程序中启动套接字的确切方法?我怀疑它可能在那里,但我们不知道它看起来如何......

标签: c# winforms multithreading tcplistener


【解决方案1】:

不是真正的答案,但在 cmets 中输入太多:

调试此问题的最简单方法是在同一线程中调用ThreadProcess() 方法:

public void Start() {          
    ThreadProcess();
    //this.serverThread = new Thread(new ThreadStart(this.ThreadProcess));
    //this.serverThread.Name = "Tcp-Server";
    //this.serverThread.Start();
}

然后,您可以单步执行您的代码,看看会发生什么。只要您点击this.listener.AcceptSocket(); 行,您的应用程序就会阻塞,但您应该能够连接到它。

通常问题是每个人都忽略了一些愚蠢的事情,比如没有调用 Start() 方法。

【讨论】:

  • 我就是这样做的,正如你所说,应用程序阻塞了,但监听器仍然不接受套接字。我对它进行了三重检查,并且同一段代码在控制台应用程序中工作。
  • this.port 是您要连接的端口吗?还可以尝试使用IPAddress.Any 作为侦听器地址,而不是硬编码特定地址。
猜你喜欢
  • 1970-01-01
  • 2017-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-23
  • 1970-01-01
相关资源
最近更新 更多