0

tcpクライアントリスニング機能を実装しようとしています。これは、サーバーとの接続が確立された後、このtcpクライアントがそこに座って新しいデータが到着するのを待つことを意味します。これが私のコードですが、実行すると、ネットワークストリームから何も読み取れなかったと文句を言います。しかし、サーバーはまだデータの送信を開始していません。不平はtcpクライアントのタイムアウトが原因だと思います。

これは正しい方法ですか?

   public void listen(dataHandler processDataFuc)
    {
        NetworkStream stream;

        Byte[] data_buffer = new Byte[MAX_PACKET_SIZE];

        if(!this.Connected)
        {
            this.Connect();
        }

        while (!this.terminate_listening)
        {
            stream = main_client.GetStream();

            while (stream.Read(data_buffer, 0, data_buffer.Length) > 0)
            {
                processDataFuc(data_buffer);
            }
        }
    }

ありがとう

4

3 に答える 3

1

短い答えはイエスです。それはあなたが望むことをしますが、理想的ではありません。同じストリームを何度も取得しているだけなので、最初にループから移動stream = main_client.GetStream();することをお勧めします。whileまた、NetworkStream.Read断続的なデータが長期間にわたって予想される場合は、その 1 つのタスクのためだけにスレッドを保持しているため、連続読み取りを実行するのに最適な方法ではありません。コールバックを使用BeginReadして渡すと、すぐに返されますが、後でデータが利用可能になったときに (コールバックを介して) 警告されます。

于 2009-11-06T00:38:44.200 に答える
0

実行したいことの例については、メソッドEstablishConnection()およびIncomingDataSyncWorker()(同期)またはIncomingPacketHandler() (非同期)を確認してください。これらのメソッドはすべて、オープンソースのネットワーク通信ライブラリであるnetworkComms.netの一部です。

于 2011-12-26T09:46:03.743 に答える
0

使用している .Net のバージョンは何ですか?
.Net 4.0 または 4.5 を使用している場合は、ReadAsync()代わりに を使用できますRead()
このことを考慮:

public async void listen(dataHandler processDataFuc)
{
    NetworkStream stream;

    Byte[] data_buffer = new Byte[MAX_PACKET_SIZE];

    if(!this.Connected)
        this.Connect();

    stream = main_client.GetStream();

    while (!this.terminate_listening)
    {            
        await stream.ReadAsync(data_buffer, 0, data_buffer.Length)
        processDataFuc(data_buffer);
    }
}  

このようにReadAsync()して、サーバーがデータを送信するまで別のスレッドで待機します。その後、残りのコードが実行されます。

于 2012-12-06T08:44:20.233 に答える