a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 168|回复: 2

[专业语言] JAVA认证:质数判别示例分析(2)

[复制链接]
发表于 2012-8-4 12:44:44 | 显示全部楼层 |阅读模式
该示例实现的功能是质数判断,程序实现的功能为客户端程序接收用户输入的数字,然后将用户输入的内容发送给服务器端,服务器端判断客户端发送的数字是否是质数,并将判断的结果反馈给客户端,客户端根据服务器端的反馈显示判断结果。
! g1 N, i& ^6 y# d; i    质数的规则是:最小的质数是2,只能被1和自身整除的自然数。当用户输入小于2的数字,以及输入的内容不是自然数时,都属于非法输入。
: L( G9 {5 E0 u) i3 t$ U    网络程序的功能都分为客户端程序和服务器端程序实现,下面先描述一下每个程序分别实现的功能:
* k# F- K' y+ O- K    1、  客户端程序功能:/ `9 c& n5 Y1 M' k/ @5 m
    a)         接收用户控制台输入
% d: c' _! z2 |" S    b)         判断输入内容是否合法
4 O. F$ `- e/ ^+ ?( H    c)         按照协议格式生成发送数据
; ^, x: i7 C0 T7 l! P- G    d)         发送数据
1 q  p6 D' V2 S1 t' B  P* H    e)         接收服务器端反馈( f# E+ k1 L5 x; l* ?$ _" i- I/ Y
    f)          解析服务器端反馈信息,并输出
- E& @; e" Y) X+ T% n9 v' o& {    2、  服务器端程序功能:
) q1 B6 E7 B6 ^1 A1 }5 O/ }" d& W    a)         接收客户端发送数据+ A) J  [5 a5 a
    b)         按照协议格式解析数据2 {, W, c4 x5 C
    c)         判断数字是否是质数! H# f, _. [! Z; g9 F+ i- N* O. g
    d)         根据判断结果,生成协议数据
6 G, t' X+ m# a/ k  n3 `, @4 A5 B    e)         将数据反馈给客户端
1 _/ c# d( b" y. l8 Z    分解好了网络程序的功能以后,就可以设计网络协议格式了,如果该程序的功能比较简单,所以设计出的协议格式也不复杂。# g; Q5 \  r2 _- {4 K/ P
    客户端发送协议格式:" F8 L& i9 A+ Z  t9 i% C
    将用户输入的数字转换为字符串,再将字符串转换为byte数组即可。
7 \* c: y; v  ?6 W    例如用户输入16,则转换为字符串“16”,使用getBytes转换为byte数组。
( \# m) P! K9 b6 U+ e6 @3 U    客户端发送“quit”字符串代表结束连接$ u( L7 n4 i* J2 u0 t
    服务器端发送协议格式:; T/ D; O3 P$ z+ Y7 l
    反馈数据长度为1个字节。数字0代表是质数,1代表不是质数,2代表协议格式错误。2 L% X6 c* h! H7 Z+ F' J
    例如客户端发送数字12,则反馈1,发送13则反馈0,发送0则反馈2。
2 _  P* h* ^* X6 i    功能设计完成以后,就可以分别进行客户端和服务器端程序的编写了,在编写完成以后联合起来进行调试即可。' }8 P, j- C: Z; G) t
    下面分别以TCP方式和UDP方式实现该程序,注意其实现上的差异。不管使用哪种方式实现,客户端都可以多次输入数据进行判断。对于UDP方式来说,不需要向服务器端发送quit字符串。: l; e/ G. n0 X+ Y5 j$ x
    以TCP方式实现的客户端程序代码如下:
, I4 m0 R% X% ]4 {9 q$ }. R    package example1;
; J& d" h. Z" ~" U- p2 d    import java.io.*;$ e: O1 r7 u2 o" c- L& o
    import java.net.*;
- d4 V, V' @% a  V$ P1 R    /**4 S: F4 i, y2 g
    * 以TCP方式实现的质数判断客户端程序' O  O  N% }6 t  _! y; A
    */
& o  E7 w# M; h5 J: K1 L    public class TCPPrimeClient {5 a+ A! K9 v+ }! n
    static BufferedReader br;. W+ `  f3 t6 W4 q8 C3 Y. \' G
    static Socket socket;
' I& f: I, o. H+ ?% t" j/ D    static InputStream is;. |5 @3 J% p3 h  {" m& Q- V* r0 U
    static OutputStream os;
/ K6 c. }* [  w- L$ y% q    /**服务器IP*/8 O: D, F  r2 ]2 v2 A) [0 ~2 W
    final static String HOST = "127.0.0.1";* o) e) P; ?' E* F
    /**服务器端端口*/+ q% D2 `- e) A
    final static int PORT = 10005;
