0

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 フォーム アプリケーションにそれを含めようとすると、コードが機能しなくなります。サーバー スレッドが起動されていますが、ソケットを受け入れません。私が見逃しているものはありますか?私は結果なしでグーグルで高低を検索してきました...助けてくれてありがとう!

4

1 に答える 1

0

実際には答えではありませんが、コメントを入力するには多すぎます。

この問題をデバッグする最も簡単な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()通常、問題は、メソッドが呼び出されないなど、誰もが見落としている愚かなことです。

于 2013-01-11T15:18:49.283 に答える