我正在尝试使用一台服务器和两个客户端来编程游戏,该服务器要求他们提供5个州的5个大写字母,拥有正确答案的客户端将获胜,如果正确答案相等,他们也可以并列,如您所见,这很简单,我的问题是我不知道如何比较每个客户的正确答案的数量
我尝试使用面向Java的非阻塞套接字连接来解决此问题
客户:
import java.io.*;
import java.net.Socket;
import java.util.*;
import java.util.logging.*;
import java.lang.Thread;
import java.util.ArrayList;
class Persona extends Thread {
private static volatile int WON_GAMES = 0;
protected Socket sk;
protected DataOutputStream dos;
protected DataInputStream dis;
private int id;
public Persona(int id) {
this.id = id;
}
@Override
public void run() {
try {
sk = new Socket("127.0.0.1", 10578);
dos = new DataOutputStream(sk.getOutputStream());
dis = new DataInputStream(sk.getInputStream());
int i=0;
System.out.println("Deseas unirte al nuevo juego");
Scanner unirme = new Scanner(System.in);
String join_game = unirme.next();
dos.writeUTF(join_game);
String respuesta="";
respuesta = dis.readUTF();
System.out.println(" Servidor: " + respuesta);
Scanner capitales = new Scanner(System.in);
String capi = capitales.next();
dos.writeUTF(capi);
capi = capitales.next();
dos.writeUTF(capi);
capi = capitales.next();
dos.writeUTF(capi);
capi = capitales.next();
dos.writeUTF(capi);
capi = capitales.next();
dos.writeUTF(capi);
respuesta = dis.readUTF();
System.out.println(respuesta);
dis.close();
dos.close();
sk.close();
} catch (IOException ex) {
//Logger.getLogger(Persona.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
public class Cliente {
public static void main(String[] args) {
ArrayList<Thread> clients = new ArrayList<Thread>();
//for (int i = 0; i < 5; i++) {
clients.add(new Persona(1));
//}
for (Thread thread : clients) {
thread.start();
}
}
}
服务器:
import java.io.*;
import java.net.*;
import java.util.*;
import java.util.logging.*;
public class Servidor {
public static void main(String args[]) throws IOException {
ServerSocket ss,ss1;
System.out.print("Inicializando servidor... ");
try {
ss = new ServerSocket(10578);
ss1 = new ServerSocket(10579);
System.out.println("\t[OK]");
int idSession = 1;
ArrayList<String> capi_tales = new ArrayList<String>();
FileInputStream fstream = new FileInputStream("municipios.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
String strLine;
while ((strLine = br.readLine()) != null) {
capi_tales.add(strLine);
}
System.out.println (capi_tales);
int p=0;
//while (true) {
Socket socket;
socket = ss.accept();
//System.out.println("Un nuevo usuario se ha unido: ");
((ServidorHilo) new ServidorHilo(socket, idSession, capi_tales)).start();
System.out.println("Sesion server 1 iniciada...");
Socket socket1;
socket1 = ss1.accept();
((ServidorHilo) new ServidorHilo(socket1, idSession, capi_tales)).start();
System.out.println("Sesion server 2 iniciada...");
System.out.println(((ServidorHilo) new ServidorHilo(socket, idSession, capi_tales)).getRespuestas());
System.out.println(((ServidorHilo) new ServidorHilo(socket1, idSession, capi_tales)).getRespuestas());
//}
} catch (IOException ex) {
Logger.getLogger(Servidor.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
线程服务器:
import java.io.*;
import java.net.*;
import java.util.*;
import java.util.logging.*;
public class ServidorHilo extends Thread {
private Socket socket;
private DataOutputStream dos;
private DataInputStream dis;
private int idSessio;
private ArrayList<String> mun;
private int respuestas;
public ServidorHilo(Socket socket, int id, ArrayList<String> mun) {
this.socket = socket;
this.idSessio = id;
this.mun = mun;
try {
dos = new DataOutputStream(socket.getOutputStream());
dis = new DataInputStream(socket.getInputStream());
mun = new ArrayList<String>();
} catch (IOException ex) {
Logger.getLogger(ServidorHilo.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void desconnectar() {
try {
socket.close();
} catch (IOException ex) {
Logger.getLogger(ServidorHilo.class.getName()).log(Level.SEVERE, null, ex);
}
}
public int getRespuestas(){
return respuestas;
}
@Override
public void run() {
String peticion = "";
int i=0,j=0;
ArrayList<String> respuesta_capital = new ArrayList<String>();
try {
peticion = dis.readUTF();
if(peticion.equals("si")){
System.out.println("Un nuevo usuario se ha unido");
dos.writeUTF("Bienvenido al juego, "+"\n"+"¿Cuales capitales conoces de los siguientes estados? \n" + mun.get(0) + mun.get(1)+mun.get(2) +mun.get(3)+mun.get(4));
//while(i<=2){
peticion = dis.readUTF();
System.out.println(peticion);
if(peticion.equals(mun.get(6))){
j++;
System.out.println("Respuesta correcta !!");
}
//respuesta_capital.add(peticion);
peticion = dis.readUTF();
System.out.println(peticion);
if(peticion.equals(mun.get(7))){
j++;
System.out.println("Respuesta correcta !!");
}
//respuesta_capital.add(peticion);
peticion = dis.readUTF();
System.out.println(peticion);
if(peticion.equals(mun.get(8))){
j++;
System.out.println("Respuesta correcta !!");
}
//respuesta_capital.add(peticion);
peticion = dis.readUTF();
System.out.println(peticion);
if(peticion.equals(mun.get(9))){
j++;
System.out.println("Respuesta correcta !!");
}
//respuesta_capital.add(peticion);
peticion = dis.readUTF();
System.out.println(peticion);
if(peticion.equals(mun.get(10))){
j++;
System.out.println("Respuesta correcta !!");
}
dos.writeUTF("tuviste "+j+" respuestas correctas");
respuestas = j;
}
} catch (IOException ex) {
Logger.getLogger(ServidorHilo.class.getName()).log(Level.SEVERE, null, ex);
}
desconnectar();
}
}
我得到每个客户的结果,但是我无法比较它们。对于每个正在使用线程创建新进程的客户端,我都会在ArrayList中捕获答案,并将答案与具有正确答案的文件进行比较,然后将正确答案的数量返回给客户端。问题出在第二个客户端与服务器连接时,当我同时获得两个客户端的两个正确答案时,我不知道如何比较这两个结果。