服务器模拟三个人猜数字的小游戏 利用线程池

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();
		}
	}

}

  

转载于:https://www.cnblogs.com/niuxiao12---/p/7285410.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值