java中的TCP套接字可用于连接服务器而无需手动绑定它。
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
stacktrace:
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中的自动绑定,那将非常有用。反正有吗?
答案 0 :(得分:2)
要将DatagramSocket自动绑定到系统分配的端口,请使用new DatagramSocket(0)
创建它。