ServerSocket默认邦定IP实现过程详解
开发中需要开启服务端的时候,本地测试都是直接写端口,实际环境也是需要指定要邦定的IP才可以。
因为对于服务器来说,有时它不止一块网卡,而我们系统一定是通过指定的IP和端口进行通信的,所以服务端所使用的IP和端口都需要定义配置文件。
那么在平常测试时,在没有指定IP的情况下,ServerSocket到底邦定到哪里了?
在这种情况下,服务器会把此端口绑定到0.0.0.0上面,即在所有IP上面都绑定,即能在每个ip上面收到请求。至于0.0.0.0是什么,这里就不说了。
下面是一个测试程序,通过如下程序即可看到到底是怎么样的情况:
packagetest; importjava.net.InetSocketAddress; importjava.net.ServerSocket; importjava.net.Socket; publicclassTest{ publicstaticvoidmain(String[]args)throwsException{ SocketClientclient=newSocketClient(); newThread(client).start(); ServerSocketserverSocket=newServerSocket(); serverSocket.bind(newInetSocketAddress(8888)); // serverSocket.bind(newInetSocketAddress("127.0.0.1",8888)); // serverSocket.bind(newInetSocketAddress("192.168.1.100",8888)); System.out.println(serverSocket.toString()); serverSocket.accept(); } } classSocketClientimplementsRunnable{ publicvoidrun(){ try{ Thread.sleep(2000); try{ Socketsocket=newSocket("127.0.0.1",8888); System.out.println("127.0.0.1成功"+socket.toString()); }catch(Exceptione){ System.err.println("127.0.0.1失败"); } try{ Socketsocket=newSocket("192.168.1.100",8888); System.out.println("192.168.1.100成功"+socket.toString()); }catch(Exceptione){ System.err.println("192.168.1.100失败"); } }catch(Exceptione){ e.printStackTrace(); } } }
此时的打印结果是:
ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=8888]
127.0.0.1成功Socket[addr=/127.0.0.1,port=8888,localport=59213]
192.168.1.100成功Socket[addr=/192.168.1.100,port=8888,localport=59214]
使用127.0.0.1时打印结果:
ServerSocket[addr=/127.0.0.1,port=0,localport=8888]
127.0.0.1成功Socket[addr=/127.0.0.1,port=8888,localport=59416]
192.168.1.100失败
使用192.168.1.100时打印结果:
ServerSocket[addr=/192.168.1.100,port=0,localport=8888]
127.0.0.1失败
192.168.1.100成功Socket[addr=/192.168.1.100,port=8888,localport=59429]
可以看到默认邦定到的是0.0.0.0,此时使用任何能标记到本台电脑的IP都可以访问到8888端口。
当然,这也不是双网卡的验证,因为还是在一个网卡上玩。有条件的可以到刀片机上小测一把。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。