2011-12-19 34 views
5

Tôi phải gửi gói UDP và nhận phản hồi từ máy chủ UDP. Tôi mặc dù UDP là tương tự với một java.net.DatagramPacket trong Java, nhưng các tài liệu cho DatagramPacket có vẻ là bạn gửi một gói nhưng không nhận được bất cứ điều gì trở lại, là điều này đúng để sử dụng hoặc tôi nên sử dụng java. net.SocketCần gửi gói UDP và nhận phản hồi trong Java

+2

UDP là datagram. Bạn không nhận được bất cứ điều gì trở lại trừ khi người nhận gửi một cái gì đó trở lại. Nó tương tự với một ổ cắm tcp. Nếu bạn nói với chúng tôi những gì bạn muốn làm, có thể? – Erik

+0

Ok máy chủ đã tồn tại (không phải bằng văn bản của tôi) nó sẽ gửi một cái gì đó trở lại khi tôi gửi nó một gói nhưng làm thế nào để tôi nhận được các gói nó gửi trở lại? –

+0

câu hỏi đầu tiên là: máy chủ có gửi lại udp không? Nếu vậy, bạn cần đọc từ ổ UDP của riêng bạn thông qua phương thức Datagram.receive(). – Erik

Trả lời

10

Ví dụ về UDP datagram gửi và nhận (source):

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

Điều này có vẻ tốt, nhưng có vẻ như không có chiều dài gói được xác định cho máy chủ, nghĩa là tôi không nghĩ rằng độ dài gói của gói được trả về bởi máy chủ luôn giống nhau vì vậy tôi chỉ cần đảm bảo receiveData bộ đệm đủ lớn để xử lý kích thước gói lớn nhất có thể. –

+0

Có. UDP là giao thức không đáng tin cậy, và hiếm khi được sử dụng để gửi các khối dữ liệu lớn trên nó. Tuy nhiên, sau khi nhận được gói tin, bạn có thể đọc số byte thực tế có trong 'DatagramPacket.getLength()'. – bezmax

+2

'receivePacket.getData()' không chỉ chứa dữ liệu nhận được. Nó chứa phần không sử dụng của bộ đệm. Để có được một String với các dữ liệu nhận được sử dụng 'chuỗi mới (receivePacket.getData(), 0, receivePacket.getLength(), StandardCharsets.UTF_8)' và điều chỉnh bộ ký tự cho những gì bạn mong đợi. –

2

Bạn phải sử dụng DatagramPacket và DatagramSocket. Khi bạn gửi một gói tin, bạn chỉ cần gửi một gói tin. Tuy nhiên khi bạn nhận được một gói, bạn có thể nhận được một gói tin được gửi từ một chương trình khác (ví dụ các máy chủ trả lời)

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

Ổ cắm duy nhất là cho các kết nối TCP.

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