Java 与同一服务器上的两个不同线程通信
所以我正在尝试创建一个多人战舰游戏。目前,我为每个客户机都有一个线程,但我想知道,一旦我将两个客户机配对,我会为一个游戏将它们放在一个新线程中吗?如果是这样,我会将客户端线程存储在游戏线程中还是仅存储在套接字中。ObjectInput和Output流位于clientThreads内部,一旦游戏线程启动,我就无法读取它们 服务器:Java 与同一服务器上的两个不同线程通信,java,multithreading,java-threads,Java,Multithreading,Java Threads,所以我正在尝试创建一个多人战舰游戏。目前,我为每个客户机都有一个线程,但我想知道,一旦我将两个客户机配对,我会为一个游戏将它们放在一个新线程中吗?如果是这样,我会将客户端线程存储在游戏线程中还是仅存储在套接字中。ObjectInput和Output流位于clientThreads内部,一旦游戏线程启动,我就无法读取它们 服务器: public static void startGame(String player1, String player2) { matchCount++;
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
-sserverOut
写入是如何出现在另一个ClientThread
-sserverIn
-sInputStream
中的。你能告诉我们这些线程是如何连接的吗?基本上我有两个对象(received1和received2)分别从客户端1和客户端2读取输出。但是游戏线程中的读取方法似乎不起作用,而是尝试在客户端线程类中读取。@IshmaelA。我会添加线程