Chinaunix首页 | 论坛 | 博客
  • 博客访问: 35031
  • 博文数量: 59
  • 博客积分: 2510
  • 博客等级: 少校
  • 技术积分: 680
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-15 09:36
文章分类
文章存档

2011年(5)

2010年(43)

2009年(11)

我的朋友
最近访客

分类: Java

2011-03-15 17:51:23

  下面这个示例是一个猜数字的控制台小游戏。该游戏的规则是:当客户端第一次连接到服务器端时,服务器端生产一个【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();
    }
    }
    }
    }
 

本文转自 ☆★ 包罗万象网 ★☆ - 转载请注明出处,侵权必究!
原文链接:
阅读(245) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~