【问题标题】:How to restart a serverSocket in java如何在java中重新启动serverSocket
【发布时间】:2013-12-31 15:28:57
【问题描述】:

我正在尝试添加一个重启服务器功能,该功能会弹出所有玩家和线程,然后为新玩家启动一个新的服务器套接字。这是我尝试过的方法,但是当我重新启动时,尝试添加更多他们没有连接的玩家?

任何帮助都会很棒,谢谢。或者,有没有办法在不关闭套接字的情况下从服务器弹出所有连接?

private volatile ServerSocket ss;

private Socket p1;
private Socket p2;

private GameSession ses;

private ObjectOutputStream top1;
private ObjectOutputStream top2;

 public void connectToClient() {
    try {
        ss = new ServerSocket(8000);

        while (true) {


            p1 = ss.accept();

            top1 = new ObjectOutputStream(p1.getOutputStream());

            p2 = ss.accept();

            top2 = new ObjectOutputStream(p2.getOutputStream());

            see = new GameSession(p1, p2, top1, top2);

            new Thread(see).start();

        }
    } catch (IOException ex) {
        System.err.println(ex);
    }
}

private void restartServer() {
    if (ss.isBound()) {
        try {
            ss.close();
            ss = new ServerSocket(8000);

            displayLog.append(new Date() + ": Server started at socket "
                    + ss.getLocalPort() + '\n');

        } catch (IOException ex) {
            System.err.println(ex);
        }
    }
}

【问题讨论】:

  • 你在播放器端做什么?我会考虑发送一条消息说您正在关闭并重新启动,以便玩家可以做一些有用的事情,例如尝试再次连接。

标签: java sockets networking serversocket


【解决方案1】:

您的restartServer 方法不包含任何开始新游戏的功能。它所做的只是创建一个不做任何事情的新ServerSocket。不要实例化新的ServerSocket,而是在close 之后调用connectToClient

private void restartServer() {
    if (ss.isBound()) {
        try {
            ss.close();
            connectToClient();

            displayLog.append(new Date() + ": Server started at socket "
                + ss.getLocalPort() + '\n');

        } catch (IOException ex) {
            System.err.println(ex);
        }
    }
}

【讨论】:

  • 这不起作用,它只是导致服务器挂起?与客户端的连接处于 while 循环中,我需要打破它吗?
【解决方案2】:

关闭 ServerSocket 并创建一个新的并不能完成任何有用的事情。这样做的唯一影响是导致挂起的、未接受的连接上的连接丢失。删除它。

您必须关闭 已接受 套接字,并让客户端通过尝试重新连接来对此做出反应。

【讨论】:

    【解决方案3】:

    重新启动ServerSocket 应该可以。我假设您在与connectToClient 不同的线程中调用restartServerServerSocker 也应该是 volatile

    【讨论】:

    • 我已将其更改为 volatile,它使用与 ConnectToClient 相同的线程,我只在新游戏会话期间引入新线程。仍然没有连接新客户
    • 当您关闭服务器套接字时,您的循环被 IOException 停止。你必须重新启动它。还有你为什么要关闭ss呢?
    【解决方案4】:
    1. 停止线程(首先保持线程实例)- 关闭线程时,首先关闭客户端套接字。
    2. 关闭ServerSocket
    3. 调用 connectToCLient

    【讨论】:

    • 我已经传递了线程和套接字的实例,我应该保留它们吗?
    • 保持线程参考 - 你只是谷歌如何停止线程。在停止线程之前关闭客户端套接字。
    猜你喜欢
    • 2022-11-15
    • 2010-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多