2011-12-19 14 views
5

में एक प्रतिक्रिया प्राप्त करने की आवश्यकता है मुझे एक यूडीपी पैकेट भेजना है और यूडीपी सर्वर से प्रतिक्रिया प्राप्त करना है। हालांकि यूडीपी जावा में एक java.net के साथ समान था। डेटाग्राम पैकेट जावा में, लेकिन डेटाग्राम पैकेट के लिए प्रलेखन ऐसा लगता है कि आप एक पैकेट भेजते हैं लेकिन कुछ भी वापस नहीं मिलता है, क्या यह उपयोग करने के लिए सही चीज है या मैं जावा का उपयोग कर रहा हूं। net.Socketएक यूडीपी पैकेट भेजने और जावा

+2

यूडीपी डेटाग्राम है। जब तक रिसीवर कुछ वापस भेजता है तब तक आपको कुछ भी वापस नहीं मिलता है। यह एक टीसीपी सॉकेट के साथ ही है। यदि आप हमें बताते हैं कि आप क्या करना चाहते हैं, शायद? – Erik

+0

ठीक है सर्वर पहले से मौजूद है (मेरे द्वारा लिखित नहीं) इसे कुछ पैकेट भेजना चाहिए जब मैं इसे एक पैकेट भेजूं लेकिन मुझे वह पैकेट कैसे वापस भेज सकता है जो इसे वापस भेजता है? –

+0

पहला सवाल यह है: क्या सर्वर वापस udp भेजता है? यदि ऐसा है, तो आपको Dagramagram.receive() विधि के माध्यम से अपने यूडीपी सॉकेट से पढ़ने की आवश्यकता है। – Erik

उत्तर

10

उदाहरण:

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

class UDPClient 
{ 
    public static void main(String args[]) throws Exception 
    { 
     BufferedReader inFromUser = 
     new BufferedReader(new InputStreamReader(System.in)); 
     DatagramSocket clientSocket = new DatagramSocket(); 
     InetAddress IPAddress = InetAddress.getByName("localhost"); 
     byte[] sendData = new byte[1024]; 
     byte[] receiveData = new byte[1024]; 
     String sentence = inFromUser.readLine(); 
     sendData = sentence.getBytes(); 
     DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876); 
     clientSocket.send(sendPacket); 
     DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
     clientSocket.receive(receivePacket); 
     String modifiedSentence = new String(receivePacket.getData()); 
     System.out.println("FROM SERVER:" + modifiedSentence); 
     clientSocket.close(); 
    } 
} 
+0

यह अच्छा लग रहा है, लेकिन एक सर्वर के लिए परिभाषित एक पैकेट लंबाई प्रतीत नहीं होता है, यानी मुझे नहीं लगता कि सर्वर द्वारा लौटाए गए पैकेट की पैकेट लंबाई हमेशा समान होती है, इसलिए मुझे यह सुनिश्चित करने की ज़रूरत है कि प्राप्तडेटा बफर सबसे बड़ा संभव पैकेट आकार को संभालने के लिए काफी बड़ा है। –

+0

हां। यूडीपी अविश्वसनीय प्रोटोकॉल है, और इसका उपयोग शायद ही कभी डेटा के बड़े हिस्से भेजने के लिए किया जाता है। हालांकि, पैकेट प्राप्त होने के बाद, आप 'DagramagramPacket.getLength()' से निहित बाइट्स की वास्तविक मात्रा को पढ़ सकते हैं। – bezmax

+2

'getPacket.getData()' में न केवल प्राप्त डेटा होता है। इसमें बफर का अप्रयुक्त हिस्सा भी शामिल है। प्राप्त डेटा उपयोग के साथ एक स्ट्रिंग प्राप्त करने के लिए 'नया स्ट्रिंग (getPacket.getData(), 0, getPacket.getLength(), StandardCharsets.UTF_8)' और वर्णमाला को समायोजित करने के लिए समायोजित करें। –

2

आपको डेटाग्राम पैकेट और डेटाग्राम सॉकेट का उपयोग करना होगा। जब आप एक पैकेट भेजते हैं तो आप केवल एक पैकेट भेजते हैं। लेकिन जब आप एक पैकेट प्राप्त हो (उदा सर्वर उत्तर) एक पैकेट जो किसी अन्य प्रोग्राम से भेजा गया था प्राप्त कर सकते हैं

http://docs.oracle.com/javase/7/docs/api/java/net/DatagramSocket.html

सॉकेट TCP कनेक्शन के लिए ही है। यूडीपी आंकड़ारेख भेजने और (source) प्राप्त करने के

2

ठीक UDP और TCP सॉकेट के बीच अंतर है कि को देखने के लिए चाहते हैं।

यूडीपी प्रसारित किया जाता है, जबकि java.net.Socket के साथ टीसीपी बिंदु बिंदु है। यूडीपी एक जेएमएस विषय पर एक संदेश प्रकाशित करने के समान, अग्नि-और-भूल है।

देखें: http://docs.oracle.com/javase/tutorial/networking/datagrams/index.html

+0

यूडीपी प्रसारण नहीं किया जाता है। प्रसारण एक आईपी-स्तर की बात है। – OrangeDog

संबंधित मुद्दे