当前位置导航:炫浪网>>网络学院>>编程开发>>JAVA教程>>Java入门

Java编程那些事儿109——网络编程示例2

    Java编程那些事儿系列文章(全集目录)

    13.3.2 猜数字小游戏

    下面这个示例是一个猜数字的控制台小游戏。该游戏的规则是:当客户端第一次连接到服务器端时,服务器端生产一个「0,50」之间的随机数字,然后客户端输入数字来猜该数字,每次客户端输入数字以后,发送给服务器端,服务器端判断该客户端发送的数字和随机数字的关系,并反馈比较结果,客户端总共有5次猜的机会,猜中时提示猜中,当输入“quit”时结束程序。

    和前面的示例类似,在进行网络程序开发时,首先需要分解一下功能的实现,觉得功能是在客户端程序中实现还是在服务器端程序中实现。区分的规则一般是:客户端程序实现接收用户输入等界面功能,并实现一些基础的校验降低服务器端的压力,而将程序核心的逻辑以及数据存储等功能放在服务器端进行实现。遵循该原则划分的客户端和服务器端功能如下所示。

    客户端程序功能列表:

    1、  接收用户控制台输入

    2、  判断输入内容是否合法

    3、  按照协议格式发送数据

    4、  根据服务器端的反馈给出相应提示

    服务器端程序功能列表:

    1、  接收客户端发送数据

    2、  按照协议格式解析数据

    3、  判断发送过来的数字和随机数字的关系

    4、  根据判断结果生产协议数据

    5、  将生产的数据反馈给客户端

    在该示例中,实际使用的网络命令也只有两条,所以显得协议的格式比较简单。

    其中客户端程序协议格式如下:

    1、  将用户输入的数字转换为字符串,然后转换为byte数组

    2、  发送“quit”字符串代表退出

    其中服务器端程序协议格式如下:

    1、  反馈长度为1个字节,数字0代表相等(猜中),1代表大了,2代表小了,其它数字代表错误。

    实现该程序的代码比较多,下面分为客户端程序实现和服务器端程序实现分别进行列举。

    客户端程序实现代码如下:

package guess;

import java.net.*;

import java.io.*;

/**

 * 猜数字客户端

 */

public class TCPClient {

  public static void main(String[] args) {

         Socket socket = null;

         OutputStream os = null;

         InputStream is = null;

         BufferedReader br = null;

         byte[] data = new byte[2];

         try{

                   //建立连接

                   socket = new Socket(

                                     "127.0.0.1",10001);

                  

                   //发送数据

                   os= socket.getOutputStream();

                  

                   //读取反馈数据

                   is = socket.getInputStream();

                  

                   //键盘输入流

                   br = new BufferedReader(

                                     new InputStreamReader(System.in));

                  

                   //多次输入

                   while(true){

                            System.out.println("请输入数字:");

                            //接收输入

                            String s = br.readLine();

                            //结束条件

                            if(s.equals("quit")){

                                     os.write("quit".getBytes());

                                     break;

                            }

                            //校验输入是否合法

                            boolean b = true;

                            try{

                                     Integer.parseInt(s);

                            }catch(Exception e){

                                     b = false;

                            }

                            if(b){ //输入合法

                                     //发送数据

                                     os.write(s.getBytes());

                                     //接收反馈

                                     is.read(data);

                                     //判断

                                     switch(data[0]){

                                     case 0:

                                               System.out.println("相等!祝贺你!");

                                               break;

                                     case 1:

                                               System.out.println("大了!");

                                               break;

                                     case 2:

                                               System.out.println("小了!");

                                               break;

                                     default:

                                               System.out.println("其它错误!");

                                     }

                                     //提示猜的次数

                                     System.out.println("你已经猜了" + data[1] + "次!");

                                     //判断次数是否达到5次

                                     if(data[1] >= 5){

                                               System.out.println("你挂了!");

                                               //给服务器端线程关闭的机会

                                               os.write("quit".getBytes());

                                               //结束客户端程序

                                               break;

                                     }

                            }else{  //输入错误

                                     System.out.println("输入错误!");

                            }

                   }

         }catch(Exception e){

                   e.printStackTrace();

         }finally{

                   try{

                            //关闭连接

                            br.close();

                            is.close();

                            os.close();

                            socket.close();

                   }catch(Exception e){

                            e.printStackTrace();

                   }

         }

  }

      }

共2页 首页 上一页 1 2 下一页 尾页 跳转到
相关内容
赞助商链接