java - 简单的服务器/套接字程序中不完整的连接

标签 java multithreading sockets

我有 2 个类,分别是 GameServerNetworkThread。程序从其他地方创建一个套接字,然后将其传递给 NetworkThread 的构造函数
我只想有 2 个客户端,并且这两个客户端可以相互交互。 NetworkThread 构造函数中第一个客户端的 id 为 1,另一个客户端的 id 为 2。 但是当我启动第二个客户端的连接时,它永远不会进入 NetworkThread 类。这是我的代码:

网络线程类:

public class NetworkThread implements Runnable, ActionListener {

    Socket newClient;
    String userName;
    int id;

    Scanner sc = null;
    PrintWriter pw = null;

    public NetworkThread(Socket newClient, String userName, int id) {
        this.userName = userName;
        this.newClient = newClient;
        this.id = id;

        try {
            pw = new PrintWriter(newClient.getOutputStream());
            sc = new Scanner(newClient.getInputStream());
        } catch (IOException e) {
        }

        ConstructFrame();
        if (id == 1)
            changeTurnAsAGuesser();
        else
            startConnectionForSecondPlayer();
    }

    @Override
    public void run() {
    }

    private void changeTurnAsAGuesser() {   
        String word;
        String passing;

        word = JOptionPane.showInputDialog(null, "Enter Word",
                "input" + userName, JOptionPane.QUESTION_MESSAGE).toUpperCase();
        passing = "~:";
            do {
                char x = sc.nextLine().charAt(0);
                // after some works with ~> passing
                pw.println(passing);
                pw.flush();
            } while (checkWord(word, passing) == false);

                 //checkWord method returns a boolean
        } catch (Exception e) {
        }
    }
    private void startConnectionForSecondPlayer() {
        new Thread() {
            public void run() {
                while (true) {
                    String taken = sc.nextLine();
                    jf.setTitle(taken);
                }
            }
        }.start();
    }
}

游戏服务器类:

public class GameServer {

    static int i = 0;
    ServerSocket gameServer = null;
    String userName;

    public GameServer(String username) {
        this.userName = username;
        new Thread() {
            public void run() {
                try {
                    gameServer = new ServerSocket(4444);
                } catch (IOException e) {
                }
                while (true) {
                    try {
                        i++;
                        Socket newClient = gameServer.accept();
                        System.out.println(i);
                        Thread th = new Thread(new NetworkThread(newClient,
                                userName, i));
                        th.start();
                    } catch (UnknownHostException e) {
                    } catch (IOException e) {
                    }
                }
            }
        }.start();
    }
}  

编辑:我想实现一个 Hangman 游戏,其中第一个客户端说出一个单词,另一个客户端尝试猜测该单词,但我的主要问题是我无法启动成功的连接!

最佳答案

啊我明白了。您将在 NetworkThread 的构造函数中完成所有工作,而不是在 run() 方法中。在构造函数中,当 id == 1 时,会在执行 accept 的同一线程中调用 changeTurnAsAGuesser。在返回之前不会进行其他 accept 调用。

您需要做的是从构造函数中删除 if (id == 1) 代码并将其移至由后台线程:

public NetworkThread(Socket newClient, String userName, int id) {
    ...
    ConstructFrame();
    // don't do the interactive work in the constructor
}

@Override
public void run() {
    // do it in the background thread
    if (id == 1)
        changeTurnAsAGuesser();
    else
        startConnectionForSecondPlayer();
}

关于java - 简单的服务器/套接字程序中不完整的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10092108/

相关文章:

c++ - 缓存高效的多线程归并排序

java - 不可变但可刷新的集合?

c# - 同步多套接字客户端说明

linux - 为什么我不是从bind()而是从listen()得到EADDRINUSE?

java - 如何从 char[] 数组转换为 BitSet

java - 如何将整数值分配给数组并将它们传递给另一个函数?

java - 如何在netbeans中创建gradle多项目?

java - 如何自定义我的 log4j2.xml 参数

android - 如何从线程中获取 textView.setText?

java - 通过 TCP 套接字发送对象 - ClassNotFoundException