2

私のプロジェクトでは、とを使用してDataOutputStreamDataInputStreamスレッド付きのソケットを使用してバイトを送受信しています。

クライアント

public void run(){
    while(isRunning) {//which is true upon connection of the socket to the server
         if(scanner.hasNext()){ // I use a scanner to test the program
             dos = new DataOutputStream(new OutputStream(socket.getOutputStream));

             byte[] toServer = scanner.next().getBytes();
             dos.writeInt(toServer.length);
             dos.write(toServer);
         } 
    }
}

サーバ

public void run(){
    while(isRunning){
        if(scanner.hasNext()){
              dis = new DataInputStream(new InputStream(socket.getInputStream));    
              int arrLength = dis.readInt();

              byte[] fromClient = new byte[arrLength];
              dis.read(fromClient, 0, fromClient.length);
              System.out.println("Your string is: " + new String(fromClient));
        }
    }
}

new String(fromClient)問題は、サーバー側でを印刷すると、単語/文の最初の文字が常に欠落していることです。クライアントで単語を入力する"Test"と、サーバーが出力し"est"ます。しかし、" Test"(先頭にスペースを入れて)入ると、サーバーは出力し"Test"ます。何が悪いのか分かりませんか?バイト変換に問題はありますか?

4

2 に答える 2

2

以下のコードは私にとってはうまくいきます。投稿のタイプミスを考えると、これは実行されている実際のコードではなく、近似値であり、これは実際のコードのバグであると思われます。探すべきことがいくつかあります:

  • あなたが電話のdis.readByte();後に持っているならreadInt()、それは明らかに主役を断ち切るでしょう。書き込みと読み取りが完全に対称であることを確認してください。また、ストリーム チェーンが対称であることを確認してください。

  • 別のクラスからストリームを取得している場合は、それ自体が読み取りメソッドを実行していないことを確認してください。

  • 現在の投稿はnew InputStream()(and OutputStream) を実行していますが、これらは抽象的であるためコンパイルされません。そこにバッファリングがある場合は、dos.flush();. ただし、これはハングアップの原因となり、部分的な入力ではありません。


String file = "/tmp/x";
DataOutputStream dos = new DataOutputStream(new FileOutputStream(file));

String inputString = "Test";
byte[] toServer = inputString.getBytes();
dos.writeInt(toServer.length);
dos.write(toServer);

DataInputStream dis = new DataInputStream(new FileInputStream(file));
int arrLength = dis.readInt();

byte[] fromClient = new byte[arrLength];
dis.read(fromClient, 0, fromClient.length);
// works fine for me
assertEquals(inputString, new String(fromClient));
于 2012-06-19T18:27:43.000 に答える
0

read() ではなく readFully() を使用する必要があり、読み取りまたは書き込みのたびにストリームを再構築し続ける必要はありません。ソケットの存続期間中、同じストリームを使用してください。また、スキャナーは何に取り付けられていますか?ソケットに接続されている場合は、そこからデータを消費します。

于 2012-06-19T22:31:57.867 に答える