猜数字游戏

游戏的规则如下:

当客户端第一次连接到服务器端时,服务器端生产一个【0,50】之间的随机数字,然后客户端输入数字来猜该数字,每次客户端输入数字以后,发送给服务器端,服务器端判断该客户端发送的数字和随机数字的关系,并反馈比较结果,客户端总共有5次猜的机会,猜中时提示猜中,当输入”quit”时结束程序。
为了实现这个游戏,我写了三个类,客户端,服务器端以及一个实现多客户端的线程类。

该程序是以前学习 Java 网络编程时所写(写于2013年5月),还有很多地方有待完善,可以参考牛人的文章

客户端类

  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.io.InputStreamReader;
  5. import java.io.OutputStream;
  6. import java.net.Socket;
  7. public class TCPGameClient
  8. {
  9. static BufferedReader br = null;
  10. static Socket socket = null;
  11. static InputStream is = null;
  12. static OutputStream os = null;
  13. final static String HOST = "localhost";
  14. final static int PORT = 10008;
  15. public final static String EQUALS = "E" ;
  16. public final static String GREATER = "G";
  17. public final static String LESSER = "L";
  18. public final static String NEXT = "NEXT";
  19. public static void main(String[] args) throws Exception
  20. {
  21. //初始化socket,输入输出流
  22. init();
  23. System.out.println("The Game Begain!");
  24. byte[] bufResult = new byte[10];
  25. while(true)
  26. {
  27. //获取server产生的随机数
  28. String strDate = new String(receive());
  29. System.out.println("Please enter your guess:(If you want to end,input quit)");
  30. //从控制板获取输入字符
  31. String str = br.readLine();
  32. if(isQuit(str))
  33. {
  34. System.out.println("Bye!");
  35. break;
  36. }
  37. //client端控制猜谜次数
  38. int count = 5;
  39. while(count > 0)
  40. {
  41. //向 server端发送client 猜的数字
  42. send(str.getBytes());
  43. //接收来自server的对比后的反馈
  44. bufResult = receive();
  45. String result = new String(bufResult);
  46. if(EQUALS.equalsIgnoreCase(result))
  47. {
  48. System.out.println("Congratulations! You are rgiht.");
  49. send(NEXT.getBytes());
  50. break;
  51. } else if(GREATER.equalsIgnoreCase(result))
  52. {
  53. count --;
  54. System.out.println("Greater!");
  55. System.out.println("You have " + count + " chances left.");
  56. } else if(LESSER.equalsIgnoreCase(result))
  57. {
  58. count --;
  59. System.out.println("Lesser!");
  60. System.out.println("You have " + count + " chances left.");
  61. } else{;}
  62. //猜谜次数未到?继续
  63. if(count > 0)
  64. {
  65. System.out.println("Please enter your guess:");
  66. str = br.readLine();
  67. }
  68. //猜谜次数已到,还没猜出?打印谜底,同时告诉server开始下一轮猜谜游戏
  69. if(count == 0)
  70. {
  71. System.out.println("The right answer is: " + strDate);
  72. send(NEXT.getBytes());
  73. }
  74. }
  75. }
  76. close();
  77. }
  78. private static void init() throws IOException
  79. {
  80. br = new BufferedReader(new InputStreamReader(System.in));
  81. socket = new Socket(HOST, PORT);
  82. is = socket.getInputStream();
  83. os = socket.getOutputStream();
  84. }
  85. private static byte[] receive() throws IOException
  86. {
  87. byte[] buf = new byte[10];
  88. int len = is.read(buf);
  89. byte[] receiveData = new byte[len];
  90. System.arraycopy(buf, 0, receiveData, 0, len);
  91. return receiveData;
  92. }
  93. private static void send(byte[] b) throws IOException
  94. {
  95. os.write(b);
  96. }
  97. private static boolean isQuit(String str)
  98. {
  99. boolean flag = false;
  100. if(null == str)
  101. flag = false;
  102. else
  103. {
  104. if("quit".equalsIgnoreCase(str))
  105. {
  106. flag = true;
  107. }
  108. else
  109. {
  110. flag = false;
  111. }
  112. }
  113. return flag;
  114. }
  115. private static void close() throws Exception
  116. {
  117. socket.close();
  118. is.close();
  119. os.close();
  120. }
  121. }

