如何在Java中使用来自Client Handler Threads的数据

时间:2017-04-19 14:18:59

标签: java multithreading sockets

我遵循了一些教程,并了解了如何将线程用于多线程套接字服务器。我已经为客户端创建了一个具有ClientServiceThread类的Server类。当线程从客户端收到消息时,如何使用Server类访问该信息?

这是我的服务器主题:

public void run(){
        game = new Game();
        try{
            serverSocket = new ServerSocket(port);
            System.out.println("Server Started");
        }
        catch (IOException e){
            System.out.println(e);
        }

        while(true) {
            try {
                Socket clientSocket = serverSocket.accept();
                ClientServiceThread cliThread = new ClientServiceThread(clientSocket);
                threads.add(cliThread);
                cliThread.start();
            } catch(IOException e) {
                e.printStackTrace();

            }
        }


    }

这是我的ClientServiceThread类:

public void run() {
        boolean m_bRunThread = true;
        System.out.println("Accepted Client Address - " + socket.getInetAddress().getHostAddress());
        try {
            out = new ObjectOutputStream(socket.getOutputStream());
            in = new ObjectInputStream(socket.getInputStream());

            while(m_bRunThread) {
                String clientCommand = in.readUTF();
                System.out.println("Client Says :" + clientCommand);

                if(!gameStarted) {
                    out.writeUTF("GAME_ALREADY_STARTED");
                    out.flush();
                }
            }
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

编辑1:基本上,我正在监听客户端处理程序线程上的命令/消息。我后来想把它们处理到我的服务器中,这样我就可以通过它操纵我的Game对象了。

1 个答案:

答案 0 :(得分:0)

我建议的方法是将游戏对象传递给客户端线程(它必须是线程安全的!),然后让客户端线程直接对游戏对象执行操作。这将简化您的服务器类,并为您提供一个处理传入消息的位置。