Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ServerSocket如何在接受客户端后将新套接字绑定到同一本地端口?_Java_Sockets_Tcp - Fatal编程技术网

Java ServerSocket如何在接受客户端后将新套接字绑定到同一本地端口?

Java ServerSocket如何在接受客户端后将新套接字绑定到同一本地端口?,java,sockets,tcp,Java,Sockets,Tcp,我对套接字和服务器套接字端口的用法感到困惑。他说: 什么是插座? 通常,服务器在特定的计算机上运行,并且具有绑定到特定端口号的套接字。服务器只是等待,监听套接字,等待客户端发出连接请求。 在客户端:客户端知道运行服务器的机器的主机名和服务器侦听的端口号。为了发出连接请求,客户端尝试在服务器的机器和端口上与服务器会合。客户端还需要向服务器标识自己,以便绑定到将在此连接期间使用的本地端口号。这通常由系统分配 如果一切顺利,服务器将接受连接依赖 接受后,服务器将获得绑定到同一本地端口的新套接字 并将其

我对套接字和服务器套接字端口的用法感到困惑。他说:

什么是插座?

通常,服务器在特定的计算机上运行,并且具有绑定到特定端口号的套接字。服务器只是等待,监听套接字,等待客户端发出连接请求。 在客户端:客户端知道运行服务器的机器的主机名和服务器侦听的端口号。为了发出连接请求,客户端尝试在服务器的机器和端口上与服务器会合。客户端还需要向服务器标识自己,以便绑定到将在此连接期间使用的本地端口号。这通常由系统分配

如果一切顺利,服务器将接受连接<强>依赖 接受后,服务器将获得绑定到同一本地端口的新套接字 并将其远程端点设置为 客户它需要一个新的套接字,以便可以继续侦听 用于连接请求的原始套接字,同时满足 连接的客户端

在客户端,如果连接被接受,将成功创建套接字,并且客户端可以使用该套接字与服务器通信。 客户机和服务器现在可以通过向套接字写入或从套接字读取来进行通信

我尝试了以下代码进行测试。但它抛出了一个例外

试试看{
ServerSocket ServerSocket=新的ServerSocket(8080);
Socket=serverSocket.accept();
//这张是8080
System.out.println(“接受套接字的本地端口:+socket.getLocalPort());
//但这会抛出java.net.BindException:地址已在使用中:JVM\u Bind
Socket myClientSocket=新套接字(“www.google.com”,80,null,8080);
}捕获(例外e){
e、 printStackTrace();
}

我的问题很明显。虽然从
serverSocket.accept()
返回的套接字可以使用相同的本地端口(
8080
),但为什么我创建的套接字不能使用它?

您的服务器和客户端使用相同的本地端口进行通信。当您创建服务器套接字时,您“说”它必须侦听8080端口。没关系。任何想要与服务器套接字通信的人都必须使用这样的端口

但是,就在下面,您正在创建一个客户端套接字,该套接字使用端口80连接到google站点(google正在侦听该端口),在最后一个参数中,您说该套接字还必须使用本地端口8080来建立连接。一次只能有一个连接使用一个端口,这就是为什么您得到java.net.BindException,服务器和客户端连接都使用8080

我的建议。。。从套接字客户机构造函数中获取最后两个参数,或者更改本地客户机端口(始终获取较高的数字,以避免其他进程出现相同的问题):


为了简单起见,侦听TCP套接字已显式绑定到端口,因此不能将第二个TCP套接字显式绑定到同一端口(除非两个套接字也显式绑定到不同的IP地址,不包括INADDR_ANY)


接受的套接字不经过显式的“绑定”过程。他们自动获取本地IP地址和端口,如果不绑定就连接出站套接字,也会自动获取出站套接字。

OP询问为什么会发生这种情况,因为使用服务器
accept
创建的端口允许具有
8080
的本地端口。我想我已经回答了这个问题,当时我说:“一次只有一个进程可以使用一个端口,这就是为什么您会得到java.net.BindException。”他对服务器和客户端(入站和出站)都使用8080本地端口@RaphaelMoita所有这些代码都在同一个进程中运行。您还没有回答这个问题。@RaphaelMoita您的编辑没有改进。“一次只能有一个连接使用一个端口”显然是错误的。您可以在同一个本地端口上有数千个入站连接。同意“进程”这个词”“我错了。希望我所做的编辑有助于澄清我的意思。“一次只能有一个连接使用一个端口,这就是为什么您得到java.net.BindException,服务器和客户端连接都使用8080。”因为这是他们设计的方式。请清楚你所引用的内容。
Socket myClientSocket = new Socket("www.google.com", 80);
Socket myClientSocket = new Socket("www.google.com", 80, null, 58080);