服务器类

  1. import java.io.IOException;
  2. import java.net.ServerSocket;
  3. import java.net.Socket;
  4. public class TCPGameServer
  5. {
  6. static ServerSocket serverSocket = null;
  7. final static int PORT = 10008;
  8. public static void main(String[] args) throws IOException
  9. {
  10. try
  11. {
  12. //初始化ServerSocke,开始监听
  13. serverSocket = new ServerSocket(PORT);
  14. System.out.println("The Server started.");
  15. while(true)
  16. {
  17. Socket socket = serverSocket.accept();
  18. new TCPGameThread(socket).start();
  19. }
  20. }
  21. catch (Exception e)
  22. {
  23. e.printStackTrace();
  24. }
  25. serverSocket.close();
  26. }
  27. }

线程类

  1. import java.io.IOException;
  2. import java.io.InputStream;
  3. import java.io.OutputStream;
  4. import java.net.Socket;
  5. import java.util.Random;
  6. public class TCPGameThread extends Thread
  7. {
  8. Socket socket = null;
  9. InputStream is = null;
  10. OutputStream os = null;
  11. public final static String EQUALS = "E" ;
  12. public final static String GREATER = "G";
  13. public final static String LESSER = "L";
  14. public final static String NEXT = "NEXT";
  15. public TCPGameThread(Socket socket) throws IOException
  16. {
  17. this.socket = socket;
  18. is = this.socket.getInputStream();
  19. os = this.socket.getOutputStream();
  20. }
  21. @Override
  22. public void run()
  23. {
  24. try
  25. {
  26. while(true)
  27. {
  28. //产生一个在[0,50]之间的随机数
  29. int randomData = -1;
  30. randomData = createRandom(0, 50);
  31. String str = String.valueOf(randomData);
  32. System.out.println("random data: " + randomData);
  33. try
  34. {
  35. //将该随机数发送给client端
  36. send(str.getBytes());
  37. }catch(Exception e){
  38. break;
  39. }
  40. while(true)
  41. {
  42. try
  43. {
  44. //接收来自client端的猜数
  45. byte[] b = receive();
  46. String strReceive = new String(b, 0, b.length);
  47. System.out.println("strReceive: " + strReceive);
  48. if(isNext(strReceive))break;
  49. //比较谜底和猜数之间的关系并反馈比较结果
  50. String checkResult = checkClientData(randomData, strReceive);
  51. send(checkResult.getBytes());
  52. }
  53. catch (IOException e)
  54. {
  55. break;
  56. }
  57. }
  58. }
  59. }
  60. catch (Exception e)
  61. {
  62. try
  63. {
  64. close();
  65. }
  66. catch (Exception e1)
  67. {
  68. // TODO Auto-generated catch block
  69. e1.printStackTrace();
  70. }
  71. }
  72. }
  73. private byte[] receive() throws IOException
  74. {
  75. byte[] buf = new byte[10];
  76. int len = is.read(buf);
  77. byte[] receiveData = new byte[len];
  78. System.arraycopy(buf, 0, receiveData, 0, len);
  79. return receiveData;
  80. }
  81. private void send(byte[] b) throws IOException
  82. {
  83. os.write(b);
  84. }
  85. private int createRandom(int start, int end)
  86. {
  87. Random r = new Random();
  88. return r.nextInt(end - start + 1) + start;
  89. }
  90. private String checkClientData(int randomData, String data)
  91. {
  92. String checkResult = null;
  93. int buf = Integer.parseInt(data);
  94. if(buf == randomData)
  95. {checkResult = EQUALS;}
  96. else if(buf > randomData)
  97. {checkResult = GREATER;}
  98. else if(buf < randomData)
  99. {checkResult = LESSER;}
  100. else
  101. {;}
  102. return checkResult ;
  103. }
  104. private void close() throws Exception
  105. {
  106. socket.close();
  107. is.close();
  108. os.close();
  109. }
  110. private static boolean isNext(String str)
  111. {
  112. boolean flag = false;
  113. if(null == str)
  114. flag = false;
  115. else
  116. {
  117. if(NEXT.equalsIgnoreCase(str))
  118. {
  119. flag = true;
  120. }
  121. else
  122. {
  123. flag = false;
  124. }
  125. }
  126. return flag;
  127. }
  128. }

