具有一台服务器的两个客户端之间的竞争游戏,Java套接字面向非阻塞连接

时间:2019-07-11 15:55:10

标签: java multithreading sockets serversocket

我正在尝试使用一台服务器和两个客户端来编程游戏,该服务器要求他们提供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中捕获答案,并将答案与具有正确答案的文件进行比较,然后将正确答案的数量返回给客户端。问题出在第二个客户端与服务器连接时,当我同时获得两个客户端的两个正确答案时,我不知道如何比较这两个结果。

0 个答案:

没有答案