2012-05-11 30 views
16

मैं यहाँ एक सर्वर के लिए एक ग्राहक से एक यूडीपी पैकेट भेजने के लिए एक कार्यक्रम बनाया है ट्रांसमीटर कोडजावा का उपयोग कर यूडीपी पैकेट भेजना और प्राप्त करना?

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()); 


    } 
} 

रिसीवर कोड समारोह

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){ 
    } 
} 

मैं WireShark कार्यक्रम का इस्तेमाल किया है है। यूडीपी पैकेट रिसीवर पर वायरशर्क कार्यक्रम में प्राप्त होता है लेकिन जावा प्रोग्राम इसे पहचान नहीं पाएगा, कार्यक्रम सिर्फ बंदरगाह को सुनता रहता है और कुछ भी नहीं होता है?

+0

क्या आप वाकई सर्वर सही पोर्ट सुन रहा है कर रहे हैं:

यहाँ एक सरल यूडीपी रिसीवर है कि काम करता है? – elias

+0

जब तक 'पता' सही नहीं है और 'पोर्ट' 57 है, तो यह कोड पहले' प्राप्त() 'कॉल में अवरुद्ध होगा। – EJP

+3

आईपी पते को नकारात्मक संख्या के रूप में प्रस्तुत न करें। यह हास्यास्पद है। वास्तविक ऑक्टेट मान लिखें और कास्ट का उपयोग करें। – EJP

उत्तर

28

रिसीवर को प्रेषक डेटागैपकेट में बंदरगाह सेट से मेल खाने के लिए रिसीवर का बंदरगाह सेट करना होगा। डिबगिंग के लिए पोर्ट> 1024 (उदा। 8000 या 9 000) पर सुनने का प्रयास करें। बंदरगाह < 1024 आमतौर पर सिस्टम सेवाओं द्वारा उपयोग किया जाता है और इस तरह के बंदरगाह पर बांधने के लिए व्यवस्थापक पहुंच की आवश्यकता होती है।

यदि रिसीवर हार्ड-कोडित बंदरगाह पर पैकेट भेजता है तो यह सुन रहा है (उदा। पोर्ट 57) और प्रेषक एक ही मशीन पर है तो आप रिसीवर को लूपबैक बनायेंगे। हमेशा पैकेट से निर्दिष्ट पोर्ट का उपयोग करें और उत्पादन सॉफ़्टवेयर के मामले में ऐसे मामले को रोकने के लिए किसी भी मामले में चेक की आवश्यकता होगी।

प्रेषक में निर्दिष्ट गलत आईपी पता गंतव्य के लिए एक पैकेट गंतव्य नहीं मिलेगा। टीसीपी के विपरीत यूडीपी एक पैकेट भेजने का प्रयास करेगा, भले ही पता पहुंच योग्य नहीं है और प्रेषक को त्रुटि संकेत नहीं मिलेगा। आप रिसीवर में पते को डिबगिंग के लिए सावधानी के रूप में प्रिंट करके इसे देख सकते हैं।

इस में आप सेट:

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

लेकिन स्ट्रिंग के रूप में पते का उपयोग करना आसान हो सकता है:

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

दूसरे शब्दों में, आप 192.168.1.106 के रूप में लक्ष्य रखा। यदि यह रिसीवर नहीं है तो आपको पैकेट नहीं मिलेगा।

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

ऐसा करने का आसान तरीका प्रतिक्रिया के लिए अनुरोध डेटाग्राम का पुन: उपयोग करना है, क्योंकि इसमें पहले से ही सहकर्मी पता है: इसमें पोर्ट। बस डेटा रीसेट करें। अगर पता गलत है और सॉकेट जुड़ा हुआ है तो प्रेषक को वास्तव में एक त्रुटि मिल जाएगी। – EJP