如何让Java中的SocketServer阻止正在使用的端口?

如何让Java中的SocketServer阻止正在使用的端口?,java,port,bind,serversocket,Java,Port,Bind,Serversocket,这是我在这里的第一个问题,我将尽可能多地提供信息 我的电脑上安装了Apache 2.2的本地安装。我默认绑定到端口100(不要问我为什么)。运行Apache时,无法创建端口为100的套接字服务器,因为该端口已在使用中。我想做的是在我正在编写的Java服务器中复制这个功能 目前,我创建了一个套接字服务器,如下所示: ServerSocket srv = new ServerSocket(100); 问题是,这不会阻止其他应用程序使用此端口。我可以运行Java应用程序的多个副本,甚至在此之后启动A

这是我在这里的第一个问题,我将尽可能多地提供信息

我的电脑上安装了Apache 2.2的本地安装。我默认绑定到端口100(不要问我为什么)。运行Apache时,无法创建端口为100的套接字服务器,因为该端口已在使用中。我想做的是在我正在编写的Java服务器中复制这个功能

目前,我创建了一个套接字服务器,如下所示:

ServerSocket srv = new ServerSocket(100);
问题是,这不会阻止其他应用程序使用此端口。我可以运行Java应用程序的多个副本,甚至在此之后启动Apache服务器。我希望java服务器套接字模仿Apache的行为,并阻止其他应用程序绑定到所选端口

我尝试使用Google,我唯一能找到的就是这一点,这意味着创建如上所示的套接字服务器会阻止该端口在其他应用程序中使用

我使用的是Windows7 Ultimate-64位、NetBeans IDE 6.9.1和Java1.6.023

谢谢用户658991

似乎只有在客户端连接或调用ServerSocket.accept()之后,端口才会被阻止


不应该是这样

ServerSocket ss=新的ServerSocket(9987)

如果我有另一个进程试图 ServerSocket ss=新的ServerSocket(9987)

它会给我这个错误

java.net.BindException:地址已在使用中:JVM\u Bind 位于java.net.PlainSocketImpl.socketBind(本机方法) 位于java.net.PlainSocketImpl.bind(未知源) 位于java.net.ServerSocket.bind(未知源) 位于java.net.ServerSocket。(未知源) 位于java.net.ServerSocket。(未知源)
在MainDriver.main(MainDriver.java:15)

中,情况不应该是这样

ServerSocket ss=新的ServerSocket(9987)

如果我有另一个进程试图 ServerSocket ss=新的ServerSocket(9987)

它会给我这个错误

java.net.BindException:地址已在使用中:JVM\u Bind 位于java.net.PlainSocketImpl.socketBind(本机方法) 位于java.net.PlainSocketImpl.bind(未知源) 位于java.net.ServerSocket.bind(未知源) 位于java.net.ServerSocket。(未知源) 位于java.net.ServerSocket。(未知源)
在MainDriver.main(MainDriver.java:15)

服务器套接字是否实际绑定到端口,还是只有在以后调用“listen”时才会发生这种情况?我怀疑ctor只是将“100”存储在某个字段中

Rgds,
Martin

服务器套接字是否实际绑定到端口,还是只有在以后调用“listen”时才会发生这种情况?我怀疑ctor只是将“100”存储在某个字段中

Rgds,
Martin

创建ServerSocket本身应该会阻塞端口。看看你的代码,它可能在某个地方出错。

创建ServerSocket本身应该会阻塞端口。查看您的代码,它可能在某个地方出错。

如果您正在调用
ServerSocket
对象的close()方法,端口将不再被阻止,并且可以被其他应用程序绑定使用

如果您希望让长时间运行的应用程序在特定端口上侦听,就像Apache那样,那么您应该让ServerSocket对象在一个线程中接受连接,并为接收到的每个连接生成线程


这是通过调用ServerSocket类的
accept()
方法来完成的,这样每个请求都将创建一个唯一的
Socket
对象,然后从中读取和写入该对象。

如果调用
ServerSocket
对象的close()方法,端口将不再被阻塞,并且可以绑定到,通过其他应用程序

如果您希望让长时间运行的应用程序在特定端口上侦听,就像Apache那样,那么您应该让ServerSocket对象在一个线程中接受连接,并为接收到的每个连接生成线程


这是通过调用ServerSocket类的
accept()
方法来实现的,这样每个请求都将创建一个唯一的
Socket
对象,然后从中读取和写入该对象。

请记住,主机上可能有多个网络接口。通常,您将有一个物理接口和(可选)环回接口(127.0.0.1)

ServerSocket允许使用绑定到所有(0.0.0.0)或特定的


因此,在同一台主机上,您可以侦听同一端口,但在不同的网络接口上。

请记住,主机上可能有多个网络接口。通常,您将有一个物理接口和(可选)环回接口(127.0.0.1)

ServerSocket允许使用绑定到所有(0.0.0.0)或特定的


因此,在同一台主机上,您可以在不同的网络接口上侦听相同的端口。

要查看套接字是否成功绑定,请使用
srv.isBound()
方法。这可能会验证@biziclop的注释。

要查看套接字是否成功绑定,请使用
srv.isBound()
方法。这可能会验证@biziclop的评论。

你绝对确定你的程序正在运行吗?我想它可能已经跑完了。请张贴您的完整代码。下面的代码肯定会阻塞端口

ServerSocket server = new ServerSocket(3000);

while(true){
    Socket socket = server.accept();
    socket.close();
}

你绝对确定你的程序正在运行吗?我想它可能已经跑完了。请张贴您的完整代码。下面的代码肯定会阻塞端口

ServerSocket server = new ServerSocket(3000);

while(true){
    Socket socket = server.accept();
    socket.close();
}

你错了。只要ServerSocket存在,创建ServerSocket将阻止其他程序绑定到该端口号。Apache没有任何特殊的魔力,这是TCP的一个基本属性。可能您的套接字正在被垃圾收集?

您错了。只要ServerSocket存在,创建ServerSocket将阻止其他程序绑定到该端口号。Apache没有任何特殊的mag