逻辑很强的程序

Code:
  1. cx@suntektech.com   
  2. 13.3.1质数判别示例   
  3.   
  4.          该示例实现的功能是质数判断,程序实现的功能为客户端程序接收用户输入的数字,然后将用户输入的内容发送给服务器端,服务器端判断客户端发送的数字是否是质数,并将判断的结果反馈给客户端,客户端根据服务器端的反馈显示判断结果。   
  5.   
  6.          质数的规则是:最小的质数是2,只能被1和自身整除的自然数。当用户输入小于2的数字,以及输入的内容不是自然数时,都属于非法输入。   
  7.   
  8.          网络程序的功能都分为客户端程序和服务器端程序实现,下面先描述一下每个程序分别实现的功能:   
  9.   
  10. 1、  客户端程序功能:   
  11.   
  12. a)         接收用户控制台输入   
  13.   
  14. b)         判断输入内容是否合法   
  15.   
  16. c)         按照协议格式生成发送数据   
  17.   
  18. d)         发送数据   
  19.   
  20. e)         接收服务器端反馈   
  21.   
  22. f)          解析服务器端反馈信息,并输出   
  23.   
  24. 2、  服务器端程序功能:   
  25.   
  26. a)         接收客户端发送数据   
  27.   
  28. b)         按照协议格式解析数据   
  29.   
  30. c)         判断数字是否是质数   
  31.   
  32. d)         根据判断结果,生成协议数据   
  33.   
  34. e)         将数据反馈给客户端   
  35.   
  36. 分解好了网络程序的功能以后,就可以设计网络协议格式了,如果该程序的功能比较简单,所以设计出的协议格式也不复杂。   
  37.   
  38.          客户端发送协议格式:   
  39.   
  40.                    将用户输入的数字转换为字符串,再将字符串转换为byte数组即可。   
  41.   
  42.                    例如用户输入16,则转换为字符串“16”,使用getBytes转换为byte数组。   
  43.   
  44.                    客户端发送“quit”字符串代表结束连接   
  45.   
  46.          服务器端发送协议格式:   
  47.   
  48. 反馈数据长度为1个字节。数字0代表是质数,1代表不是质数,2代表协议格式错误。   
  49.   
  50. 例如客户端发送数字12,则反馈1,发送13则反馈0,发送0则反馈2。   
  51.   
  52.          功能设计完成以后,就可以分别进行客户端和服务器端程序的编写了,在编写完成以后联合起来进行调试即可。   
  53.   
  54.          下面分别以TCP方式和UDP方式实现该程序,注意其实现上的差异。不管使用哪种方式实现,客户端都可以多次输入数据进行判断。对于UDP方式来说,不需要向服务器端发送quit字符串。   
  55.   
  56.          以TCP方式实现的客户端程序代码如下:   
  57.   
  58.                    package example1;   
  59.   
  60. import java.io.*;   
  61.   
  62. import java.net.*;   
  63.   
  64. /**  
  65.  
  66.  * 以TCP方式实现的质数判断客户端程序  
  67.  
  68.  */  
  69.   
  70. public class TCPPrimeClient {   
  71.   
  72.          static BufferedReader br;   
  73.   
  74.          static Socket socket;   
  75.   
  76.          static InputStream is;   
  77.   
  78.          static OutputStream os;   
  79.   
  80.          /**服务器IP*/  
  81.   
  82.          final static String HOST = "127.0.0.1";   
  83.   
  84.          /**服务器端端口*/  
  85.   
  86.          final static int PORT = 10005;   
  87.   
  88.             
  89.   
  90.          public static void main(String[] args) {   
  91.   
  92.                    init(); //初始化   
  93.   
  94.                    while(true){   
  95.   
  96.                             System.out.println("请输入数字:");   
  97.   
  98.                             String input = readInput(); //读取输入   
  99.   
  100.                             if(isQuit(input)){ //判读是否结束   
  101.   
  102.                                      byte[] b = "quit".getBytes();   
  103.   
  104.                                      send(b);   
  105.   
  106.                                      break//结束程序   
  107.   
  108.                             }   
  109.   
  110.                             if(checkInput(input)){ //校验合法   
  111.   
  112.                                      //发送数据   
  113.   
  114.                                      send(input.getBytes());   
  115.   
  116.                                      //接收数据   
  117.   
  118.                                      byte[] data = receive();   
  119.   
  120.                                      //解析反馈数据   
  121.   
  122.                                      parse(data);   
  123.   
  124.                             }else{   
  125.   
  126.                                      System.out.println("输入不合法,请重新输入!");   
  127.   
  128.                             }   
  129.   
  130.                    }   
  131.   
  132.                    close();  //关闭流和连接   
  133.   
  134.          }   
  135.   
  136.             
  137.   
  138.          /**  
  139.  
  140.           * 初始化  
  141.  
  142.           */  
  143.   
  144.          private static void init(){   
  145.   
  146.                    try {   
  147.   
  148.                             br = new BufferedReader(   
  149.   
  150.                                                new InputStreamReader(System.in));   
  151.   
  152.                             socket = new Socket(HOST,PORT);   
  153.   
  154.                             is = socket.getInputStream();   
  155.   
  156.                             os = socket.getOutputStream();   
  157.   
  158.                    } catch (Exception e) {}   
  159.   
  160.          }   
  161.   
  162.             
  163.   
  164.          /**  
  165.  
  166.           * 读取客户端输入  
  167.  
  168.           */  
  169.   
  170.          private static String readInput(){   
  171.   
  172.                    try {   
  173.   
  174.                             return br.readLine();   
  175.   
  176.                    } catch (Exception e) {   
  177.   
  178.                             return null;   
  179.   
  180.                    }   
  181.   
  182.          }   
  183.   
  184.             
  185.   
  186.          /**  
  187.  
  188.           * 判断是否输入quit  
  189.  
  190.           * @param input 输入内容  
  191.  
  192.           * @return true代表结束,false代表不结束  
  193.  
  194.           */  
  195.   
  196.          private static boolean isQuit(String input){   
  197.   
  198.                    if(input == null){   
  199.   
  200.                             return false;   
  201.   
  202.                    }else{   
  203.   
  204.                             if("quit".equalsIgnoreCase(input)){   
  205.   
  206.                                      return true;   
  207.   
  208.                             }else{   
  209.   
  210.                                      return false;   
  211.   
  212.                             }   
  213.   
  214.                    }   
  215.   
  216.          }   
  217.   
  218.             
  219.   
  220.          /**  
  221.  
  222.           * 校验输入  
  223.  
  224.           * @param input 用户输入内容  
  225.  
  226.           * @return true代表输入符合要求,false代表不符合  
  227.  
  228.           */  
  229.   
  230.          private static boolean checkInput(String input){   
  231.   
  232.                    if(input == null){   
  233.   
  234.                             return false;   
  235.   
  236.                    }   
  237.   
  238.                    try{   
  239.   
  240.                             int n = Integer.parseInt(input);   
  241.   
  242.                             if(n >= 2){   
  243.   
  244.                                      return true;   
  245.   
  246.                             }else{   
  247.   
  248.                                      return false;   
  249.   
  250.                             }   
  251.   
  252.                    }catch(Exception e){   
  253.   
  254.                             return false;  //输入不是整数   
  255.   
  256.                    }   
  257.   
  258.          }   
  259.   
  260.             
  261.   
  262.          /**  
  263.  
  264.           * 向服务器端发送数据  
  265.  
  266.           * @param data 数据内容  
  267.  
  268.           */  
  269.   
  270.          private static void send(byte[] data){   
  271.   
  272.                    try{   
  273.   
  274.                             os.write(data);   
  275.   
  276.                    }catch(Exception e){}   
  277.   
  278.          }   
  279.   
  280.             
  281.   
  282.          /**  
  283.  
  284.           * 接收服务器端反馈  
  285.  
  286.           * @return 反馈数据  
  287.  
  288.           */  
  289.   
  290.          private static byte[] receive(){   
  291.   
  292.                    byte[] b = new byte[1024];   
  293.   
  294.                    try {   
  295.   
  296.                             int n = is.read(b);   
  297.   
  298.                             byte[] data = new byte[n];   
  299.   
  300.                             //复制有效数据   
  301.   
  302.                             System.arraycopy(b, 0, data, 0, n);   
  303.   
  304.                             return data;   
  305.   
  306.                    } catch (Exception e){}   
  307.   
  308.                    return null;   
  309.   
  310.          }   
  311.   
  312.             
  313.   
  314.          /**  
  315.  
  316.           * 解析协议数据  
  317.  
  318.           * @param data 协议数据  
  319.  
  320.           */  
  321.   
  322.          private static void parse(byte[] data){   
  323.   
  324.                    if(data == null){   
  325.   
  326.                             System.out.println("服务器端反馈数据不正确!");   
  327.   
  328.                             return;   
  329.   
  330.                    }   
  331.   
  332.                    byte value = data[0]; //取第一个byte   
  333.   
  334.                    //按照协议格式解析   
  335.   
  336.                    switch(value){   
  337.   
  338.                    case 0:   
  339.   
  340.                             System.out.println("质数");   
  341.   
  342.                             break;   
  343.   
  344.                    case 1:   
  345.   
  346.                             System.out.println("不是质数");   
  347.   
  348.                             break;   
  349.   
  350.                    case 2:   
  351.   
  352.                             System.out.println("协议格式错误");   
  353.   
  354.                             break;   
  355.   
  356.                    }   
  357.   
  358.          }   
  359.   
  360.             
  361.   
  362.          /**  
  363.  
  364.           * 关闭流和连接  
  365.  
  366.           */  
  367.   
  368.          private static void close(){   
  369.   
  370.                    try{   
  371.   
  372.                             br.close();   
  373.   
  374.                             is.close();   
  375.   
  376.                             os.close();   
  377.   
  378.                             socket.close();   
  379.   
  380.                    }catch(Exception e){   
  381.   
  382.                             e.printStackTrace();   
  383.   
  384.                    }   
  385.   
  386.          }   
  387.   
  388. }   
  389.   
  390.          在该代码中,将程序的功能使用方法进行组织,使得结构比较清晰,核心的逻辑流程在main方法中实现。   
  391.   
  392.          以TCP方式实现的服务器端的代码如下:   
  393.   
  394.                    package example1;   
  395.   
  396. import java.net.*;   
  397.   
  398. /**  
  399.  
  400.  * 以TCP方式实现的质数判别服务器端  
  401.  
  402.  */  
  403.   
  404. public class TCPPrimeServer {   
  405.   
  406.          public static void main(String[] args) {   
  407.   
  408.                    final int PORT = 10005;   
  409.   
  410.                    ServerSocket ss  = null;   
  411.   
  412.                    try {   
  413.   
  414.                             ss = new ServerSocket(PORT);   
  415.   
  416.                             System.out.println("服务器端已启动:");   
  417.   
  418.                             while(true){   
  419.   
  420.                                      Socket s = ss.accept();   
  421.   
  422.                                      new PrimeLogicThread(s);   
  423.   
  424.                             }   
  425.   
  426.                    } catch (Exception e) {}   
  427.   
  428.                    finally{   
  429.   
  430.                             try {   
  431.   
  432.                                      ss.close();   
  433.   
  434.                             } catch (Exception e2) {}   
  435.   
  436.                    }   
  437.   
  438.                       
  439.   
  440.          }   
  441.   
  442. }   
  443.   
  444. package example1;   
  445.   
  446. import java.io.*;   
  447.   
  448. import java.net.*;   
  449.   
  450. /**  
  451.  
  452.  * 实现质数判别逻辑的线程  
  453.  
  454.  */  
  455.   
  456. public class PrimeLogicThread extends Thread {   
  457.   
  458.          Socket socket;   
  459.   
  460.          InputStream is;   
  461.   
  462.          OutputStream os;   
  463.   
  464.             
  465.   
  466.          public PrimeLogicThread(Socket socket){   
  467.   
  468.                    this.socket = socket;   
  469.   
  470.                    init();   
  471.   
  472.                    start();   
  473.   
  474.          }   
  475.   
  476.          /**  
  477.  
  478.           * 初始化  
  479.  
  480.           */  
  481.   
  482.          private void init(){   
  483.   
  484.                    try{   
  485.   
  486.                             is = socket.getInputStream();   
  487.   
  488.                             os = socket.getOutputStream();   
  489.   
  490.                    }catch(Exception e){}   
  491.   
  492.          }   
  493.   
  494.             
  495.   
  496.          public void run(){   
  497.   
  498.                    while(true){   
  499.   
  500.                             //接收客户端反馈   
  501.   
  502.                             byte[] data = receive();   
  503.   
  504.                             //判断是否是退出   
  505.   
  506.                             if(isQuit(data)){   
  507.   
  508.                                      break;  //结束循环   
  509.   
  510.                             }   
  511.   
  512.                             //逻辑处理   
  513.   
  514.                             byte[] b = logic(data);   
  515.   
  516.                             //反馈数据   
  517.   
  518.                             send(b);   
  519.   
  520.                    }   
  521.   
  522.                    close();   
  523.   
  524.          }   
  525.   
  526.             
  527.   
  528.          /**  
  529.  
  530.           * 接收客户端数据  
  531.  
  532.           * @return 客户端发送的数据  
  533.  
  534.           */  
  535.   
  536.          private  byte[] receive(){   
  537.   
  538.                    byte[] b = new byte[1024];   
  539.   
  540.                    try {   
  541.   
  542.                             int n = is.read(b);   
  543.   
  544.                             byte[] data = new byte[n];   
  545.   
  546.                             //复制有效数据   
  547.   
  548.                             System.arraycopy(b, 0, data, 0, n);   
  549.   
  550.                             return data;   
  551.   
  552.                    } catch (Exception e){}   
  553.   
  554.                    return null;   
  555.   
  556.          }   
  557.   
  558.             
  559.   
  560.          /**  
  561.  
  562.           * 向客户端发送数据  
  563.  
  564.           * @param data 数据内容  
  565.  
  566.           */  
  567.   
  568.          private void send(byte[] data){   
  569.   
  570.                    try{   
  571.   
  572.                             os.write(data);   
  573.   
  574.                    }catch(Exception e){}   
  575.   
  576.          }   
  577.   
  578.             
  579.   
  580.          /**  
  581.  
  582.           * 判断是否是quit  
  583.  
  584.           * @return 是返回true,否则返回false  
  585.  
  586.           */  
  587.   
  588.          private boolean isQuit(byte[] data){   
  589.   
  590.                    if(data == null){   
  591.   
  592.                             return false;   
  593.   
  594.                    }else{   
  595.   
  596.                             String s = new String(data);   
  597.   
  598.                             if(s.equalsIgnoreCase("quit")){   
  599.   
  600.                                      return true;   
  601.   
  602.                             }else{   
  603.   
  604.                                      return false;   
  605.   
  606.                             }   
  607.   
  608.                    }   
  609.   
  610.          }   
  611.   
  612.             
  613.   
  614.          private byte[] logic(byte[] data){   
  615.   
  616.                    //反馈数组   
  617.   
  618.                    byte[] b = new byte[1];   
  619.   
  620.                    //校验参数   
  621.   
  622.                    if(data == null){   
  623.   
  624.                             b[0] = 2;   
  625.   
  626.                             return b;   
  627.   
  628.                    }   
  629.   
  630.                    try{   
  631.   
  632.                             //转换为数字   
  633.   
  634.                             String s = new String(data);   
  635.   
  636.                             int n = Integer.parseInt(s);   
  637.   
  638.                             //判断是否是质数   
  639.   
  640.                             if(n >= 2){   
  641.   
  642.                                      boolean flag = isPrime(n);   
  643.   
  644.                                      if(flag){   
  645.   
  646.                                                b[0] = 0;   
  647.   
  648.                                      }else{   
  649.   
  650.                                                b[0] = 1;   
  651.   
  652.                                      }   
  653.   
  654.                             }else{   
  655.   
  656.                                      b[0] = 2;  //格式错误   
  657.   
  658.                                      System.out.println(n);   
  659.   
  660.                             }   
  661.   
  662.                    }catch(Exception e){   
  663.   
  664.                             e.printStackTrace();   
  665.   
  666.                             b[0] = 2;   
  667.   
  668.                    }   
  669.   
  670.                    return b;   
  671.   
  672.          }   
  673.   
  674.             
  675.   
  676.          /**  
  677.  
  678.           *   
  679.  
  680.           * @param n  
  681.  
  682.           * @return  
  683.  
  684.           */  
  685.   
  686.          private boolean isPrime(int n){   
  687.   
  688.                    boolean b = true;   
  689.   
  690.                    for(int i = 2;i <= Math.sqrt(n);i++){   
  691.   
  692.                             if(n % i == 0){   
  693.   
  694.                                      b = false;   
  695.   
  696.                                      break;   
  697.   
  698.                             }   
  699.   
  700.                    }   
  701.   
  702.                    return b;   
  703.   
  704.          }   
  705.   
  706.             
  707.   
  708.          /**  
  709.  
  710.           * 关闭连接  
  711.  
  712.           */  
  713.   
  714.          private void close(){   
  715.   
  716.                    try {   
  717.   
  718.                             is.close();   
  719.   
  720.                             os.close();   
  721.   
  722.                             socket.close();   
  723.   
  724.                    } catch (Exception e){}   
  725.   
  726.          }   
  727.   
  728. }   
  729.   
  730.          本示例使用的服务器端的结构和前面示例中的结构一致,只是逻辑线程的实现相对来说要复杂一些,在线程类中的logic方法中实现了服务器端逻辑,根据客户端发送过来的数据,判断是否是质数,然后根据判断结果按照协议格式要求,生成客户端反馈数据,实现服务器端要求的功能。   

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值