0

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

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

目前,我创建了一个这样的套接字服务器:

ServerSocket srv = new ServerSocket(100);

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

我尝试使用谷歌,我唯一能找到的是这个http://www.dreamincode.net/forums/topic/124376-block-port/这意味着创建一个如上所示的套接字服务器应该阻止使用端口在其他应用程序中。

我使用的是 Windows 7 Ultimate-64bit、NetBeans IDE 6.9.1 和 Java 1.6.0_23。

感谢用户658991,

在客户端连接或除非我调用 ServerSocket.accept(); 之前,该端口似乎不会被阻塞。

try
{
    ServerSocket server = new ServerSocket(12345);
    System.out.println("Socket Server Established on port " + server.getLocalPort());
    server.accept(); // Code Stops here until connection is completed. 

    // Do Stuff
}
catch(IOException e)
{
    System.out.println("Socket Server Connection Failed!");
    System.out.println(e);
    System.exit(-1);
}
4

8 回答 8

2

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

于 2011-05-27T09:42:45.467 回答
1

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

ServerSocket server = new ServerSocket(3000);

while(true){
    Socket socket = server.accept();
    socket.close();
}
于 2011-05-27T10:05:23.217 回答
0

你误会了。只要 ServerSocket 存在,创建 ServerSocket 就会阻止其他程序绑定到该端口号。Apache 没有任何特殊的魔法,这是 TCP 的基本属性。也许您的套接字正在被垃圾收集?

于 2011-05-29T00:07:58.197 回答
0

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

于 2011-05-27T10:02:19.013 回答
0

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

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

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

于 2011-05-27T09:45:19.127 回答
0

不应该是这样的。

ServerSocket ss = 新 ServerSocket(9987);

如果我有另一个进程尝试 ServerSocket ss = new ServerSocket(9987);

它会给我这个错误。

java.net.BindException:地址已在使用:JVM_Bind at java.net.PlainSocketImpl.socketBind(Native Method) at java.net.PlainSocketImpl.bind(Unknown Source) at java.net.ServerSocket.bind(Unknown Source) at java .net.ServerSocket.(Unknown Source) at java.net.ServerSocket.(Unknown Source) at MainDriver.main(MainDriver.java:15)

于 2011-05-27T09:38:33.230 回答
0

ServerSocket ctor 是否实际绑定到端口,或者仅当您稍后调用“listen”时才会发生这种情况?我怀疑ctor只是将'100'存储在某个字段中。

Rgds,马丁

于 2011-05-27T09:38:41.890 回答
0

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

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

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

于 2011-05-27T09:49:38.470 回答