0

ソケットの片側では、データがソケットに正しく入っていることがわかります。

接続をセットアップしました:

Connection sr = new Connection();
Server server = new Server("NAME", Interger.parseInt(port));
server.setIp(ip);
sr.setServer(server); 

//I know my server connection code is correct because I can send and receive data in 
//other areas of my program just fine

InputStream is = null;

try
{
  is = sr.getChannel().socket().getInputStream();

  BufferedReader br = new BufferedReader(new InputStreamReader(is));
  StringBuffer text = new StringBuffer();

  int k =0;

  while(k != -1)
  {
    k = br.read();
    text.append((char) k);
  }
}
catch(Exception e)
{
  //no errors ever get thrown
}

そして、送信した合計 21398 バイトのうち、約半分の 10989 バイトしか取得できません。読み取るバイト数はさまざまですが、データは常に終了し ..., "values": ["、送信したデータは , のようになり..., "values": ["", ""]ます。

4

3 に答える 3

1

すべてのデータが揃うまで読み続けてください。この質問は最近、週に1回程度出てきています。ネットワークですべてのデータが一度に表示されるという保証はありません。

すべてのデータが揃うまで読み続ける必要があります。送信されたデータの量をどのようにして知ることができますか?送信されるデータの量を定義するクライアント/サーバー間に小さなプロトコルを構築する必要があります。サーバーはその小さなヘッダーを読み取り、完全なメッセージが受信されるまで読み取りを続けます。

于 2012-08-23T15:16:20.390 に答える
1

これがあなたを助けることができるかどうかわからない:

int k =0;

while((k = br.read()) != -1){
   text.append((char) k);
}

1)あなたの場合、次のチェックを行っています。iterationこれにより、表現できない文字(char-1の)が末尾に追加される可能性がありtextます。

2)catch block空のままにしないでくださいexecption

于 2012-08-23T15:22:09.587 に答える
-1

そのため、ソケットの送信側が c++ であったため、誤って null ASCII 値をソケットに渡していました。また、ソケットの Java 側では、読み取りが null 値に遭遇した場合にそれをファイルの終わりとして扱うことは文書化されていません。そのため、null にヒットしたため、ストリームが途中で終了していました。

于 2012-08-23T16:22:22.680 に答える