Java network programming-guessing game的更多相关文章

  1. Andrew's Blog / 《Network Programming with Go》学习笔记

    第一章: Architecture(体系结构) Protocol Layers(协议层) ISO OSI Protocol 每层的功能: 网络层提供交换及路由技术 传输层提供了终端系统之间的数据透明传 ...

  2. 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 ...

  3. python network programming tutorial

    关于网络编程以及socket 等一些概念和函数介绍就不再重复了,这里示例性用python 编写客户端和服务器端. 一.最简单的客户端流程: 1. Create a socket 2. Connect ...

  4. Fast portable non-blocking network programming with Libevent

    Fast portable non-blocking network programming with Libevent Fast portable non-blocking network prog ...

  5. Neural Network Programming - Deep Learning with PyTorch with deeplizard.

    PyTorch Prerequisites - Syllabus for Neural Network Programming Series PyTorch先决条件 - 神经网络编程系列教学大纲 每个 ...

  6. Python socket – network programming tutorial

    原文:https://www.binarytides.com/python-socket-programming-tutorial/ --------------------------------- ...

  7. [C1W2] Neural Networks and Deep Learning - Basics of Neural Network programming

    第二周:神经网络的编程基础(Basics of Neural Network programming) 二分类(Binary Classification) 这周我们将学习神经网络的基础知识,其中需要 ...

  8. 吴恩达《深度学习》-第一门课 (Neural Networks and Deep Learning)-第二周:(Basics of Neural Network programming)-课程笔记

    第二周:神经网络的编程基础 (Basics of Neural Network programming) 2.1.二分类(Binary Classification) 二分类问题的目标就是习得一个分类 ...

  9. 课程一(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 ...

  10. Java 8 实战 P3 Effective Java 8 programming

    目录 Chapter 8. Refactoring, testing, and debugging Chapter 9. Default methods Chapter 10. Using Optio ...

随机推荐

  1. SWERC2015-I Text Processor

    题意 给一个长度为\(n\)的字符串\(s\),再给定一个\(w\),问对于所有的\(i\in [1,n-w+1]\),\(s[i..i+w-1]\)有多少个不同字串.\(n,w\le 10^5\). ...

  2. 【刷题】BZOJ 3926 [Zjoi2015]诸神眷顾的幻想乡

    Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看. ...

  3. Dll劫持漏洞详解

      一.dll的定义 DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型.在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分 ...

  4. Sqoop数据迁移工具

    一.概述 sqoop 是 apache 旗下一款“ Hadoop 和关系数据库服务器之间传送数据”的工具. 导入数据: MySQL, Oracle 导入数据到 Hadoop 的 HDFS. HIVE. ...

  5. bzoj4873 [Shoi2017]寿司餐厅

    Input 第一行包含两个正整数n,m,分别表示这家餐厅提供的寿司总数和计算寿司价格中使用的常数. 第二行包含n个正整数,其中第k个数ak表示第k份寿司的代号. 接下来n行,第i行包含n-i+1个整数 ...

  6. BNU-2017.7.3排位赛1总结

    比赛链接:https://www.bnuoj.com/v3/contest_show.php?cid=9146#info A题 国际象棋棋盘,黑白相间染色. B题 最大值只取决于每个连通块的大小,一个 ...

  7. 防止xss攻击的核心代码

    public class XssFilter implements Filter { @Override public void destroy() { } /** * 过滤器用来过滤的方法 */ @ ...

  8. 我是大SB

    哈哈哈 我就是个大SB!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

  9. C++ ------ 互斥锁、原子操作的性能测试

    atomic原子操作:是在新标准C++11,引入了原子操作的概念,并通过这个新的头文件提供了多种原子操作数据类型,例如,atomic_bool,atomic_int等等 测试程序 #include & ...

  10. Linux iptables:规则原理和基础

    什么是iptables? iptables是Linux下功能强大的应用层防火墙工具,但了解其规则原理和基础后,配置起来也非常简单. 什么是Netfilter? 说到iptables必然提到Netfil ...