1

クライアントからメッセージを受信する必要があるクライアント - サーバー アプリケーションがあります。これは、サーバーでリッスンを開始するコードです。

    private void startListening(TcpListener lisener)
    {
        BackgroundWorker backgroundWorker = new BackgroundWorker();
        backgroundWorker.WorkerReportsProgress = true;
        backgroundWorker.DoWork += backgroundWorker_DoWork;
        backgroundWorker.ProgressChanged += backgroundWorker_ProgressChanged;
        backgroundWorker.RunWorkerCompleted += backgroundWorker_RunWorkerCompleted;
        backgroundWorker.RunWorkerAsync();
    }

    private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        string message = string.Empty;
        _socket = _lisener.AcceptSocket();
        connectionAcceptedEvent("Connection accepted from " + _socket.RemoteEndPoint);
        byte[] b = new byte[100];
        int k = _socket.Receive(b);
        for (int i = 0; i < k; i++)
        {
            message += Convert.ToChar(b[i]); // Message from client
        }
    }

これは、サーバーがクライアントからのすべてのメッセージの受信を終了したときのイベントです。この時点で、メッセージ文字列を取得する必要があります。

private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{

}
4

1 に答える 1

4

Resultこれを行うには、各イベント ハンドラーの引数のプロパティを使用します。

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    //...
    e.Result = message;
}

private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    string message = e.Result as string;
    //...
}

余談ですが、新しい文字をmessageに 1 つずつ連結するのは、かなり悪い考えです。StringBuilder毎回まったく新しい中間文字列を作成せずに、文字を追加するために there を使用する必要があります。

于 2013-09-12T14:50:09.190 に答える