1 Server
public class Server { public static void main(String[] args) { ArrayList<ServerThread> sockets = new ArrayList<ServerThread>(); ExecutorService es = Executors.newFixedThreadPool(60); try (ServerSocket serverSocket = new ServerSocket(8878);){ while (true) { Socket socket = serverSocket.accept(); ServerThread serverThread = new ServerThread(socket, sockets); sockets.add(serverThread); es.execute(serverThread); } } catch (IOException e) { e.printStackTrace(); } es.shutdown(); } }
2 ServerThread
public class ServerThread implements Runnable { public static int randomNumber; public static int left; public static int right; private Socket socket; private ArrayList<ServerThread> sockets; private String name; private PrintWriter printWriter; public ServerThread(Socket socket, ArrayList<ServerThread> sockets) { super(); this.socket = socket; this.sockets = sockets; } @Override public void run() { try (InputStream inputStream = socket.getInputStream(); InputStreamReader inputStreamReader = new InputStreamReader(inputStream); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); OutputStream outputStream = socket.getOutputStream(); PrintWriter printWriter = new PrintWriter(outputStream, true);) { this.printWriter = printWriter; /* while (true) { String conten = bufferedReader.readLine(); // 要求客户端发消息的时候,也加入标识,说明发送的是名字还是数字 // 1. 客户端输入的是名字 --- // 2. 客户端输入的是数字 --- } */ // 1. 读客户端的名字 String clientName = bufferedReader.readLine(); this.name = clientName; // 2. 发欢迎语 String welcomMessage = "3#欢迎 " + clientName + " 加入游戏"; this.sendMessageToAll(welcomMessage); // 3. 判断是否够 3 个人 if (this.sockets.size() == 3) { // 生成随机数,设定左右边界 ServerThread.randomNumber = (int)(Math.random() * 13 + 1); ServerThread.left = 1; ServerThread.right = 13; ServerThread serverThread = this.sockets.get(0); // 1#人名#消息内容 String gameStartMessage = "1#" + serverThread.getName() + "#游戏开始了,由 " + serverThread.getName() + " 开始猜数字,范围是:" + ServerThread.left + " 到 " + ServerThread.right; this.sendMessageToAll(gameStartMessage); } while (true) { // 4. 接收 Client 发送过来的数字,一直等待 Client 发数字 String numberString = bufferedReader.readLine(); int number = Integer.parseInt(numberString); if (ServerThread.randomNumber == number) { // 猜中了 String endMessage = "2#" + this.name + " 猜中了,是:" + numberString; this.sendMessageToAll(endMessage); }else { // 没猜中,下一个人猜 // 获取结果和修改边界 String resultMessgate = ","; if (number > ServerThread.randomNumber) { resultMessgate += "猜大了"; ServerThread.right = number - 1; }else { resultMessgate += "猜小了"; ServerThread.left = number + 1; } // 下一个人的索引 = 当前人的索引 + 1 int index = this.sockets.indexOf(this) + 1; if (index == 3) { // 回到第一个人 index = 0; } ServerThread next = this.sockets.get(index); // 1#人名#消息内容 String nextMessage = "1#" + next.getName() + "#" + this.name + "猜的是:" + numberString + resultMessgate + "。轮到 " + next.getName() + " 来猜,范围是:" + ServerThread.left + " 到 " + ServerThread.right; this.sendMessageToAll(nextMessage); } } } catch (IOException e) { e.printStackTrace(); } } /** * 发消息给所有人 * @param message */ private void sendMessageToAll(String message) { for (ServerThread serverThread : sockets) { serverThread.getPrintWriter().println(message); } } public PrintWriter getPrintWriter() { return printWriter; } public String getName() { return name; } }
3 Client
public class Client { public static void main(String[] args) { try (Socket socket = new Socket("127.0.0.1", 8878); InputStream inputStream = socket.getInputStream(); InputStreamReader inputStreamReader = new InputStreamReader(inputStream); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); OutputStream outputStream = socket.getOutputStream(); PrintWriter printWriter = new PrintWriter(outputStream, true); Scanner scanner = new Scanner(System.in)) { // 1. 发送自己的名字 String clientName = scanner.next(); printWriter.println(clientName); while (true) { // 2. 接收游戏相关的消息 String gameMessage = bufferedReader.readLine(); // 拆分收到的信息 String[] strings = gameMessage.split("#"); // 1 猜数字 2 出结果 3 欢迎语 String flag = strings[0]; switch (flag) { case "1": { System.out.println(strings[2]); if (strings[1].equals(clientName)) { // 需要我们这个人猜数字 int number = scanner.nextInt(); printWriter.println(number); } } break; case "2": { System.out.println(strings[1]); // 进行游戏结束的处理 } break; case "3": { System.out.println(strings[1]); } default: break; } } } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }