-1

そのため、これについて約2週間検索しましたが、正当な答えが見つかりません。

私は 2 つのプロジェクトを持っています。1 つはサーバーで、もう 1 つはクライアントです。

サーバーに一度だけデータを送信してから終了するクライアントコンソールアプリケーションを作成することしかできませんでした。他には何もありません。

では、ネットワーク経由でテキストボックスからサーバーに文字列を送信するクライアントを作成するにはどうすればよいでしょうか。サーバーは常にリッスンします。常に耳を傾けます。一度リッスンしてプログラムを終了するだけでなく、接続を待機し、接続が確立されると、サーバーはクライアントの文字列を受け入れ、文字列を書き込むか、テキストボックスに書き込み、そしてすぐに接続のリッスンに戻ります。

私は Windows フォーム アプリケーションを使用しているため、コンソール アプリケーションの例は必要ありません。

TcpClient と TcpListener を使用できます...

4

1 に答える 1

3

私はこのようにします:

void Loop()
{
    TcpListener l = new TcpListener(IPAddress.Any, Port);
    WaitHandle[] h = new WaitHandle[2];
    h[0] = StopEvent;

    WriteInfo("Listening on port {0}", Port);

    l.Start();
    while (true)
    {
        var r = l.BeginAcceptTcpClient(null, null);
        h[1] = r.AsyncWaitHandle;
        // Wait for next client to connect or StopEvent
        int w = WaitHandle.WaitAny(h);
        if (w == 0)  // StopEvent was set (from outside), terminate loop
            break;
        if (w == 1)
        {
            TcpClient c = l.EndAcceptTcpClient(r);

            c.ReceiveTimeout = 90000;
            c.SendTimeout = 90000;

            // client is connected, spawn thread for it and continue to wait for others
            var t = new Thread(ServeClient);
            t.IsBackground = true;
            t.Start(c);
        }
    }
    l.Stop();

    WriteInfo("Listener stopped");
}

whereLoopは次のような場所で開始されます。

    StopEvent = new ManualResetEvent(false);
    LoopThread = new Thread(Loop);
    LoopThread.Start();

StopEventリスニング ループを終了するために使用されます。ServeClient名前は接続されたクライアントを示し、次のようになります。

    void ServeClient(object State)
    {
        TcpClient c = (TcpClient)State;

        NetworkStream s = c.GetStream();
        try
        {
             // Communicate with your client
        }
        finally
        {
            s.Close();
            c.Close();
        }
    }

これは、任意の .NET アプリケーション (Windows サービス、コンソール、WPF、または WinForms) で機能します。

于 2013-01-13T17:46:24.353 に答える