0

TcpClient を使用してデータをバイトとして送信しましたが、データのバイトではなく独自のクラスを送信したいと考えていました。

データのバイトとは、次のようにバイトに変換されたデータを送信することを意味します。

using (MemoryStream bufferStream = new MemoryStream())
{
    using (BinaryWriter bufferData = new BinaryWriter(bufferStream))
    {
        // Simple PONG Action
        bufferData.Write((byte)10);
    }

    _logger.Info("Received PING request, Sending PONG");
    return bufferStream.ToArray();
}

代わりに、サイズやw / eを宣言することなく、このように送信したいと思います

public class MyCommunicationData
{
    public ActionType Action { get; set; }
    public Profile User { get; set; }
    ...
}

通常、データをバイトとして送信する場合、最初の 5 バイトを使用してアクションとメッセージ サイズを示します。

しかし、すべてのデータを単一のクラスとしてシリアル化するように移行した場合、それがどのようなアクションとサイズであるか、またはシリアル化されたメッセージを使用して、クライアントとサーバーが何を読み取るべきかなどを知る必要があるか、またはそうする方法がありますか?シリアル化オブジェクトから指定する必要なく送信しますか?

ここで問題があるかどうかはわかりませんAsyncCallbackが、ネットワーク ストリームの読み取りと書き込みに使用しています。

_networkStream = _client.tcpClient.GetStream();
_callbackRead = new AsyncCallback(_OnReadComplete);
_callbackWrite = new AsyncCallback(_OnWriteComplete);

他の機能を投稿する必要がある場合はお知らせください。

4

1 に答える 1

2

テキストベースのシリアライザー (例: Json) を使用する場合は、StreamReaderReadLineと StreamWriter WriteLine(tcpClient.GetStream から作成) を利用できます。

あなたのコードは次のようになります

 writer.WriteLine(JsonConvert.SerializeObject(commData))

反対側でデータを取得する

var myobj = JsonConvert.DeserializeObject<MyCommunicationData>(reader.ReadLine())

- 編集 -

//**Server**
Task.Factory.StartNew(() =>
{
    var reader = new StreamReader(tcpClient.GetStream());
    var writer = new StreamReader(tcpClient.GetStream());
    while (true)
    {
        var myobj = JsonConvert.DeserializeObject<MyCommunicationData>(reader.ReadLine());
        //do work with obj 
        //write response to client
        writer.WriteLine(JsonConvert.SerializeObject(commData));
    }
}, 
TaskCreationOptions.LongRunning);
于 2012-10-04T06:52:03.413 に答える