我对Socket和ServerSocket端口的使用感到困惑。Oracle Java教程中关于sockets的内容如下所述:
一个Socket是什么?
通常情况下,服务器运行在一台特定的计算机上,并拥有一个绑定到特定端口号的Socket。服务器只是等待,监听Socket以等待客户端发出连接请求。 在客户端方面:客户端知道服务器正在运行的机器的主机名和服务器正在侦听的端口号。为了发出连接请求,客户端尝试在服务器的机器和端口上与服务器会合。客户端还需要向服务器标识自己,因此它绑定到一个本地端口号,在此连接期间将使用该端口号。这通常由系统分配。
如果一切顺利,服务器接受连接。一旦接受,服务器获取一个新的Socket,绑定到相同的本地端口,并且其远程端点设置为客户端的地址和端口。它需要一个新的Socket,以便可以继续监听原始Socket以等待连接请求,同时满足已连接客户端的需求。
在客户端方面,如果连接被接受,则成功创建一个Socket,客户端可以使用该Socket与服务器通信。现在,客户端和服务器可以通过写入或读取其Sockets来进行通信。
一个Socket是什么?
通常情况下,服务器运行在一台特定的计算机上,并拥有一个绑定到特定端口号的Socket。服务器只是等待,监听Socket以等待客户端发出连接请求。 在客户端方面:客户端知道服务器正在运行的机器的主机名和服务器正在侦听的端口号。为了发出连接请求,客户端尝试在服务器的机器和端口上与服务器会合。客户端还需要向服务器标识自己,因此它绑定到一个本地端口号,在此连接期间将使用该端口号。这通常由系统分配。
如果一切顺利,服务器接受连接。一旦接受,服务器获取一个新的Socket,绑定到相同的本地端口,并且其远程端点设置为客户端的地址和端口。它需要一个新的Socket,以便可以继续监听原始Socket以等待连接请求,同时满足已连接客户端的需求。
在客户端方面,如果连接被接受,则成功创建一个Socket,客户端可以使用该Socket与服务器通信。现在,客户端和服务器可以通过写入或读取其Sockets来进行通信。
我尝试了下面的代码进行测试,但是它抛出了一个异常。
try {
ServerSocket serverSocket = new ServerSocket(8080);
Socket socket = serverSocket.accept();
// This prints 8080
System.out.println("Local port of accepted socket : " + socket.getLocalPort());
// But this throws java.net.BindException: Address already in use: JVM_Bind
Socket myClientSocket = new Socket("www.google.com", 80, null, 8080);
} catch (Exception e) {
e.printStackTrace();
}
我的问题很明显。当从 serverSocket.accept()
返回的套接字可以使用相同的本地端口(8080
)时,为什么我创建的套接字不能使用它?