2

これは今私を怒らせています。私は現在いくつかのクライアント/サーバーソフトウェアを書いています.問題なくクライアント間で配列を送信できますが、問題は次のコードにあります:

MemoryStream fs = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
lock (fs)
        lock (sharedVars.clients[i])
            formatter.Serialize(fs, sharedVars.clients[i]);
    sender.SendData(setFirstByte(Game_Project_no._14wI542Z.Shared.Constants.InitialByte.REQUEST_RTN, fs.ToArray()));

私はコードを実行し、ブレークポイントを使用して、メモリストリームにシリアライゼーションからのデータが含まれていることを確認できますが、他のコンピューターには到達しません (実際のネットワークハードウェアエラーを避けるために、これは現在すべて localhost を介して行われています)。

これはTCPを使用しており、本当にクレイジーな部分は、新しいバイト配列をメモリストリームに手動で書き込むと、データが問題なく反対側に到達することです。本質的に、シリアル化されたデータが気に入らないだけです。今は本当に混乱しているので、コミュニティに質問を投げかけます。何かアイデアはありますか?

詳細については、これは完全に空の配列 (最初の request_rtn バイトを除く) がもう一方の端に到達したときに呼び出されるものです。

Shared.SharedValues.Client clientTemp;

readBuffer = removeFirstByte(readBuffer);

BinaryFormatter formatter = new BinaryFormatter();
MemoryStream ms = new MemoryStream(readBuffer);

ms.Position = 0;

lock (serverValues)
    clientTemp = (Shared.SharedValues.Client)formatter.Deserialize(ms);

serverValues.clients[clientTemp.ID] = clientTemp;

サーバー側に戻って、テストするために変更したコードは、あらゆる点で機能します。

MemoryStream fs = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();

byte[] byteArray = new byte[10000];

for (i = 0; i < 10000; i++)
{
    byteArray[i] = (byte)i;
}

lock (fs)
    lock (sharedVars.clients[i])
        //formatter.Serialize(fs, sharedVars.clients[i]);
        fs.Write(byteArray, 0, 10000);
    sender.SendData(setFirstByte(Game_Project_no._14wI542Z.Shared.Constants.InitialByte.REQUEST_RTN, fs.ToArray()));
4

1 に答える 1

1

多くのことをいじった後、次を使用してバッファを自分自身に書き込むだけで問題を修正しました。

fs.Write(fs.GetBuffer(), 0, fs.Capacity);

コンパイラのバグか何かが起こっているに違いないと思いますが、これは動作するように説得します。ここで、現在発生している別の問題に移ります。

そのロットをスクラップすると、上記の行は何の役にも立たないことがわかります。本当のエラーは、非同期書き込みを行っていて、ネットワークに書き込まれていたバッファがほぼ瞬時に破壊されたことです。これは基本的に、1 バイトまたは 2 バイトであることを意味します。通過してから 0 のロード。したがって、将来この問題に遭遇する人は、私のような愚かなことをしていないことを確認してください。

何が起こっているのかを解明するためにあなた方の何人かが行った質問に感謝します.

于 2013-05-07T17:17:32.140 に答える