java - 客户端一打开,服务器端就关闭

标签 java server

到目前为止,我的服务器客户端应用程序运行良好。然后突然当我决定运行它时(首先是服务器,然后是客户端),服务器窗口在打开客户端窗口一秒钟后关闭。现在,只有客户端窗口保持打开状态。但是,javaw.exe 进程(其中有 2 个,服务器和客户端)不会停止。它们与我在游戏中使用的端口号 Hook 。因此,再次运行时出现 JVM_Bind 异常。

我终止了两个进程并再次运行应用程序,但出现了同样的问题。我什至更改了端口号(当然在两个项目上),但它给了我相同的结果。

服务器和客户端会像任何多人游戏一样自动发送和接收内容。

客户端:

private void tick() {
    String info = handler.getPlayer(0).getX() + " " + handler.getPlayer(0).getY() + " " + handler.hb2.width + " " + handler.getPlayer(0).h1.x + " " + handler.getPlayer(0).h1.y + " " + handler.getPlayer(0).h2.x + " " + handler.getPlayer(0).h2.y + handler.getPlayer(0).h1.punch + " " + handler.getPlayer(0).h2.punch;
    sendMessage(info);
    String infoR = "";
    try {
        infoR = br.readLine();
    } catch (IOException e) {
        e.printStackTrace();
    }
    Scanner s = new Scanner(infoR);
    int a = 0;
    while(s.hasNext()) {
        String poop = s.next();
        a++;
        try {
            switch(a) {
            case 1:
                handler.getPlayer(1).x = Integer.parseInt(poop);
                break;
            case 2:
                handler.getPlayer(1).y  = Integer.parseInt(poop);
                break;
            case 3:
                handler.hb1.width = Integer.parseInt(poop);
                break;
            case 4:
                handler.getPlayer(1).h1.x = Integer.parseInt(poop);
                break;
            case 5:
                handler.getPlayer(1).h1.y = Integer.parseInt(poop);
                break;
            case 6:
                handler.getPlayer(1).h2.x = Integer.parseInt(poop);
                break;
            case 7:
                handler.getPlayer(1).h2.y = Integer.parseInt(poop);
                break;
            case 8:
                handler.getPlayer(1).h1.punch = Boolean.getBoolean(poop);
                break;
            case 9:
                handler.getPlayer(1).h2.punch = Boolean.getBoolean(poop);
                break;
            }
        } catch(NumberFormatException e) {
            frame.setVisible(false);
            poop += " " + s.next(); 
            if(poop.equals("you lose")) new ResultDisplay("red");
            handler.hb1.resultDisplayed = true;
            stop();
        }
    }
    handler.tick();
}

public void sendMessage(String message) {
    pw.println(message);
    pw.flush();
}

private void init() {
    try {
        sock = new Socket("127.0.127.1", 1111);
        ostream = sock.getOutputStream();
        pw = new PrintWriter(ostream);
        istream = sock.getInputStream();;
        br = new BufferedReader(new InputStreamReader(istream));
    } catch (IOException e) {
        e.printStackTrace();
    }
    // more game initialization code follows

首先调用 init(),然后调用 tick() 方法,每秒调用 60 次(理想情况下)。

服务器端:

    private void tick() {
    String info = handler.getPlayer(1).getX() + " " + handler.getPlayer(1).getY() + " " + handler.hb1.width + " " + handler.getPlayer(1).h1.x + " " + handler.getPlayer(1).h1.y + " " + handler.getPlayer(1).h2.x + " " + handler.getPlayer(1).h2.y + " " + handler.getPlayer(1).h1.punch + " " + handler.getPlayer(1).h2.punch;
    String infoR = "";
    try {
        infoR = br.readLine();
    } catch (IOException e) {
        e.printStackTrace();
    }
    Scanner s = new Scanner(infoR);
    int a = 0;
    while(s.hasNext()) {
        a++;
        String poop = s.next();
        try {
            switch(a) {
            case 1:
                handler.getPlayer(0).x = Integer.parseInt(poop);
                break;
            case 2:
                handler.getPlayer(0).y  = Integer.parseInt(poop);
                break;
            case 3:
                handler.hb2.width = Integer.parseInt(poop);
                break;
            case 4:
                handler.getPlayer(0).h1.x = Integer.parseInt(poop);
                break;
            case 5:
                handler.getPlayer(0).h1.y = Integer.parseInt(poop);
                break;
            case 6:
                handler.getPlayer(0).h2.x = Integer.parseInt(poop);
                break;
            case 7:
                handler.getPlayer(0).h2.y = Integer.parseInt(poop);
                break;
            case 8:
                handler.getPlayer(0).h1.punch = Boolean.getBoolean(poop);
                break;
            case 9:
                handler.getPlayer(0).h2.punch = Boolean.getBoolean(poop);
                break;
            }
        }catch(NumberFormatException e) {
            frame.setVisible(false);
            poop += " " + s.next(); 
            if(poop.equals("you lose")) new ResultDisplay("green");
            handler.hb2.resultDisplayed = true;
            stop();
        }
    }
    sendMessage(info);
    handler.tick();
}

public void sendMessage(String message) {
    pw.println(message);
    pw.flush();
}

private void init() {
    try {
        sersock = new ServerSocket(1111);
        sock = sersock.accept();
        br = new BufferedReader(new InputStreamReader(sock.getInputStream()));
        pw = new PrintWriter(sock.getOutputStream());
    } catch (IOException e) {
        e.printStackTrace();
    }
    // more game initialization code follows

主游戏线程调用 init()tick() 均由两个项目中的主游戏线程调用

最佳答案

在服务器上的开关周围进行尝试和捕获时,您通过实际将框架的可见性设置为 false 来处理异常,并且不会打印出异常,从而解释了为什么您不这样做没有异常(exception)。

}catch(NumberFormatException e) {
    frame.setVisible(false); //<-- This bit
    poop += " " + s.next(); 
    if(poop.equals("you lose")) new ResultDisplay("green");
    handler.hb2.resultDisplayed = true;
    stop();
}

当然你捕获它是有原因的,但也许你应该打印出它抛出的异常而不是隐藏框架?它可能会抛出一些你不希望它抛出的东西。

关于java - 客户端一打开,服务器端就关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40263120/

相关文章:

java - 避免来自 Web 应用程序上下文根的版本号

Python TCP 服务器 - 删除连接

c - 使用 pthreads 时无法捕获 SIGINT 信号

android - 在客户端搜索服务器 IP 而不是输入

java - 如何使用 java 从 Microsoft 文档创建预览图像

java - 如何检查数组索引是否为空,如果是则检查下一个?

java - 从 php web 与 Linux 脚本通信

java - 计算代码行数 - 质量指标

javascript - 如何在Azure Web App服务上启动node.js服务器?

c++ - 使成员函数线程出现问题