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

你这里有一些错误。

首先是创建 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 回答