0

特定のローカルアドレスにパケットを送信する小さなUDPクライアントと、それらを受信して​​コンソールに出力する別の小さなUDPクライアントを作成しました。それらは現在機能していません。その理由はわかりません。

これは送信コードです:

import java.io.*;
import java.net.*;

class ClienteUDPtx {

  static final String HOST = "192.168.1.201";
  static final int PUERTO=20001;

  /**
    UDP Client which will send some UDP packets
    to local network address 192.168.1.201 on port 20001
  */
  public ClienteUDPtx( ) {
    try{
      int i = 0; 

      String[] ip_parts = HOST.split("."); 
      byte[] ip_num = {0, 0, 0, 0}; 
      for (String string : ip_parts) { 
         ip_num[i++] = Byte.valueOf(string); 
      } 

      InetAddress ip = InetAddress.getByAddress(ip_num); 
          DatagramSocket skCliente = new DatagramSocket(PUERTO, ip);
      DatagramPacket packet;
      File testFile = new File("test.txt");
      BufferedReader input =  new BufferedReader(new FileReader(testFile));
      String line;

      while((line=input.readLine())!=null) {
        System.out.println("Sending: " + line);
    byte message[] = line.getBytes();
    packet = new DatagramPacket(message, message.length, ip, PUERTO); 
        skCliente.send(packet);
    Thread.currentThread().sleep(1000);
      }
      line = "END";
      System.out.println("Sending: " + line);
      byte message[] = line.getBytes();
      packet = new DatagramPacket(message, message.length, ip, PUERTO); 
      skCliente.send(packet);

      input.close();
      skCliente.close();
    } catch( Exception e ) {
      System.out.println( e.getMessage() );
    }
  }


  public static void main( String[] arg ) {
    new ClienteUDPtx();
  }

}

これは受信コードです:

import java.io.*;
import java.net.*;

class ClienteUDPrx {

  static final String HOST = "192.168.1.101";
  static final int PUERTO=20001;

  /**
    UDP Client which will listen for incoming UDP packets
    from local network address 192.168.1.101 on port 20001
    and will print its content on console
  */

  public ClienteUDPrx( ) {
    try{
      int i = 0; 

      String[] ip_parts = HOST.split("."); 
      byte[] ip_num = {0, 0, 0, 0}; 
      for (String string : ip_parts) { 
         ip_num[i++] = Byte.valueOf(string); 
      } 

      InetAddress ip = InetAddress.getByAddress(ip_num); 
      DatagramSocket skCliente = new DatagramSocket(PUERTO, ip);
      byte[] buffer = new byte[2048];
      DatagramPacket packet = new DatagramPacket(buffer, buffer.length);


      while(true){
        // Wait to receive a datagram
        skCliente.receive(packet);
        String lineaLeida = new String(buffer, 0, packet.getLength());
        System.out.println(packet.getAddress().getHostName() + ": "+ lineaLeida);
        if(lineaLeida.equals("END")) break; 
      }
      skCliente.close();
      System.out.println( "Transmission ended" );
    } catch( Exception e ) {
      System.out.println( e.getMessage() );
    }
  }


  public static void main( String[] arg ) {
    new ClienteUDPrx();
  }

}

何か案が?

4

2 に答える 2

1

ここにいくつかのエラーがあります。

1 つ目は、InetAddress の作成です。バイトを分離して配列から再作成しようとするのではなく、次のことができます。

InetAddress.getByName(HOST);

HOST を分割するときに正規表現として分割し、「。」を使用しているため、今失敗しました。これには特別な意味があるため、実際には「.」に基づいて文字列を分割しているわけではありません。キャラクター。

実際に「。」で分割するには あなたがするだろう:

HOST.split("\\.")

しかし、バイトが -128 から +127 (0 から 255 ではない) の範囲にあるため、バイト解析は失敗します。

とにかく、おそらくこれがあなたを混乱させている理由は、あなたのエラー印刷のためです.

この行:

System.out.println( e.getMessage() );

例外エラーを出力しています (この場合は単に '0' - "ArrayIndexOutOfBoundsException: 0" です)。

代わりに、次のことを行う必要があります。

e.printStackTrace();

何がうまくいかないかについてより多くの情報を得るために。

これらのことを超えて、明らかな問題は見られません。

また、UDPはメッセージの整合性をチェックすることも指摘しておきます。配信または配信の順序を保証するものではないため、パケットを見逃したり、順序が狂ったりすることがありますが、メッセージのヘッダーとペイロードを含むチェックサムがあります。

于 2012-08-24T09:08:27.583 に答える
0

udpでパケットが受信other sideされることを保証するものではありません。

Thread.currentThread().sleep(1000); // メッセージを受け取りたい場合は非常に悪い

本当に反対側でメッセージを受信したい場合は、次のロジックを実装する必要があります。

  1. A が B にメッセージを送信します。
  2. B が A からメッセージを受信した場合、「メッセージを受信しました。接続を閉じることができます」というメッセージを送信します。
  3. A 接続を閉じる

メッセージの正確性をチェックするのではありません!

可能な解決策は、メッセージの前にメッセージのハッシュを送信し、同等性をチェックすることです。

于 2012-06-28T07:55:50.963 に答える