; j1 t# L. Y# |7 g& e' M    public static void main(String[] args) {
" q3 D" ]. J0 e3 g- E1 u* Y    init(); //初始化
7 r, n9 `, X" _/ ]* Z8 M0 Q    while(true){
8 t4 y4 r1 i( r3 v$ v    System.out.println("请输入数字:");9 l6 C$ n+ i' N+ V8 g6 i8 C3 D
    String input = readInput(); //读取输入
# ?6 G+ x0 r" g9 `4 p/ X" j$ H) ^    if(isQuit(input)){ //判读是否结束: E1 ~! s% A4 P0 r8 _8 v
    byte[] b = "quit".getBytes();
( `. K( Z4 N5 N7 ?/ E, K6 C6 j    send(b);
- R' A1 N6 z; j' S1 e    break; //结束程序
回复

使用道具 举报

 楼主| 发表于 2012-8-4 12:44:45 | 显示全部楼层

JAVA认证:质数判别示例分析(2)

}
8 _7 l$ }6 p( N    if(checkInput(input)){ //校验合法  Q6 `- `8 W7 u
    //发送数据
5 C# r6 c/ C2 [( x    send(input.getBytes());
6 p% L) m" G% a4 W) v* `    //接收数据7 ~) T2 }( d) \. O8 W# E9 E) ]8 R
    byte[] data = receive();; P4 G8 O+ P8 u, h3 U) K8 _; }9 e
    //解析反馈数据
