我正在编写客户端/服务器游戏。我正在使用Eclipse。客户端使用Swing的GUI。到现在为止,我运行了一次服务器,然后运行了客户端,右键单击了类 - >跑来跑去。一切都很好。现在我需要运行两次客户端类。我尝试了服务器和客户端运行时,再次右键单击客户端 - >跑来跑去。有两个客户端进程,但只有一个GUI JFrame。
我想以这种方式测试它,运行服务器,运行客户端,运行客户端以便运行两个客户端然后在第一个客户端上我想点击第一个按钮(它的新游戏)和第二个客户端我想要点击第二个按钮(它现有的游戏连接),但对我来说,它无法为两个客户端进程运行两个GUI。我只有第一个客户端的第一个GUI,然后只运行第二个客户端的进程(无GUI)
非常感谢,
马立克
编辑:
SERVER - main
public static void main(String [] argv) throws IOException,ClassNotFoundException {
ServerListen server = new ServerListen(PORT);
server.acceptConnection();
}
SERVER - acceptConnection();
Socket dataSocket = null;
ObjectInputStream readBuffer = null;
ObjectOutputStream writeBuffer = null;
while( true ) {
try{
dataSocket = socket.accept();
System.err.println("!!! Connection !!!");
writeBuffer = new ObjectOutputStream(dataSocket.getOutputStream());
writeBuffer.flush();
readBuffer = new ObjectInputStream((dataSocket.getInputStream()));
writeBuffer.writeObject("OKlisten");
writeBuffer.flush();
System.err.println("Client connected");
new Handler(dataSocket,readBuffer,writeBuffer).runGame(list_of_games);
} catch (IOException e) {
System.err.println(e);
System.exit(1);
}
}
}
这只运行一次。
客户 - 主要
public static void main(String [] argv) throws IOException, ClassNotFoundException {
Client client = new Client(PORT);
final Basic frame = new Basic(client);
frame.setVisible(true);
}
P.S - 你看到的打印版!!!连接!!!当我右键单击时 - >第二次在客户端运行没有第二次!!!连接!!!消息
非常感谢你
编辑2。
public Client(int PORT)
{
try{
this.clientSocket = new Socket(serverName, PORT);
sendMessage = new ObjectOutputStream(clientSocket.getOutputStream());
sendMessage.flush();
getMessage = new ObjectInputStream(clientSocket.getInputStream());
}
这是代码的一部分,在第二个客户端,它在getMessage行冻结。
答案 0 :(得分:0)
您需要运行任何长时间运行的代码,例如后台线程中的while (true)
循环,否则您可能会占用Swing事件线程,冻结您的应用程序。
例如,您的代码可能类似于:
// implement Runnable so it can be run in a background thread
public class MultiServer2 implements Runnable {
public static final int PORT_NUMBER = 2222;
private static final int THREAD_POOL_COUNT = 20;
private List<MultiClientHandler> clientList = new ArrayList<>();
private ServerSocket serverSocket;
private ExecutorService clientExecutor = Executors.newFixedThreadPool(THREAD_POOL_COUNT);
public MultiServer2() throws IOException {
serverSocket = new ServerSocket(PORT_NUMBER);
}
@Override
public void run() {
// do this in the run method so that it runs in a background thread
while (true) {
try {
Socket clientSocket = serverSocket.accept();
// MultiClient2 also implements Runnable
MultiClientHandler client = new MultiClientHandler(clientSocket);
clientList.add(client);
// and each socket's code needs to be run in its own thread
clientExecutor.execute(client);
} catch (IOException e) {
// TODO notify someone of problem!
e.printStackTrace();
}
}
}
使用类似于:
的main方法public static void main(String[] args) {
try {
MultiServer2 multiServer = new MultiServer2();
new Thread(multiServer).start(); // this runs the runnable
} catch (IOException e) {
e.printStackTrace();
}
}