2011-10-20 22 views
5

Trong ứng dụng của tôi sẽ có một chuỗi luôn chạy và sẽ gửi hoặc nghe một số cổng.Làm thế nào để thiết lập lại tùy chọn địa chỉ cho một ổ cắm datagram trong mã java?

Ứng dụng này chạy ẩn. Đôi khi trong khi tạo socket, tôi thấy rằng cổng đã được sử dụng bởi cùng một luồng trước đó, không được phát hành vào gần() của socket. Vì vậy, tôi đã thử như thế này

 dc = new DatagramSocket(inetAddr); 
     dc.setReuseAddress(true); 

Vấn đề là, nó cũng không đạt đến dòng thứ hai. trong dòng đầu tiên tôi đang nhận được expcetion BindException: Address already in use.

Bất cứ ai có thể vui lòng giúp tôi cách xử lý tình huống này.

Có cách nào để giải phóng cổng không?

Cảm ơn & Kính trọng,
SSuman185

+0

nhìn vào câu trả lời của tôi thay đổi nội dung. Cảm ơn. – user370305

Trả lời

6

Sử dụng một MulticastSocket. Xây dựng nó không có đối số. Điều đó ngầm gọi setReuseAddress (true). Sau đó gọi bind().

Hiện tại, bạn đang gọi setReuseAddress() quá muộn để làm điều đó tốt.

+0

+1, để chia sẻ câu trả lời của bạn. – user370305

+0

Tôi đã thử điều này, nhưng có một nghi ngờ? tôi quan sát thấy rằng khi tôi tạo DatagramSocket() với các tham số, nó nhận được ràng buộc với một số số cổng miễn phí. Sau khi thiết lập địa chỉ sử dụng lại và liên kết, sẽ liên kết với cổng mới. Điều gì xảy ra với cổng cũ? – Suman

+0

@ SSuman185 chính xác, được phát hiện tốt. Bạn phải tạo MulticastSocket. Bạn có thể sử dụng nó giống như một DatagramSocket, mà constructor mặc định của nó đã được thiết kế sai khoảng 15 năm trước. – EJP

11

DatagramSocket(inetAddr) liên kết với cổng. Bạn cần phải setReuseAddress(true) TRƯỚC KHI bạn liên kết.

Để làm điều này ... sử dụng như sau:

dc = new DatagramSocket(null); 
dc.setReuseAddress(true); 
dc.bind(inetAddr); 

constructor này rời cảng cởi ra.

+0

và inetAddr ở đây đại diện cho? !! –

0

Đây là cách nó làm việc cho tôi:

try { 
     clientMulticastSocket = new MulticastSocket(null); 
     clientMulticastSocket.setReuseAddress(true); 
     clientMulticastSocket.bind(new InetSocketAddress(multicastHostAddress, multicastPort)); 
     clientMulticastSocket.joinGroup(multicastHostAddress); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return false; 
    } 
Các vấn đề liên quan