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 ...
随机推荐
- 转---Android Audio System 之一:AudioTrack如何与AudioFlinger交换音频数据
引子 Android Framework的音频子系统中,每一个音频流对应着一个AudioTrack类的一个实例,每个AudioTrack会在创建时注册到 AudioFlinger中,由AudioFli ...
- Linux环境安装.NET运行环境
Linux环境安装.NET运行环境 Linux环境安装.NET运行环境 1. 构建编译环境: (1) sudo apt-get install build-essential (2) sudo apt ...
- Alpha 冲刺 —— 十分之二
队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 协助前端界面的开发 搭建测试用服务器的环境 完成 ...
- 洛谷P4559 [JSOI2018]列队 【70分二分 + 主席树】
题目链接 洛谷P4559 题解 只会做\(70\)分的\(O(nlog^2n)\) 如果本来就在区间内的人是不用动的,区间右边的人往区间最右的那些空位跑,区间左边的人往区间最左的那些空位跑 找到这些空 ...
- 洛谷 [POI2007]BIU-Offices 解题报告
[POI2007]BIU-Offices 题意 给定\(n(\le 100000)\)个点\(m(\le 2000000)\)条边的无向图\(G\),求这个图\(G\)补图的连通块个数. 一开始想了半 ...
- jQuery时间轴
常见的时间轴导航 横向时间轴
- 图像PNG格式介绍
1 图像png格式简介 PNG是20世纪90年代中期开始开发的图像文件存储格式,其目的是企图替代GIF和TIFF文件格式,同时增加一些GIF文件格式所不具备的特性.流式网络图形格式(PortableN ...
- 利用Zynq Soc创建一个嵌入式工程
英文题目:Using the Zynq SoC Processing System,参考自ADI的ug1165文档. 利用Zynq Soc创建一个嵌入式工程,该工程总体上包括五个步骤: 步骤一.新建空 ...
- github访问很慢的问题
公司一直用着svn, 之前也的确用过github的版本管理,但是一直都是可视化的操作 这几天面试了几名前端,问了一下发现他们在之前的公司里都是用git的, 于是今天好好温故了一下怎么用命令行进行一下g ...
- MappedByteBuffer以及ByteBufer的底层原理
最近在用java中的ByteBuffer,一直不明所以,尤其是对MappedByteBuffer使用的内存映射这个概念云里雾里. 于是首先补了物理内存.虚拟内存.页面文件.交换区的只是:小科普——物理 ...