Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 与同一服务器上的两个不同线程通信_Java_Multithreading_Java Threads - Fatal编程技术网

Java 与同一服务器上的两个不同线程通信

Java 与同一服务器上的两个不同线程通信,java,multithreading,java-threads,Java,Multithreading,Java Threads,所以我正在尝试创建一个多人战舰游戏。目前,我为每个客户机都有一个线程,但我想知道,一旦我将两个客户机配对,我会为一个游戏将它们放在一个新线程中吗?如果是这样,我会将客户端线程存储在游戏线程中还是仅存储在套接字中。ObjectInput和Output流位于clientThreads内部,一旦游戏线程启动,我就无法读取它们 服务器: public static void startGame(String player1, String player2) { matchCount++;

所以我正在尝试创建一个多人战舰游戏。目前,我为每个客户机都有一个线程,但我想知道,一旦我将两个客户机配对,我会为一个游戏将它们放在一个新线程中吗?如果是这样,我会将客户端线程存储在游戏线程中还是仅存储在套接字中。ObjectInput和Output流位于clientThreads内部,一旦游戏线程启动,我就无法读取它们

服务器:

public static void startGame(String player1, String player2) {

    matchCount++;

    ClientThread c1 = connectedClients.get(player1);
    ClientThread c2 = connectedClients.get(player2);

    try {
        c1.serverOut.writeObject(protocol.createMessage("send-invite", "true", "Match Started."));
        c1.serverOut.flush();
        c2.serverOut.writeObject(protocol.createMessage("send-invite", "true", "Match Started."));
        c2.serverOut.flush();
    } catch (IOException e) {
        e.printStackTrace();
    }

    lobbyList.remove(c1.player.getUserName());
    connectedClients.remove(c1.player.getUserName());
    c1.signedIn = false;
    c1.inGame = true;
    lobbyList.remove(c2.player.getUserName());
    connectedClients.remove(c2.player.getUserName());
    c2.signedIn = false;
    c2.inGame = true;

    sendUpdatedList();

    GameThread game = new GameThread(c1, c2);

    gameList.put(matchCount, game);
    gamePool.execute(game);
}
客户端线程:

public class ClientThread implements Runnable {
boolean signedIn = false;
boolean inGame = false;
private Object received;
ObjectInputStream serverIn;
ObjectOutputStream serverOut;
Player player;
Socket clientSocket;
private SimpleProtocol protocol;
private Database user;

/**
 * @param socket
 */
ClientThread(Socket socket) {
    clientSocket = socket;
    this.protocol = new SimpleProtocol();

    try {

        this.serverIn = new ObjectInputStream(new BufferedInputStream(clientSocket.getInputStream()));
        this.serverOut = new ObjectOutputStream(new BufferedOutputStream(clientSocket.getOutputStream()));

        serverOut.writeObject(protocol.createMessage("send-message", "Welcome to the Server."));
        serverOut.flush();

    } catch (IOException e) {
        e.printStackTrace();
    }
}


@Override
public void run() {
...
游戏线程:

public class GameThread implements Runnable {

private ArrayList<String> inGameMessages = new ArrayList<>();
private ClientThread client1;
private ClientThread client2;
private Player player1 = null;
private Player player2 = null;
private SimpleProtocol protocol = new SimpleProtocol();

/**
 * @param client1
 * @param client2
 */
public GameThread(ClientThread client1, ClientThread client2) {
    this.client1 = client1;
    this.client2 = client2;
}

@Override
public void run() {
    try {
       Object  received1 = client1.serverIn.readObject(); //This never seems to run

       Object received2 = client2.serverIn.readObject(); 
....
公共类GameThread实现可运行{
私有ArrayList inGameMessages=新ArrayList();
私有clientthreadclient1;
私有clientthreadclient2;
私人玩家player1=null;
私人玩家player2=null;
私有SimpleProtocol协议=新SimpleProtocol();
/**
*@param client1
*@param client2
*/
公共游戏线程(客户端线程客户端1、客户端线程客户端2){
this.client1=client1;
this.client2=client2;
}
@凌驾
公开募捐{
试一试{
Object received1=client1.serverIn.readObject();//这似乎从未运行过
Object received2=client2.serverIn.readObject();
....

“一旦我将两个客户端配对,我会将它们放在游戏的新线程中吗?”-我认为这是一个有效的假设,因为如果你不知道线程在做什么,配对将在“游戏”进行时被阻止协调其他两个客户端之间的信息,但我会将客户端线程对象添加到新游戏线程中,还是只添加来自两个客户端的套接字。或者这没有什么区别?因为目前我使用客户端线程对象作为参数来创建新游戏线程,并且我的输入和输出流似乎停止工作。I c我看不到一个
ClientThread
-s
serverOut
写入是如何出现在另一个
ClientThread
-s
serverIn
-s
InputStream
中的。你能告诉我们这些线程是如何连接的吗?基本上我有两个对象(received1和received2)分别从客户端1和客户端2读取输出。但是游戏线程中的读取方法似乎不起作用,而是尝试在客户端线程类中读取。@IshmaelA。我会添加线程