gpt4 book ai didi

java - 使用新端口重新启动 java ServerSocket

转载 作者:行者123 更新时间:2023-11-30 01:56:57 25 4
gpt4 key购买 nike

我正在尝试编写一个函数来使用新端口重新启动我的 ServerSocket。新端口由用户通过面板提供(该部分代码是正确的),其中包含 restart() 函数。新端口将保存到静态字段 portNumString。

以下是我尝试重新启动服务器的代码。重新启动的服务器无法正常工作。原端口工作正常。

 public static void main(String [] args) throws IOException, ClassNotFoundException
{
runServer(false);
}


public static void runServer(boolean changePort)
{
try
{
ServerSocket socket = new ServerSocket(Integer.parseInt(portNumString));
Server server = new Server(socket);

while(!changePort)
{
server.accept();

if(changePort && socket!=null)
{
socket.close();
runServer(false);
}
}
}
catch(Exception e)
{
System.out.println("EXCEPTION !!! "+e);
}
}


public static void restart() throws NumberFormatException, ClassNotFoundException, IOException
{
System.out.println("Restart Called... ");
runServer(true);
}

编辑:

调用restart()的代码部分

         cloesButton.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
portNumString=txtPort.getText();
try
{
restart();
}
catch(NumberFormatException e1)
{
e1.printStackTrace();
}
}
});

最佳答案

我假设从另一个线程调用 restart() ,因为 runServer 方法有一个永远不会终止的循环(因为 changePort是一个本地参数,循环内没有任何改变它)

restart() 没有停止现有服务器。

它只是再次执行该方法,启动一个 ServerSocket,旧的仍在运行。

由于 boolean 值 changePort 为 true,它甚至不会进入 while 循环,并且永远不会接受客户端套接字。另一方面,旧的服务器套接字仍然正常运行。

为了使其正常工作,您需要使用适当的类,而不是一堆静态方法。将端口号和 serverSocket 等内容作为成员变量。然后在 while 循环中检查这些内容,而无需再次调用该方法。类似于:

while (true) {
this.serverSocket = new ServerSocket(this.portNum);

try {
Socket client = server.accept();

//todo: do something with the client
}
catch (IOException ex) {
//an IO error occurred, probably we were asked to restart
}
}

然后你可以得到类似的东西:

void restart(int portNum) {
this.portNum = portNum;
try {
this.serverSocket.close();
} catch (IOException ex) {
//todo: handle it or log it somewhere
}
}

关于java - 使用新端口重新启动 java ServerSocket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54111572/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com