我正在创建一个基于Java的服务器.
我正在使用服务器套接字来接收传入消息.
但是在程序的某个时刻,我希望服务器套接字监听另一个端口.
我关闭服务器插座.并使用我的新端口开始一个新端口.一切顺利.
但是,当我再次将服务器套接字更改为以前的端口时,它给我一个错误.
我已经阅读了一些有关服务器套接字在关闭后保持超时状态的信息.
所以这是我的问题:
我可以避开服务器套接字的这种超时状态,并在关闭它并想再次监听相同的端口后再次使我的端口可用吗?
编辑:我的功能,使和侦听服务器套接字&我的功能使服务器套接字无效并在之后创建一个新的套接字
public void makeServerSocketWithPort(int portnr) throws IOException, Exception
{
server = new ServerSocket(portnr);
server.setReuseAddress(true);
while(!portchanged)
{
Socket sock = server.accept();
System.out.println(server.getLocalPort());
System.out.println(sock.getLocalPort());
handler = new Requesthandler(sock); //should be in a thread
System.out.println(server.getLocalPort());
System.out.println(sock.getLocalPort());
}
}
public void invalidateRequestHandler(int newPort)
{
if(server != null)
{
portchanged = true;
try {
server.close();
} catch (IOException ex) {
Logger.getLogger(Controlserver.class.getName()).log(Level.SEVERE, null, ex);
}
}
portchanged = false;
makeServerSocketWithPort(newPort);
}
错误StackTrace:
Exception in thread "main" java.net.SocketException: Socket closed
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:408)
at java.net.ServerSocket.implAccept(ServerSocket.java:462)
at java.net.ServerSocket.accept(ServerSocket.java:430)
at stuff.Controlserver.makeServerSocketWithPort(Controlserver.java:63)
at stuff.Main.main(Main.java:44)
编辑:
第二次尝试将其修复为无济于事:
public void makeServerSocketWithPort(int portnr, boolean invalidated) throws IOException, Exception
{
if(!invalidated)
{
server = new ServerSocket();
server.setReuseAddress(true);
server.bind(new InetSocketAddress(portnr));
portchanged = false;
}
else
{
//TODO: invalidate the old requestHandler
if(server != null)
{
try
{
server.close();
server = null;
}
catch (IOException ex)
{
Logger.getLogger(Controlserver.class.getName()).log(Level.SEVERE, null, ex);
}
}
if(server.isClosed())
{
System.out.println("closed biatch!");
}
else
{
System.out.println("surprise moddafakkaaaaa!!!");
}
//---------------------------------------------
//then make new requestHandler with new port
portchanged = true;
}
while(!portchanged)
{
if(server != null && !server.isClosed() && !invalidated)
{
Socket sock = server.accept();
System.out.println(server.getLocalPort());
System.out.println(sock.getLocalPort());
System.out.println("test");
handler = new Requesthandler(sock); //should be in a thread
handler.start();
System.out.println("ja harm");
System.out.println(server.getLocalPort());
System.out.println(sock.getLocalPort());
}
else
{
portchanged = true;
}
}
if(portchanged)
{
portchanged = false;
makeServerSocketWithPort(portnr, false);
}
}
同样,这正常工作.我可以浏览我的html页面.当我通过其中一个网页更改端口号时,它已正确存储并在我的存储xml文件中更改.
但是,当我更改套接字并通过该套接字立即导航到页面时,它说它已关闭并且直到我重新启动应用程序后才起作用.
我仍在寻找避免这种重启的方法.
好吧,我解决了这个谜.
我只需要稍微重构一下类就可以更好地支持线程.我没有关闭套接字然后创建新线程,而是启动了一个新线程,然后关闭了套接字.经过一番摆弄之后,它似乎工作正常.
感谢您的答复和材料.