; x+ u- H4 O5 J$ X    parse(data);# E+ E# K9 t# V) O* G0 {3 N, e
    }else{
( h6 ?6 M! A2 T6 z( Q+ [/ T7 k    System.out.println("输入不合法,请重新输入!");1 d) v* R' }  Q, b0 M6 B4 w
    }6 B7 S3 I6 S" i3 Y# @  v- F
    }( Q. R! w: |3 T* ?, @$ U0 p. T8 \
    close();  //关闭流和连接# ^# j. m) K2 s0 H
    }
$ @. T  R( g% U- L5 C! G3 {( R    /**6 |% _; y- ]4 F. k- {+ a3 Z& l
    * 初始化
$ V/ E4 D  i$ {- ?& v* V4 Q+ B8 a    */
% C8 w7 ~: v, Q; I9 _" M    private static void init(){* D/ G* m  p$ p1 d5 l7 u
    try {6 E: T! V4 L0 m
    br = new BufferedReader(" n* b8 ~6 O/ J) ?# p
    new InputStreamReader(System.in));2 x) {9 z( k0 F% ~
    socket = new Socket(HOST,PORT);
% `3 d  A/ v! U2 P; w" _% V# Q    is = socket.getInputStream();8 F1 z" |8 v1 C5 Q2 b8 @
    os = socket.getOutputStream();
+ B3 D9 G/ `3 R# A    } catch (Exception e) {}. M/ l4 E& W2 w: I
    }5 m: L& H4 g' {+ U
    /**
: g1 B, v6 V# F, ?6 j5 y    * 读取客户端输入6 I; c8 W- Q' k( |& E
    */- N/ W! t+ m) y0 l
    private static String readInput(){) ^! e$ |6 Q3 ~- N
    try {
  Z0 k4 \. A6 s9 j5 A& ~    return br.readLine();
  A( e! |+ J- ]2 i% |8 `4 L+ D    } catch (Exception e) {; L: X* i% _, n2 l" b# e" |
    return null;3 e: w1 ?% F- w3 @# |
    }
( j2 `  P( H! k/ r: y: x& U( y    }: }8 P! S( u) Z
    /**
  y. a% m! o4 A    * 判断是否输入quit
+ |9 A& e% d  E& J" Q" r    * @param input 输入内容0 ^2 \. e' F! F
    * @return true代表结束,false代表不结束' v* e; O5 ]& B" M0 _
    */# I1 e% l. Q1 I
    private static boolean isQuit(String input){
" C8 f3 S+ _' U$ y    if(input == null){  U7 D8 D7 E' H5 E
    return false;
3 l! w! ~1 A( _5 A# t6 U6 N# w    }else{7 Z1 s" q0 v' u7 r
    if("quit".equalsIgnoreCase(input)){
* l3 D9 V* L' ?    return true;6 X: R. o% m; G, m
    }else{2 E2 A% L3 d- ]# Z. r% w, T
    return false;
0 |+ c4 c" \6 h- {& v* ?6 W# I    }
2 u8 k4 U. X9 |8 ]+ y    }5 n* c- h" D, D8 D
    }: g" ?# j3 }3 Y: v" W$ b: Z2 Q
    /**+ h3 A; L& d  a9 {. L9 m
    * 校验输入1 T. B  ]) K* t' o  s/ i6 U
    * @param input 用户输入内容
1 y6 }8 r  f$ Z+ a# _6 r3 [    * @return true代表输入符合要求,false代表不符合
9 d6 E7 |# @2 d6 H    */( S: T! `: {) o2 D5 ^
    private static boolean checkInput(String input){
( p% @/ u1 y, h8 i. o    if(input == null){
! B' |/ m8 H. D! Q6 k: h    return false;: D" C; d# H( U, w
    }
" C& v+ O( O2 w; @    try{- K3 L) s3 }/ b1 G1 j7 w
    int n = Integer.parseInt(input);
! [7 F0 G  x$ r! h" P    if(n >= 2){
8 \  j7 x2 D  m7 b) ~    return true;7 N6 K& g4 B: I
    }else{
" ~: M$ d$ K' n    return false;
+ J! v* M9 m" X. T    }
5 [# N3 m3 }) j0 p8 \0 t( x7 f& d    }catch(Exception e){
$ n+ o$ U! O- {& G# p7 r    return false;  //输入不是整数
7 ^. u/ d8 ~# `# y$ T    }
* s  @9 F% P( T8 x2 s* {* T    }
" J" J- D8 M. x    /**
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 12:44:46 | 显示全部楼层

JAVA认证:质数判别示例分析(2)

* 向服务器端发送数据, G( `6 J2 f" X6 J; K2 K
    * @param data 数据内容
+ q% v' L" `+ c; \- s; L. D; c7 x    */
9 j' P: B0 k9 G6 u! i    private static void send(byte[] data){
. [+ `( c0 E3 K    try{9 N4 M0 o# o6 w: s! w+ P' W0 g
    os.write(data);
; E3 w% j) y4 s  p/ U    }catch(Exception e){}
2 ~2 I# Y! c: M0 z2 ?, H  w( ?    }4 [! b; n7 Q& I6 O3 X
    /**
+ ~* K: \6 F- z' p! x; F+ z    * 接收服务器端反馈' a( A  Q( t% D" _
    * @return 反馈数据
; ]" v: p% h0 ?, y    */& Z* G7 V8 p: N1 @; ]) O7 }
    private static byte[] receive(){1 p  F/ B9 i) {& n" ]$ r0 C
    byte[] b = new byte[1024];
, J9 ^2 s9 N, R; A4 i1 i+ A    try {
5 @% y1 f; z, i& c* {5 I    int n = is.read(b);8 X8 P6 G7 e* F5 b2 i* D
    byte[] data = new byte[n];
8 N0 P9 Q# D7 H9 {    //复制有效数据
0 U/ f7 b9 K- K$ ~" O* ?    System.arraycopy(b, 0, data, 0, n);
$ D, E) j( G& J' S' C5 r    return data;6 H; g* G+ f- D0 O% M* M2 V$ {  @7 I
    } catch (Exception e){}7 l7 w& i3 r$ M( ^6 g4 h" p4 V  G
    return null;
, i7 i1 P6 h6 w2 _. r1 {    }
0 l2 J1 G6 O" ^8 E    /*** o& S- G- J9 o. ?4 X
    * 解析协议数据
! ]- Q  }5 @/ a( s( I    * @param data 协议数据4 ]) f0 M, T% _2 d; e1 C, V7 B& L
    */2 M3 ~/ h# z/ i. x# `4 O( |' U
    private static void parse(byte[] data){: T& {2 ]" P9 ~) U  C
    if(data == null){/ U2 ]' y% B' s8 ?5 Z  ^
    System.out.println("服务器端反馈数据不正确!");
. x8 b* M; W) M    return;4 w, m$ O6 g3 o6 A% g  [: i
    }, `5 l# i- c; c6 U
    byte value = data[0]; //取第一个byte
, |$ ~( c. d6 z4 B* R+ n3 b    //按照协议格式解析& M& O, U1 Z5 ]3 n; |) Q+ |
    switch(value){. f4 b* N( q4 n( o$ @# v
    case 0:
! L9 Z* S5 R+ |6 s) ^( O+ x    System.out.println("质数");
! B0 f# W: [: F    break;
" g. \* E; n6 v" B    case 1:
* q' d* u. j& `7 C4 n    System.out.println("不是质数");
2 x5 M( T0 g! ^( g9 g% |    break;9 A0 J1 M' y2 J# ]7 V+ b, R. J
    case 2:" P; l+ Y0 s. ?
    System.out.println("协议格式错误");
  f) n+ p; I+ ~. S    break;
, r4 \2 X6 H& L  {+ A2 B# A    }
: S6 |$ q* r- A0 A    }% J2 E' X% `$ H
    /**2 X, F2 c4 x1 }' L/ \
    * 关闭流和连接
1 d* w; w; b: ~) f$ ?    */
- ]- E& V( _% _    private static void close(){
1 d6 x$ r- U2 \1 A! [    try{
1 ]* w( }: q" }2 A$ o8 k8 l    br.close();
; F! }9 s( H; ?1 {    is.close();9 p& V+ u: G- D$ X  B
    os.close();
& g$ y7 r! {& H1 I) t9 i+ g    socket.close();: q, ^* c2 I& }2 b
    }catch(Exception e){3 t6 S4 y' l% ~& }2 ]/ ]) C* M
    e.printStackTrace();
5 \9 {( m0 Z: I2 }( m* ?! S! V    }5 J8 P' H) c- A, \
    }9 H) e7 {9 W# s' n8 p
    }
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-9-27 20:57 , Processed in 0.816629 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表