2012-05-11 67 views
16

Tôi đã thực hiện một chương trình để gửi một gói tin UDP từ một khách hàng đến một máy chủ ở đây là mã phátgửi và nhận gói UDP bằng Java?

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

/** 
* 
* @author hp 
*/ 
public class JavaApplication9 { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) throws UnknownHostException, SocketException, IOException { 
     // TODO code application logic here 
     byte[] buffer = {10,23,12,31,43,32,24}; 
     byte [] IP={-64,-88,1,106}; 
     InetAddress address = InetAddress.getByAddress(IP); 
     DatagramPacket packet = new DatagramPacket(
       buffer, buffer.length, address, 57 
       ); 
     DatagramSocket datagramSocket = new DatagramSocket(); 
     datagramSocket.send(packet); 
     System.out.println(InetAddress.getLocalHost().getHostAddress()); 


    } 
} 

Các chức năng mã nhận là

public void run(){ 

    try{ 
     DatagramSocket serverSocket = new DatagramSocket(port); 
     byte[] receiveData = new byte[8]; 
     byte[] sendData = new byte[8]; 

     while(true) 
      { 
       DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
       serverSocket.receive(receivePacket); 
       String sentence = new String(receivePacket.getData()); 
       System.out.println("RECEIVED: " + sentence); 
       InetAddress IPAddress = receivePacket.getAddress(); 
       String sendString = "polo"; 
       sendData = sendString.getBytes(); 
       DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port); 
       serverSocket.send(sendPacket); 
      } 
    }catch (Exception e){ 
    } 
} 

Tôi đã sử dụng chương trình Wireshark. Gói UDP được nhận trong chương trình WireShark ở đầu thu nhưng chương trình Java sẽ không nhận ra nó, chương trình chỉ tiếp tục nghe cổng và không có gì xảy ra?

+0

Bạn có chắc chắn Server đang lắng nghe cổng bên phải? – elias

+0

Trừ khi 'địa chỉ' là chính xác và' cổng' là 57 mã này sẽ chặn trong lệnh 'receive()' đầu tiên. – EJP

+3

Không đại diện cho địa chỉ IP làm số âm. Thật lố bịch. Viết giá trị octet thực tế và sử dụng phôi. – EJP

Trả lời

28

Người nhận phải đặt cổng thu để khớp với cổng được đặt trong DatagramPacket của người gửi. Để gỡ lỗi, hãy thử nghe trên cổng> 1024 (ví dụ: 8000 hoặc 9000). Cổng < 1024 thường được sử dụng bởi các dịch vụ hệ thống và cần quyền truy cập quản trị để liên kết trên một cổng như vậy.

Nếu người nhận gửi gói đến cổng mã hóa cứng, nó nghe (ví dụ: cổng 57) và người gửi nằm trên cùng một máy thì bạn sẽ tạo vòng lặp cho chính máy thu. Luôn sử dụng cổng được chỉ định từ gói và trong trường hợp phần mềm sản xuất sẽ cần kiểm tra trong mọi trường hợp để ngăn chặn trường hợp như vậy.

Một lý do khác khiến gói tin không đến đích là địa chỉ IP sai được chỉ định trong người gửi. UDP không giống như TCP sẽ cố gắng gửi một gói ngay cả khi địa chỉ không thể truy cập được và người gửi sẽ không nhận được chỉ báo lỗi. Bạn có thể kiểm tra điều này bằng cách in địa chỉ trong máy thu để đề phòng gỡ lỗi.

Trong người gửi bạn thiết lập:

byte [] IP= { (byte)192, (byte)168, 1, 106 }; 
InetAddress address = InetAddress.getByAddress(IP); 

nhưng có thể là đơn giản để sử dụng địa chỉ ở dạng chuỗi:

InetAddress address = InetAddress.getByName("192.168.1.106"); 

Nói cách khác, bạn đặt mục tiêu là 192.168.1.106. Nếu đây không phải là người nhận thì bạn sẽ không nhận được gói.

Dưới đây là một đơn giản UDP Receiver hoạt động:

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

public class Receiver { 

    public static void main(String[] args) { 
     int port = args.length == 0 ? 57 : Integer.parseInt(args[0]); 
     new Receiver().run(port); 
    } 

    public void run(int port) {  
     try { 
     DatagramSocket serverSocket = new DatagramSocket(port); 
     byte[] receiveData = new byte[8]; 

     System.out.printf("Listening on udp:%s:%d%n", 
       InetAddress.getLocalHost().getHostAddress(), port);  
     DatagramPacket receivePacket = new DatagramPacket(receiveData, 
          receiveData.length); 

     while(true) 
     { 
       serverSocket.receive(receivePacket); 
       String sentence = new String(receivePacket.getData(), 0, 
           receivePacket.getLength()); 
       System.out.println("RECEIVED: " + sentence); 
       // now send acknowledgement packet back to sender  
       InetAddress IPAddress = receivePacket.getAddress(); 
       String sendString = "polo"; 
       byte[] sendData = sendString.getBytes("UTF-8"); 
       DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, 
        IPAddress, receivePacket.getPort()); 
       serverSocket.send(sendPacket); 
     } 
     } catch (IOException e) { 
       System.out.println(e); 
     } 
     // should close serverSocket in finally block 
    } 
} 
+0

Cách dễ dàng để thực hiện việc này là sử dụng lại datagram yêu cầu cho phản hồi, vì nó đã có địa chỉ ngang hàng: cổng trong đó. Chỉ cần đặt lại dữ liệu. Người gửi thực sự sẽ gặp lỗi nếu địa chỉ sai và ổ cắm được kết nối. – EJP

Các vấn đề liên quan