0

.net ソケットに非同期サーバーと非同期クライアントがあります。クライアントはオブジェクト (クラス UserInfo など) を作成し、それをシリアル化し、byte[] に書き込みます。また、クライアントにはいくつかのファイル (たとえば 1.png) があります。クライアントは、シリアライズされた UserInfo と 1.png をサーバーに送信する必要があります。

私はファイルに使用し、

Socket.BeginSendFile メソッド (文字列、AsyncCallback、オブジェクト)

および byte[] オブジェクトの場合

client.BeginSend(byteData, 0, byteData.Length, 0, 新しい AsyncCallback(SendCallback), クライアント);

サーバーはこの日付を一緒に受け取り、何がファイルで何がシリアル化オブジェクトかを理解する必要があります (サーバーにはデータを受信する方法が 1 つしかないため)。

listener.BeginAccept(
new AsyncCallback(AcceptCallback),
listener);
...
AcceptCallback(IAsyncResult ar)
{...
 handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                new AsyncCallback(ReadCallback), state);
}

そして私たちのロジック

ReadCallback(IAsyncResult ar)
    {...}

このデータを正しく受け取るには? 最後に、サーバーに 1.png と UserInfo オブジェクトが必要です(そしてそれらを区別します)。さらに、サーバーは非同期であるため、複数のクライアントから同時にデータを受信するときに混乱することはありません。

私には1つの考えがありますが、これは間違っていると思います:クライアントで使用してみてください

Socket.BeginSendFile メソッド (文字列、Byte[]、Byte[]、TransmitFileOptions、AsyncCallback、Object)

byte[] preBuffer を使用して、この「...」などのヘッダーを書き込み、サーバーでこのヘッダーを見つけて、切り取り、分析して、いくつかのアクティビティを実行しようとします。

もっと簡単で正しい方法はありますか?

ありがとう。

4

1 に答える 1

0

各チャネル (ソケット) には、実装に関して明確で既知のプロトコル (既知のタイプのオブジェクト) が必要です。したがって、このソケットを介して送信できるすべてのデータをカプセル化するメイン クラスを導入します。

public interface IPacketWrapper
{
   IEnumerable<byte> Payload { get; }
   UserInfo UserDetails { get; }
}

したがって、クライアントとサーバーは実装するオブジェクトによって交換されるIPacketWrapperため、バイナリデータと の両方をまとめてUserInfo、クライアント/サーバー側でこのオブジェクトをそれぞれシリアル化/逆シリアル化できます。

于 2012-10-15T09:14:39.120 に答える