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