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 ...
随机推荐
- SWERC2015-I Text Processor
题意 给一个长度为\(n\)的字符串\(s\),再给定一个\(w\),问对于所有的\(i\in [1,n-w+1]\),\(s[i..i+w-1]\)有多少个不同字串.\(n,w\le 10^5\). ...
- 【刷题】BZOJ 3926 [Zjoi2015]诸神眷顾的幻想乡
Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看. ...
- Dll劫持漏洞详解
一.dll的定义 DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型.在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分 ...
- Sqoop数据迁移工具
一.概述 sqoop 是 apache 旗下一款“ Hadoop 和关系数据库服务器之间传送数据”的工具. 导入数据: MySQL, Oracle 导入数据到 Hadoop 的 HDFS. HIVE. ...
- bzoj4873 [Shoi2017]寿司餐厅
Input 第一行包含两个正整数n,m,分别表示这家餐厅提供的寿司总数和计算寿司价格中使用的常数. 第二行包含n个正整数,其中第k个数ak表示第k份寿司的代号. 接下来n行,第i行包含n-i+1个整数 ...
- BNU-2017.7.3排位赛1总结
比赛链接:https://www.bnuoj.com/v3/contest_show.php?cid=9146#info A题 国际象棋棋盘,黑白相间染色. B题 最大值只取决于每个连通块的大小,一个 ...
- 防止xss攻击的核心代码
public class XssFilter implements Filter { @Override public void destroy() { } /** * 过滤器用来过滤的方法 */ @ ...
- 我是大SB
哈哈哈 我就是个大SB!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- C++ ------ 互斥锁、原子操作的性能测试
atomic原子操作:是在新标准C++11,引入了原子操作的概念,并通过这个新的头文件提供了多种原子操作数据类型,例如,atomic_bool,atomic_int等等 测试程序 #include & ...
- Linux iptables:规则原理和基础
什么是iptables? iptables是Linux下功能强大的应用层防火墙工具,但了解其规则原理和基础后,配置起来也非常简单. 什么是Netfilter? 说到iptables必然提到Netfil ...