0
java中的TCP套接字可用於連接到服務器而無需手動綁定它。AutoBind DatagramSocket像java中的TCP Socket
final Socket socket = SocketChannel.open().socket();
socket.connect(StaticData.vmAddress);
//can send receive data
但是,當使用DataGramSocket時,似乎沒有自動綁定功能。 我嘗試這樣做:
DatagramSocket socketTest1 = DatagramChannel.open().socket();
socketTest1.connect(InetAddress.getByName(stunServer), stunServerPort);
socketTest1.setSoTimeout(timeout);
byte[] data = sendMH.getBytes();
DatagramPacket send = new DatagramPacket(data, data.length);
socketTest1.send(send); //got error at this point
堆棧跟蹤:
java.net.BindException: bind failed: EINVAL (Invalid argument)
W/System.err﹕ at libcore.io.IoBridge.bind(IoBridge.java:89)
W/System.err﹕ at java.net.PlainDatagramSocketImpl.bind(PlainDatagramSocketImpl.java:68)
W/System.err﹕ at java.net.DatagramSocket.ensureBound(DatagramSocket.java:422)
W/System.err﹕ at java.net.DatagramSocket.send(DatagramSocket.java:263)
W/System.err﹕ at java.nio.DatagramChannelImpl$DatagramSocketAdapter.send(DatagramChannelImpl.java:559)
W/System.err﹕ at reach.project.stun.test.DiscoveryTest.test1(DiscoveryTest.java:103) //(socketTest1.send(send) line)
這將是真正有用的,如果我可以依靠的DatagramSocket自動綁定爲好。無論如何要做到這一點?
解釋爲什麼...... – 2014-12-04 21:04:00
我最終只做了這個。我的理解是,0和0.0.0.0應該表示通配符地址。 – Dexter 2014-12-05 14:11:36
@Dexter 0.0.0.0是通配符IP地址,意思是通過所有接口監聽/接收。端口號零告訴系統分配一個特定的端口。這不是任何類型的通配符。 – EJP 2014-12-05 22:36:23