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 ...
随机推荐
- 插件-3D轮播图
先上效果图 查看实例点击 这里 这个栗子中,可以选择展示 5 张 或者展示 3 张,即使是只有一个slide,也可以完成布局,正常轮播,麻麻再也不用怕只有4个slid而不能用这种轮播啦! 本栗实现原 ...
- C++解析(17):操作符重载
0.目录 1.操作符重载 2.完善的复数类 3.小结 1.操作符重载 下面的复数解决方案是否可行? 示例1--原有的解决方案: #include <stdio.h> class Compl ...
- 洛谷P1352 没有上司的舞会——树形DP
第一次自己写树形DP的题,发个博客纪念`- 题目来源:P1352 没有上司的舞会 题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结 ...
- linux 修改 elf 文件的dynamic linker 和 rpath
linux 修改 elf 文件的dynamic linker 和 rpath https://nixos.org/patchelf.html 下载地址 https://nixos.org/releas ...
- 【BZOJ1042】硬币购物(动态规划,容斥原理)
[BZOJ1042]硬币购物(动态规划,容斥原理) 题面 BZOJ Description 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬 ...
- 框架----Django框架知识点整理
一.cbv cbv(class-base-view) 基于类的视图 fbv(func-base-view) 基于函数的视图 a.基本演示 urlpatterns = [ url(r'^login.ht ...
- 《剑指offer》— JavaScript(3)从尾到头打印链表
从尾到头打印链表 题目描述 输入一个链表,从尾到头打印链表每个节点的值. 实现代码 /*function ListNode(x){ this.val = x; this.next = null; }* ...
- spring mybatis 多数据源配置
1.创建好数据库的配置文件 mysql.url=jdbc:mysql://***/***?useUnicode=true&characterEncoding=UTF-8 mysql.usern ...
- nginx 前后分离,地址重写,url匹配中遇到的问题
我遇到的问题: 前端用vue的路由做页面路由,后台用spring mvc做数据接口,但是遇到路由地址和接口地址无法区分的问题,导致nginx无法正确准发比如: 1)http://127.0.0.1/i ...
- PlantUML —— 应用于 Eclipse 的简单快速的 UML 编辑软件
PlantUML —— 应用于 Eclipse 的简单快速的 UML 编辑软件 简介: 在应用系统软件开发过程中,如果软件由很多对象组成,它的结构仅仅凭借分析很难理清,同时为了有利于软件的开发及重用, ...