2010-06-01 36 views
6

Buổi sáng.Phát UDP trong Java

Tôi khá mới trong kết nối Java và ổ cắm nhưng tôi đang cố gắng gửi gói/phát UDP trên 255.255.255.255 trên cổng 8001 đến thiết bị. Tôi có thể nhận được dữ liệu để gửi tốt, tuy nhiên khi nói đến thời gian để nhận dữ liệu kết nối lần. Tôi có một gói sniffer và tôi có thể thấy gói gửi và sau đó thiết bị phản hồi.

Tôi khá chắc chắn đó là một sai lầm tân binh mà tôi đang thiếu trong mã của tôi nhưng tôi đã bị mắc kẹt trên nó một lúc và bất kỳ trợ giúp sẽ được đánh giá cao.

m_Socket = new DatagramSocket(m_SERVERPORT); 
InetAddress address = InetAddress.getByName(m_SERVERIP); 


m_DataPack = new DatagramPacket(m_SERVERCMD.getBytes(), m_SERVERCMD.getBytes().length, 
address, m_SERVERPORT); 
m_Socket.setBroadcast(true); 
m_Socket.connect(address, m_SERVERPORT); 

m_Socket.send(m_DataPack); 
m_DataPack = new DatagramPacket(data, data.length, 
address, m_SERVERPORT); 


m_Socket.receive(m_DataPack); // This is where it times out 


data = m_DataPack.getData(); 
String received = data.toString(); 
System.out.println("Received: " + received); 
m_Socket.close(); 

Cảm ơn và Gig'Em.

EDIT:

Tôi không chắc chắn nếu điều này giúp nhưng khi tôi xem các đối tượng m_Socket tôi có thể thấy những điều sau đây ngay trước khi nó gửi:

bound = true; 
close = false; 
connectedAddress = Inet4Address (id = 32) (-1,-1,-1,-1); 
connectedPort = 8001; 
connectState = 1; 
created = true; 
impl = PlainDatagramSocketImpl; 
oldImpl = false; 

và đối tượng m_DataPack như sau:

address = Inet4Address (id = 32) (-1,-1,-1,-1); 
bufLength = 6 (size of packet I'm sending is 6 char long); 
offset = 0; 
port = 8001; 
+0

Bạn nhận ra rằng Gig'Em của bạn xa lánh một số sinh viên tốt nghiệp của một trong những chương trình CS lớn hơn ở Mỹ, phải không? – jasonmp85

+0

@ jasonmp85 cho những người không phải Texan, những người đang tự hỏi ý nghĩa của nó: https://en.wikipedia.org/wiki/Traditions_of_Texas_A%26M_University#Gig_.27em (vâng, tôi phải tìm kiếm nó;)) – Matthieu

Trả lời

1

Nếu bạn muốn nhận gói dữ liệu, bạn cần bind() đến điểm cuối cục bộ (địa chỉ + cổng).

+0

Trong liên kết chức năng tôi cần phải thiết lập các điểm cuối địa phương đến một địa chỉ và cổng thông qua một SocketAddress. Cách tốt nhất để làm việc này là gì? Tôi biết trong lớp DatagramPacket có một getSocketAddress(); để không giúp tôi. – user355528

+0

Tôi đã thử m_DataPack = new DatagramPacket (dữ liệu, dữ liệu.length, InetAddress.getLocalHost(), m_SERVERPORT); và sau đó là m_Socket.bind (m_DataPack.getSocketAddress()); nhưng nó ném một ngoại lệ nói rằng ổ cắm đã bị ràng buộc. – user355528

+0

Ông là ràng buộc, đó là những gì mới DatagramSocket (int cổng) nào. – EJP

10

Điều này không có ý nghĩa. Bạn đang phát sóng, tức là từ 1 đến nhiều và bạn cũng đang kết nối, tức là từ 1 đến 1. Đó là nó?

Mất kết nối. Và mất 255.255.255.255. Điều này đã bị phản đối nặng nề trong khoảng 20 năm. Sử dụng địa chỉ quảng bá trên mạng con, ví dụ: 192.168.1.255.