2016-09-11 7 views
0

からのメッセージを読み取ったとき、私はクライアントサーバアプリケーションを作ってるんだが、私はそれが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をスローします。

事前にの

おかげで

+1

:あなたはすべてのあなたの「ヘッダ」とメッセージサイズを送信することで悩まずに、あなたのための読み込みを管理するためにStreamWriterを作成することができますに?あなたのヘッダースニッフィングが正しい価値をもたらすと確信していますか?最初の4バイト*を2回読み取っているように見えます。実際には5〜8バイト目にバッファサイズを設定している可能性があります。 –

+0

さらに、BitConverterを使用して番号を読み取っています。ビットを正しく読んでいると確信していますか?ワイヤーフォーマットがあなたが期待しているものとは異なるエンディアンを使用する可能性はありますか? –

+0

MessageSizeは、受信しているメッセージの実際のサイズを保持しています –

答えて

1

問題はおそらく、あなたがメッセージの長さを含むヘッダを読んでどのようにある:

buffer = new byte[4]; 
int readBytes = networkStream.Read(buffer, 0, 4); 
readBytes = networkStream.Read(buffer, 0, 4); 

あなたが、ここでやっているバッファへのストリームオフ4つのバイトを読んでいると、次に4バイトを再度読み取ってを読み込み、前のバッファーをオーバーライドします。これは、ヘッダーが最初の4バイトで送信される、以下のコードを送信するクライアントと一致しません。だから、メッセージサイズを取得し、実際のペイロードの最初の4バイトでオーバーライドし、それらの4つの任意のバイトに基づいてバッファを割り当てようとします。

を削除してください。とお読みください。

一般的に言えば、フレームワークがすでにあなたのためにできる多くの作業をしています。 MESSAGESIZEは何を評価するん

NetworkStream networkStream = clientSocket.GetStream(); 
StreamReader reader = new StreamReader(networkStream, Encoding.ASCII) 
dataFromClient = reader.ReadToEnd(); 

(そしてもちろんの対応 StreamWriter呼び出し、)

+0

魅力のように動作します。それは別の関数を先に持っていました。別の長さを読み取る必要があったので、2番目のリーダーを削除するのを忘れました。どうもありがとう :) –