からのメッセージを読み取ったとき、私はクライアントサーバアプリケーションを作ってるんだが、私はそれがOutOfMemoryException例外をスローしてログインしようとすると、ここに私のコードのサーバー側は、次のとおりです。のOutOfMemoryExceptionサーバがクライアント
byte[] buffer = new byte[4];
requestCount = requestCount + 1;
NetworkStream networkStream = clientSocket.GetStream();
buffer = new byte[4];
int readBytes = networkStream.Read(buffer, 0, 4);
readBytes = networkStream.Read(buffer, 0, 4);
if (readBytes == 0)
break;
int MessageSize = BitConverter.ToInt32(buffer, 0);
byte[] bufferreader = new byte[MessageSize]; <- here the exception is thrown
readBytes = networkStream.Read(bufferreader, 0, MessageSize);
if (readBytes == 0)
break;
dataFromClient = Encoding.ASCII.GetString(bufferreader);
rCount = Convert.ToString(requestCount);
serverResponse = R.Respond(dataFromClient);
sendBytes = Encoding.ASCII.GetBytes(serverResponse);
networkStream.Write(sendBytes, 0, sendBytes.Length);
networkStream.Flush();
、ここでは私ですクライアント側のコード:
clientSocket.Connect("192.168.1.100", 666);
SHA512Managed S = new SHA512Managed();
byte[] result = S.ComputeHash(Encoding.UTF8.GetBytes(password));
string epassword = Convert.ToBase64String(result);
try
{
byte[] buffer = new byte[4];
NetworkStream serverStream = clientSocket.GetStream();
byte[] outStream = Encoding.ASCII.GetBytes("authenticate|" + user + "$");
buffer = new byte[4];
buffer = BitConverter.GetBytes(outStream.Length);
serverStream.Write(buffer, 0, 4);
serverStream.Flush();
serverStream.Write(outStream, 0, outStream.Length);
serverStream.Flush();
byte[] inStream = new byte[10025];
serverStream.Read(inStream, 0, (int)clientSocket.ReceiveBufferSize);
string returndata = Encoding.ASCII.GetString(inStream);
}
catch(Exception ex)
{
Toast.MakeText(l, ex.Message, ToastLength.Long).Show();
}
Toast.MakeText(l, "Logged In: " + epassword, ToastLength.Long).Show();
だから、基本的にそれはそれは期待しているどのくらいのバイトを知っているように、クライアントが最初のサーバに実際のメッセージの長さを送信しますが、私はメッセージを保持する新しいバッファを作成するときにOutOfMemoryExceptionをスローします。
事前にのおかげで
:あなたはすべてのあなたの「ヘッダ」とメッセージサイズを送信することで悩まずに、あなたのための読み込みを管理するために
StreamWriter
を作成することができますに?あなたのヘッダースニッフィングが正しい価値をもたらすと確信していますか?最初の4バイト*を2回読み取っているように見えます。実際には5〜8バイト目にバッファサイズを設定している可能性があります。 –さらに、BitConverterを使用して番号を読み取っています。ビットを正しく読んでいると確信していますか?ワイヤーフォーマットがあなたが期待しているものとは異なるエンディアンを使用する可能性はありますか? –
MessageSizeは、受信しているメッセージの実際のサイズを保持しています –