2016-03-21 10 views
0

次のコードは、次のformart "address、porttNum"で単純な文字列を送信するために使用されます。ここでJava UDPパケットは5ビットしか保持しません

は、クライアント側である:ここで

ByteArrayInputStream bin = new ByteArrayInputStream(packet.getData()); 
DataInputStream dis = new DataInputStream(bin); 

try { 
      System.out.println("Data in packet: " + dis.readLine()); 
     } catch (IOException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 

は、サーバー側である:

byte[] sbuf = data.getBytes(); 
     // sbuf = output.getBytes(); 
     packet = new DatagramPacket(sbuf, 
       sbuf.length, packet.getAddress(), packet.getPort()); 
try { 
      socket = new DatagramSocket(); 
      socket.send(packet); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

サーバは "ABCDEFGHI" を送信し、クライアントは唯一の "ABCDE" をrecieves言います。私は複数のテストケースでそれを試して、クライアントは常に5バイトを受信します。誰かが私が混乱した場所を指摘できますか?

編集:デバッグ目的のために 私も次を追加しました:

クライアントはまだそれを得ることはありません右のデータを出力
try { 
      System.out.println("Data in packet: " + dis.readLine()); 
     } catch (IOException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 

編集2: 私は、次のようにクライアント側を変更:

String data = new String(packet.getData(), StandardCharsets.UTF_8); 
     System.out.println("Data in packet: " + data); 

それは違いはありません。

+0

これまでのところよく見えます。あなたの入力に改行がある場合、 '' readLine() ''はそれを混乱させます... – f1sh

+2

'DataInputStream'は' DataOutputStream'と一致する必要があります。あなたのサーバコードは単に 'data.getBytes()'を表示しますが、 'data'が何であったか、またどのように生成されたかについての手掛かりはありません。また、 'DataInputStream#readLine()'は推奨されていません。 – AJNeufeld

+1

'new String(packet.getData()、StandardCharsets.UTF_8);'のようなものを使ってバイトを文字列に変換しようとするかもしれません。ここで 'DataInputStream'を使う理由はわかりません。 @ f1shが指摘しているように問題を引き起こす可能性があります。 –

答えて

1

StringのバイトからのDatagramパケットの構築、送信、およびStringの再構築を示すコード例です。

パケットを受信するためのバッファは、最終的に受信されるメッセージよりもはるかに大きく作成されていることに注意してください。これは、バッファよりも大きなメッセージを受信した場合、UDPソケットがメッセージをバッファのサイズに切り詰めるため、必要です。たとえば、クライアントがサーバーにメッセージ "ZYXWV"を送信し、そのメッセージに十分な大きさのバッファを作成した後にを再利用した場合、受信メッセージのバッファーはです。受信メッセージの最初の5文字のみ受け取った。あなたが直接Stringbyte[]にして再度変換することができますので、

public class DataGram { 

    public static void main(String[] args) throws SocketException { 
     new Thread(new Client()).start(); 
     new Thread(new Server()).start(); 
    } 

    static class Client implements Runnable { 
     DatagramSocket socket; 

     Client() throws SocketException { 
      socket = new DatagramSocket(1234); 
     } 

     @Override 
     public void run() { 
      byte[] buf = new byte[1024]; 
      DatagramPacket packet = new DatagramPacket(buf, buf.length); 
      try { 
       try { 
        socket.receive(packet); 
        String msg = new String(packet.getData()); 
        System.out.println(msg); 
       } finally { 
        socket.close(); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    static class Server implements Runnable { 

     @Override 
     public void run() { 
      SocketAddress address = new InetSocketAddress("localhost", 1234); 
      try (DatagramSocket socket = new DatagramSocket()) { 
       String msg = "abcdefghi"; 
       byte[] buf = msg.getBytes(); 
       DatagramPacket packet = new DatagramPacket(buf, buf.length, address); 
       socket.send(packet); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

ないのDataInputStreamまたはれるByteArrayInputStreamは、ここで使用されます。

+0

提案された編集を行いました。失敗。私はサーバー側をスレッドしていることに注意してください。それがどのように違いを生むのか分かりません。助けてくれてありがとう! – mjr

+1

@mjr私たちがもっと助けることができるようにするには、コードをさらにポストする必要があります。私はあなたのクライアントが 'ByteArrayInputStream'と' DataInputStream'を使用していますが、そのような同等物はあなたのサーバーコードで使われているようには見えません。 'DataInputStream'は' DataInputStream'などのソースとして使用されるべきです。私は、十分に大きなバッファを指定しないと、UDPパケットがデータをドロップすることを指摘しました。私はあなたのコードと比較するための実例を与えました。より多くのコードを見ることなく、私たちができるのは、推測だけです。 – AJNeufeld

+0

私はそれを修正しました。問題はクライアント側からオリジナルのbufを変更していないため、送信された元の文字列の長さだけを受信して​​いたことでした。 – mjr

関連する問題