Как дать шанс всем клиентам один за другим отправить номер и заблокировать клиента, чтобы отправить номер, если это не его шанс в сокете java-программы.
Фактически я разрабатываю карточную игру Бинго, после раздачи карты Бинго каждому клиенту игра начинается, и каждый клиент будет играть один за другим и отправлять номер на сервер, а затем сервер будет отправлять этот номер всем клиентам это повторный процесс,
как я уже сказал ,Все клиенты будут посылать номер один за другим, если клиент будет следовать этому потоку, то выполнение программы будет таким, как я хочу **я застрял на ситуации, которая заключается в том, что если клиент вводит два номера одновременно** **то после завершения всех других клиентов шанс, когда шанс приходит к тому конкретному клиенту, который ввел два номера, не получит шанса, и второй номер, введенный этим клиентом, будет считаться его сыгранным номером. я хочу прекратить прослушивание со стороны сервера, чтобы принимать номера, если клиент вводит более одного номера одновременно.
Что я уже пробовал:
<pre> **Multiple clients and on ne server for bingo game** **<pre lang="java"> Server.java** ```import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.*; import java.util.ArrayList; public class Server { int[][] card = new int[5][5]; int[][] bingo = new int[5][5]; public int[][] bingoCard() { ArrayList<Integer> alreadyUsed = new ArrayList<>(); boolean valid = false; int tmp = 0; for (int i = 0; i <= 4; i++) { for (int row = 0; row < card.length; row++) { while (!valid) { tmp = (int) (Math.random() * 25) + 1; if (!alreadyUsed.contains(tmp)) { valid = true; alreadyUsed.add(tmp); } } card[row][i] = tmp; bingo[row][i] = tmp; valid = false; } } //create array to make title. String title[] = {"B", "I", "N", "G", "O"}; for (int i = 0; i < title.length; i++) { System.out.print(title[i] + "\t"); } System.out.println(); for (int row = 0; row < card.length; row++) { for (int col = 0; col < card[row].length; col++) { System.out.print(card[row][col] + "\t"); } System.out.println(); } return bingo; } public static void main(String args[]) { try { ServerSocket serversct = new ServerSocket(1000); int counter = 0; System.out.println("Server Started ...."); while (counter <= 2) { counter++; Socket serverClient = serversct.accept(); //server accept the client connection request System.out.println(" >> " + "Client No:" + counter + " started!"); DataInputStream inStream = new DataInputStream(serverClient.getInputStream()); DataOutputStream outStream = new DataOutputStream(serverClient.getOutputStream()); //bingo=Server.bingoCard(); ObjectOutputStream os = new ObjectOutputStream(serverClient.getOutputStream()); ServerClientThread sct = new ServerClientThread(serverClient, counter, inStream, outStream, os, new Server().bingoCard()); //send the request to a separate thread ServerClientThread.sockets.add(sct); if (counter == 1) { ServerClientThread.chance.add(1); } else { ServerClientThread.chance.add(0); } } ServerClientThread.distribute(); //ServerClientThread.sockets.get(1).start(); ServerClientThread.transferring(); } catch (Exception e) { e.printStackTrace(); } } } class ServerClientThread extends Thread { Socket serverClient; int clientNo; DataInputStream inStream; DataOutputStream outStream; ObjectOutputStream oos; static ArrayList<ServerClientThread> sockets = new ArrayList<>(); static ArrayList<Integer> chance = new ArrayList<>(); static ArrayList<ObjectOutputStream> oosal = new ArrayList<>(); static ArrayList<DataInputStream> datainputal = new ArrayList<>(); static ArrayList<DataOutputStream> dataoutputal = new ArrayList<>(); static int received; int[][] card = new int[5][5]; int[][] bingo = new int[5][5]; ServerClientThread(Socket inSocket, int counter, DataInputStream dis, DataOutputStream dos, ObjectOutputStream oos, int abc[][]) {//,int abc[][]) { this.serverClient = inSocket; this.clientNo = counter; this.oos = oos; oosal.add(oos); this.inStream = dis; this.outStream = dos; ServerClientThread.datainputal.add(dis); ServerClientThread.dataoutputal.add(dos); this.bingo = abc; } //i will use this run method later for checking winner of bingo card @Override public void run() { try { System.out.println("thread is running"); } catch (Exception ex) { System.out.println(ex); } finally { System.out.println("Client :" + clientNo + " exit!! "); } } public static void distribute() throws Exception { System.out.println("distributing"); for (int i = 0; i <= ServerClientThread.sockets.size() - 1; i++) { oosal.get(i).writeObject(ServerClientThread.sockets.get(i).bingo); System.out.println("i is +" + i); } } public static synchronized void transferring() throws Exception { while (true) { int chance = 1; int received = 10000; for (int i = 0; i <= ServerClientThread.datainputal.size() - 1; i++) { ServerClientThread.dataoutputal.get(i).writeInt(chance); ServerClientThread.dataoutputal.get(i).flush(); for (int l = 0; l <= ServerClientThread.chance.size() - 1; l++) { if (ServerClientThread.chance.get(l) == 1) { received = ServerClientThread.datainputal.get(i).readInt(); } if (l == i + 1) { ServerClientThread.chance.set(l, 1); } else if (i == ServerClientThread.chance.size() - 1) { ServerClientThread.chance.set(l, 0); ServerClientThread.chance.set(0, 1); } else { ServerClientThread.chance.set(l, 0); } } for (int n = 0; n< ServerClientThread.datainputal.size(); n++) { for (int j = 0; j< ServerClientThread.datainputal.size(); j++) if(ServerClientThread.chance.get(n)==1 && ServerClientThread.datainputal.get(j).available()>0) { received=ServerClientThread.datainputal.get(j).read(); }} System.out.println("this is received" + received); chance = 0; for (int j = 0; j <= ServerClientThread.dataoutputal.size() - 1; j++) { ServerClientThread.dataoutputal.get(j).writeInt(chance); ServerClientThread.dataoutputal.get(j).writeInt(received); } chance = 1; for (int k = 0; k <= ServerClientThread.chance.size() - 1; k++) { System.out.println("here is given chance" + ServerClientThread.chance.get(k)); } } } } } } ``` **Client.java** ``` import java.io.*; import java.net.*; import java.util.Scanner; class Client { static String completed[] = new String[5]; static int tosend; static int received1; public static void main(String args[]) throws Exception { try { // Scanner scn = new Scanner(System.in); // getting localhost ip InetAddress ip = InetAddress.getByName("localhost"); int flag = 1; // establish the connection with server port 9999 Socket s = new Socket(ip, 1000); DataInputStream discl = new DataInputStream(s.getInputStream()); DataOutputStream doscl = new DataOutputStream(s.getOutputStream()); ObjectInputStream is = new ObjectInputStream(s.getInputStream()); int[][] array = (int[][]) is.readObject(); //create array to make title. String title[] = {"B", "I", "N", "G", "O"}; for (int i = 0; i < title.length; i++) { System.out.print(title[i] + "\t"); } System.out.println(); for (int row = 0; row < array.length; row++) { for (int col = 0; col < array[row].length; col++) { System.out.print(array[row][col] + "\t"); } System.out.println(); } while (true) { int i = discl.readInt(); if (i == 1 ) { System.out.println("inside i==1"); System.out.println("in if condition 1"); System.out.println("opening scanner"); tosend = new Scanner(System.in).nextInt(); doscl.writeInt(tosend); } else if (i == 0) { //sendComplete(); System.out.println("closing scanner"); System.out.println("inside i==2"); //completed = Bingo; System.out.println("in if condition 0"); received1 = discl.readInt(); System.out.println(received1); } } } catch (IOException | ClassNotFoundException e) { } } }
karma2447
Ну, ваш код чрезвычайно сложен для понимания, добавьте также комментарии, пожалуйста, разбейте его и укажите место, где находится проблема.
nitinjain9619
ОКК я сделаю изменения
Richard MacCutchan
Вам просто нужна таблица или список, чтобы вместить всех клиентов. Каждая запись клиента должна содержать информацию о том, разрешено ли ему вводить номер или нет. Затем, когда приходит каждое сообщение, вам просто нужно проверить запись в таблице клиента.
nitinjain9619
ОКК, я пытаюсь сделать то, что ты сказал... Спасибо за твой комментарий