2014-12-04 28 views
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自动绑定为好。无论如何要做到这一点?

回答

2

要将DatagramSocket自动绑定到系统分配的端口,请使用new DatagramSocket(0)创建它。

+0

解释为什么...... – 2014-12-04 21:04:00

+0

我最终只做了这个。我的理解是,0和0.0.0.0应该表示通配符地址。 – Dexter 2014-12-05 14:11:36

+0

@Dexter 0.0.0.0是通配符IP地址,意思是通过所有接口监听/接收。端口号零告诉系统分配一个特定的端口。这不是任何类型的通配符。 – EJP 2014-12-05 22:36:23