Java network programming-guessing game
猜数字游戏
游戏的规则如下:
当客户端第一次连接到服务器端时,服务器端生产一个【0,50】之间的随机数字,然后客户端输入数字来猜该数字,每次客户端输入数字以后,发送给服务器端,服务器端判断该客户端发送的数字和随机数字的关系,并反馈比较结果,客户端总共有5次猜的机会,猜中时提示猜中,当输入”quit”时结束程序。
为了实现这个游戏,我写了三个类,客户端,服务器端以及一个实现多客户端的线程类。
该程序是以前学习 Java 网络编程时所写(写于2013年5月),还有很多地方有待完善,可以参考牛人的文章。
客户端类
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.net.Socket;public class TCPGameClient{static BufferedReader br = null;static Socket socket = null;static InputStream is = null;static OutputStream os = null;final static String HOST = "localhost";final static int PORT = 10008;public final static String EQUALS = "E" ;public final static String GREATER = "G";public final static String LESSER = "L";public final static String NEXT = "NEXT";public static void main(String[] args) throws Exception{//初始化socket,输入输出流init();System.out.println("The Game Begain!");byte[] bufResult = new byte[10];while(true){//获取server产生的随机数String strDate = new String(receive());System.out.println("Please enter your guess:(If you want to end,input quit)");//从控制板获取输入字符String str = br.readLine();if(isQuit(str)){System.out.println("Bye!");break;}//client端控制猜谜次数int count = 5;while(count > 0){//向 server端发送client 猜的数字send(str.getBytes());//接收来自server的对比后的反馈bufResult = receive();String result = new String(bufResult);if(EQUALS.equalsIgnoreCase(result)){System.out.println("Congratulations! You are rgiht.");send(NEXT.getBytes());break;} else if(GREATER.equalsIgnoreCase(result)){count --;System.out.println("Greater!");System.out.println("You have " + count + " chances left.");} else if(LESSER.equalsIgnoreCase(result)){count --;System.out.println("Lesser!");System.out.println("You have " + count + " chances left.");} else{;}//猜谜次数未到?继续if(count > 0){System.out.println("Please enter your guess:");str = br.readLine();}//猜谜次数已到,还没猜出?打印谜底,同时告诉server开始下一轮猜谜游戏if(count == 0){System.out.println("The right answer is: " + strDate);send(NEXT.getBytes());}}}close();}private static void init() throws IOException{br = new BufferedReader(new InputStreamReader(System.in));socket = new Socket(HOST, PORT);is = socket.getInputStream();os = socket.getOutputStream();}private static byte[] receive() throws IOException{byte[] buf = new byte[10];int len = is.read(buf);byte[] receiveData = new byte[len];System.arraycopy(buf, 0, receiveData, 0, len);return receiveData;}private static void send(byte[] b) throws IOException{os.write(b);}private static boolean isQuit(String str){boolean flag = false;if(null == str)flag = false;else{if("quit".equalsIgnoreCase(str)){flag = true;}else{flag = false;}}return flag;}private static void close() throws Exception{socket.close();is.close();os.close();}}
服务器类
import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;public class TCPGameServer{static ServerSocket serverSocket = null;final static int PORT = 10008;public static void main(String[] args) throws IOException{try{//初始化ServerSocke,开始监听serverSocket = new ServerSocket(PORT);System.out.println("The Server started.");while(true){Socket socket = serverSocket.accept();new TCPGameThread(socket).start();}}catch (Exception e){e.printStackTrace();}serverSocket.close();}}
线程类
import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;import java.util.Random;public class TCPGameThread extends Thread{Socket socket = null;InputStream is = null;OutputStream os = null;public final static String EQUALS = "E" ;public final static String GREATER = "G";public final static String LESSER = "L";public final static String NEXT = "NEXT";public TCPGameThread(Socket socket) throws IOException{this.socket = socket;is = this.socket.getInputStream();os = this.socket.getOutputStream();}@Overridepublic void run(){try{while(true){//产生一个在[0,50]之间的随机数int randomData = -1;randomData = createRandom(0, 50);String str = String.valueOf(randomData);System.out.println("random data: " + randomData);try{//将该随机数发送给client端send(str.getBytes());}catch(Exception e){break;}while(true){try{//接收来自client端的猜数byte[] b = receive();String strReceive = new String(b, 0, b.length);System.out.println("strReceive: " + strReceive);if(isNext(strReceive))break;//比较谜底和猜数之间的关系并反馈比较结果String checkResult = checkClientData(randomData, strReceive);send(checkResult.getBytes());}catch (IOException e){break;}}}}catch (Exception e){try{close();}catch (Exception e1){// TODO Auto-generated catch blocke1.printStackTrace();}}}private byte[] receive() throws IOException{byte[] buf = new byte[10];int len = is.read(buf);byte[] receiveData = new byte[len];System.arraycopy(buf, 0, receiveData, 0, len);return receiveData;}private void send(byte[] b) throws IOException{os.write(b);}private int createRandom(int start, int end){Random r = new Random();return r.nextInt(end - start + 1) + start;}private String checkClientData(int randomData, String data){String checkResult = null;int buf = Integer.parseInt(data);if(buf == randomData){checkResult = EQUALS;}else if(buf > randomData){checkResult = GREATER;}else if(buf < randomData){checkResult = LESSER;}else{;}return checkResult ;}private void close() throws Exception{socket.close();is.close();os.close();}private static boolean isNext(String str){boolean flag = false;if(null == str)flag = false;else{if(NEXT.equalsIgnoreCase(str)){flag = true;}else{flag = false;}}return flag;}}
Java network programming-guessing game的更多相关文章
- Andrew's Blog / 《Network Programming with Go》学习笔记
第一章: Architecture(体系结构) Protocol Layers(协议层) ISO OSI Protocol 每层的功能: 网络层提供交换及路由技术 传输层提供了终端系统之间的数据透明传 ...
- Professional iOS Network Programming Connecting the Enterprise to the iPhone and iPad
Book Description Learn to develop iPhone and iPad applications for networked enterprise environments ...
- python network programming tutorial
关于网络编程以及socket 等一些概念和函数介绍就不再重复了,这里示例性用python 编写客户端和服务器端. 一.最简单的客户端流程: 1. Create a socket 2. Connect ...
- Fast portable non-blocking network programming with Libevent
Fast portable non-blocking network programming with Libevent Fast portable non-blocking network prog ...
- Neural Network Programming - Deep Learning with PyTorch with deeplizard.
PyTorch Prerequisites - Syllabus for Neural Network Programming Series PyTorch先决条件 - 神经网络编程系列教学大纲 每个 ...
- Python socket – network programming tutorial
原文:https://www.binarytides.com/python-socket-programming-tutorial/ --------------------------------- ...
- [C1W2] Neural Networks and Deep Learning - Basics of Neural Network programming
第二周:神经网络的编程基础(Basics of Neural Network programming) 二分类(Binary Classification) 这周我们将学习神经网络的基础知识,其中需要 ...
- 吴恩达《深度学习》-第一门课 (Neural Networks and Deep Learning)-第二周:(Basics of Neural Network programming)-课程笔记
第二周:神经网络的编程基础 (Basics of Neural Network programming) 2.1.二分类(Binary Classification) 二分类问题的目标就是习得一个分类 ...
- 课程一(Neural Networks and Deep Learning),第二周(Basics of Neural Network programming)—— 4、Logistic Regression with a Neural Network mindset
Logistic Regression with a Neural Network mindset Welcome to the first (required) programming exerci ...
- Java 8 实战 P3 Effective Java 8 programming
目录 Chapter 8. Refactoring, testing, and debugging Chapter 9. Default methods Chapter 10. Using Optio ...
随机推荐
- Jstack、Jmap命令简单使用
TOMCAT_ID为tomcat的进程号. 1.使用jstack查看jvm堆栈信息. /bin/ TOMCAT_ID:无法输出到单独的文件中,只能在tomcat的启动文件中打印相关的堆栈信息. jst ...
- DAVY的神龙帕夫——读者的心灵故事|十二橄榄枝的传说
再次听Puff的时候我想起了Davy. 文理分班后我坐到了他后面.Davy天生一头黄毛,黑头发”not even one”.上课时他若不是肆无忌惮地舒开四肢呼呼大睡,便是如受惊一般伸长他的细脖子,直挺 ...
- 51nod 1526 分配笔名(字典树+贪心)
题意: 班里有n个同学.老师为他们选了n个笔名.现在要把这些笔名分配给每一个同学,每一个同学分配到一个笔名,每一个笔名必须分配给某个同学.现在定义笔名和真名之间的相关度是他们之间的最长公共前缀.设笔名 ...
- 【BZOJ2216】Lightning Conductor(动态规划)
[BZOJ2216]Lightning Conductor(动态规划) 题面 BZOJ,然而是权限题 洛谷 题解 \(\sqrt {|i-j|}\)似乎没什么意义,只需要从前往后做一次再从后往前做一次 ...
- NOIP模拟
1.要选一个{1,2,...n}的子集使得假如a和b在所选集合里且(a+b)/2∈{1,2,...n}那么(a+b)/2也在所选集合里 f[i]=2*f[i-1]-f[i-2]+g[i] g[n]:选 ...
- 洛谷P4609 [FJOI2016]建筑师 【第一类斯特林数】
题目链接 洛谷P4609 题解 感性理解一下: 一神带\(n\)坑 所以我们只需将除了\(n\)外的\(n - 1\)个元素分成\(A + B - 2\)个集合,每个集合选出最大的在一端,剩余进行排列 ...
- Hive(六)hive执行过程实例分析与hive优化策略
一.Hive 执行过程实例分析 1.join 对于 join 操作:SELECT pv.pageid, u.age FROM page_view pv JOIN user u ON (pv.useri ...
- mysql数据库----索引补充
1.索引 索引是表的目录,在查找内容之前可以先在目录中查找索引位置,以此快速定位查询数据.对于索引,会保存在额外的文件中. 2.索引种类 普通索引:仅加速查询 唯一索引:加速查询 + 列值唯一(可以有 ...
- Hdu1542 Atlantis
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- 2018-2019 ACM-ICPC 焦作赛区 部分题解
题目链接:https://codeforces.com/gym/102028 B. Ultraman vs. Aodzilla and Bodzilla 题意: 两只怪兽,它们的生命和攻击分别为hpA ...