a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 171|回复: 2

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

[复制链接]
发表于 2012-8-4 12:44:44 | 显示全部楼层 |阅读模式
该示例实现的功能是质数判断,程序实现的功能为客户端程序接收用户输入的数字,然后将用户输入的内容发送给服务器端,服务器端判断客户端发送的数字是否是质数,并将判断的结果反馈给客户端,客户端根据服务器端的反馈显示判断结果。
; h, N8 C# U( k: \. q# G/ A    质数的规则是:最小的质数是2,只能被1和自身整除的自然数。当用户输入小于2的数字,以及输入的内容不是自然数时,都属于非法输入。
/ H- e  n3 l( ~: A% K    网络程序的功能都分为客户端程序和服务器端程序实现,下面先描述一下每个程序分别实现的功能:9 q2 ]. o9 H0 y6 f, R: h7 o4 V
    1、  客户端程序功能:
- K- ^5 _$ K# g6 C; L0 [; H    a)         接收用户控制台输入# g2 L8 K$ l% S/ G4 h7 l) G
    b)         判断输入内容是否合法# k% X. I& X2 z& X, d4 H
    c)         按照协议格式生成发送数据$ k  ^8 }! {4 Y% ?/ \$ Y6 K
    d)         发送数据
6 L/ Y0 A" o. E2 f( u    e)         接收服务器端反馈6 t, A# s4 y# U& I/ X
    f)          解析服务器端反馈信息,并输出& R0 w( G! g0 n. u7 U& ~" `
    2、  服务器端程序功能:  T+ q3 a( b& a2 s4 q2 m& T
    a)         接收客户端发送数据5 b: R* w8 _  A  Z+ Z% v/ k
    b)         按照协议格式解析数据( O' o' m6 ^* t8 s2 c+ ~* P
    c)         判断数字是否是质数
4 W) m6 w" U1 D    d)         根据判断结果,生成协议数据2 l8 T2 d6 f% }% t3 w3 Z9 o. K0 `5 M
    e)         将数据反馈给客户端# z" l  f; _) w8 B
    分解好了网络程序的功能以后,就可以设计网络协议格式了,如果该程序的功能比较简单,所以设计出的协议格式也不复杂。& K* ~5 ]/ t: h/ |( I: e
    客户端发送协议格式:  \) a3 O+ U& M6 g; P& N& p6 `
    将用户输入的数字转换为字符串,再将字符串转换为byte数组即可。9 K4 N! A  G8 G8 e7 J- [8 T
    例如用户输入16,则转换为字符串“16”,使用getBytes转换为byte数组。2 ]1 x6 f+ [  Y2 C5 _
    客户端发送“quit”字符串代表结束连接
" x* K0 D) _8 _; [    服务器端发送协议格式:
8 K5 S! }+ Z% o$ I' I    反馈数据长度为1个字节。数字0代表是质数,1代表不是质数,2代表协议格式错误。! R$ z# {/ |0 L: h
    例如客户端发送数字12,则反馈1,发送13则反馈0,发送0则反馈2。6 Y7 J, ^  w/ Z2 W, ]/ [7 z- Y
    功能设计完成以后,就可以分别进行客户端和服务器端程序的编写了,在编写完成以后联合起来进行调试即可。
+ T* Y$ V/ Q" R3 k6 Y    下面分别以TCP方式和UDP方式实现该程序,注意其实现上的差异。不管使用哪种方式实现,客户端都可以多次输入数据进行判断。对于UDP方式来说,不需要向服务器端发送quit字符串。
  {+ u  `: D7 \  V: C* h    以TCP方式实现的客户端程序代码如下:& ]$ _4 w# Q9 b9 R0 Z; ?1 o7 T; T
    package example1;
5 V! ], t) R& E8 m& D    import java.io.*;2 s- ]% F% P, X' b* s5 B- Y9 _) @. Q
    import java.net.*;
% K; o1 T4 y: n3 ?. q    /**
: {% @$ d9 o5 c% c+ A( i7 K    * 以TCP方式实现的质数判断客户端程序- X! ?3 y2 @+ L
    */
7 h. s$ @3 @( \9 l    public class TCPPrimeClient {2 p! b: }$ s* D
    static BufferedReader br;
# C  t8 t; L& Z$ z' c    static Socket socket;7 d9 q. s" F3 d' ?8 d
    static InputStream is;  N" L- q. g: L! m
    static OutputStream os;. [  [! d, e) V0 F; ^" [
    /**服务器IP*/
- B; Q! p5 {/ _  u8 w8 I    final static String HOST = "127.0.0.1";
; J6 M- F( Q/ c    /**服务器端端口*/. y! j0 |  c5 q9 ~# k8 y4 k; z
    final static int PORT = 10005;' m8 ]+ y+ P" |2 ]
    public static void main(String[] args) {
, H. s: C6 x% Z    init(); //初始化* y# r8 C  g, o  Z) R" K
    while(true){
4 }8 h' Q. T3 m* M8 Y5 c, w! i0 t1 k    System.out.println("请输入数字:");
& Z. `$ D2 R7 A/ |    String input = readInput(); //读取输入5 J+ C- C+ h) ^9 D  {, Q
    if(isQuit(input)){ //判读是否结束
  J9 H- P5 ?7 O% `' e  ]    byte[] b = "quit".getBytes();; h7 a6 e& S$ s/ S# }! q5 q# ^
    send(b);$ V1 P( [2 [" c" W( z
    break; //结束程序
" X2 o8 J# [& X8 j" g    }
; n1 ]3 u$ u4 P  f    if(checkInput(input)){ //校验合法4 Z4 \$ _/ {) T8 G/ d; R/ Z8 l
    //发送数据( j! n; K( W6 `; U9 r, i, \0 x
    send(input.getBytes());
  t1 {& i  @5 I# ~  [    //接收数据
) f+ [& b5 {8 {8 L    byte[] data = receive();6 U# Z6 M! W& @
    //解析反馈数据
- U0 q5 \( T& V    parse(data);
2 X% b7 W$ ^* g, \# E    }else{- X6 {, t7 ?$ _9 i% y
    System.out.println("输入不合法,请重新输入!");7 f* A9 p: r! n) J% l( g
    }
- E# P- h" t* c' s( l8 E4 U9 ^    }9 X- P( }5 i$ V
    close();  //关闭流和连接
& f, t: a: S$ ?& B    }
& V" n0 k4 ^* Q- w' {, F    /**
回复

使用道具 举报

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

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

</p>
& _2 P- C- {! T! t; a    * 初始化1 ^8 N# ~% ^' O7 F+ C9 u' R) H
    */
' i+ k% }) |. h4 Z* o) z6 H  V    private static void init(){! m5 H7 {" t$ D  K8 X+ E" q
    try {7 B8 ~' }1 u1 ?' q- s( _
    br = new BufferedReader(
% @" A* `$ s8 G- {1 G' `    new InputStreamReader(System.in));. O( U# `5 R$ u* d
    socket = new Socket(HOST,PORT);
4 e( X$ |! F) D1 Q6 M  t    is = socket.getInputStream();
) a, m/ A! f0 B. d( i    os = socket.getOutputStream();
$ a/ C4 K. r- u$ O! Q0 q5 ?% c    } catch (Exception e) {}
& z$ {0 V8 P/ t+ x8 C- u0 |/ K  K    }& T5 P% ~4 u6 [! a/ I
    /**4 a1 x( z0 S1 P  d
    * 读取客户端输入+ _& s' Q6 v4 g$ H$ x- Z3 ~* ~! u5 C
    */
8 z2 H, G& e( i1 ?2 [* [    private static String readInput(){
& ]2 c( E5 x0 k  h/ H% J    try {7 H5 N1 h9 _* I/ U9 ?/ E& q1 |
    return br.readLine();
" ^# a3 M; E& d1 F/ m    } catch (Exception e) {4 }& W- A% A% H% z1 Q2 y9 A0 Z
    return null;
4 H& K) F" Q0 R    }& D! S& I9 T# M6 r4 O
    }
7 z" h9 N$ M( [" ?, E: D    /**
' a* S. ~$ M$ Q+ ]8 c  I    * 判断是否输入quit8 p; e% F- \3 h0 \
    * @param input 输入内容
, U! o1 R6 B6 ^0 O3 W  W    * @return true代表结束,false代表不结束
  y8 \, U3 s% U1 X    */! \0 h4 a2 [4 X1 x
    private static boolean isQuit(String input){
9 `$ {3 s( R, |% \8 n( q    if(input == null){
7 M1 G; o% K6 R# V. a0 a    return false;
! @* _+ |0 }, V6 q9 h  U* q    }else{' o* F8 A) q) q0 r9 }1 s3 C8 v  s# F
    if("quit".equalsIgnoreCase(input)){" Q4 J1 f8 ^8 V8 c( Q5 L
    return true;
. c' s. G: ~! b( w- q2 }    }else{+ q  A' |0 ^1 z9 {# _
    return false;+ k& ~8 ]- b' y1 s# S' [1 \3 I
    }
" \4 \: o7 w3 L( q( ?9 e8 v    }
' l5 `( ^% D# m* P$ h( l) \$ i& O    }9 n# d& V# {/ h: Z
    /**
' d3 Y$ u! q) z: p. t, l# n2 A, f    * 校验输入
3 D  e& @* W8 k( A    * @param input 用户输入内容
" k3 |, q0 w' B1 {0 o( t6 B3 h    * @return true代表输入符合要求,false代表不符合
6 B) y9 }2 e& x/ w1 z( N    */6 Q, e/ t* H, F0 \4 @( U
    private static boolean checkInput(String input){# A3 J2 T: _: h% ?% R5 j- ]
    if(input == null){
# [( L5 z: G" o! L    return false;$ o0 I- h4 t! j# V3 {% |* A5 i) G1 N4 M1 c
    }
+ Z7 h( S. Y# H    try{
1 j% S( l# x5 l' Q    int n = Integer.parseInt(input);
2 x/ `6 @# m& {% e4 H: c    if(n >= 2){
3 C2 y% r" o2 i  g* S    return true;
) ~& c* `+ J4 _3 a" w    }else{
  B% k8 u: G- l3 V3 e# y    return false;
+ q: l/ F. h7 i' |0 w" m6 R    }0 N) Z% f$ B0 R9 `
    }catch(Exception e){
6 {8 ]( Z5 J" p1 V, S6 A4 Y& f    return false;  //输入不是整数
$ Y- j/ u5 b4 I+ g# ^/ L; K    }
5 F3 f' I  a3 E& z! ?6 a6 ^  \    }2 D9 @* R4 P6 z1 L; s1 j: \8 e
    /**
6 F0 w" m$ u4 z% ~    * 向服务器端发送数据
* ?  C. K2 }" R    * @param data 数据内容  M/ X8 Z( G* B% j' M2 }) P: q
    */
7 D1 o0 o) l- O4 Y" F    private static void send(byte[] data){
  W/ d" u6 S- d) N7 w5 I7 w8 B: X6 j    try{# V# H( F! A; Z9 w! ^
    os.write(data);
5 C% Y+ W* s0 m. F! y! H  K/ ~3 z    }catch(Exception e){}% A3 p- I* L0 ~! t6 ?. I
    }
回复 支持 反对

使用道具 举报

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

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

/**
- t0 G) g% R2 t4 o7 v8 y    * 接收服务器端反馈4 g1 w( e# F+ Q0 Q' v/ b
    * @return 反馈数据
7 _9 A& {# p, W6 g! ^/ n) e    */; l% Y% q3 {" I- V
    private static byte[] receive(){8 \6 `7 X; X8 v* r2 h6 t
    byte[] b = new byte[1024];
( l4 b" k' P0 N% r    try {
* Y/ y% X3 k4 }& A" J& \( L% C    int n = is.read(b);
) N7 g2 |. E9 [! O" d8 m    byte[] data = new byte[n];) ], P+ G. |# s
    //复制有效数据
  a! n8 }, M3 A* @    System.arraycopy(b, 0, data, 0, n);
5 H1 o9 ]2 c0 i, ?# V3 P0 d- E    return data;
# ~. ?8 h1 S' f; s4 p4 _8 {" r1 z    } catch (Exception e){}$ Y. N3 Q8 G' M5 y. M* r% ~
    return null;
4 U5 I$ {5 E. K+ f- s  B: k    }0 ?' k7 L5 d! X9 v8 u. N8 }
    /**
7 P* M0 d! K5 |    * 解析协议数据6 ~5 {: E) h' I4 y
    * @param data 协议数据
, z3 L$ K2 ?; e    */
  v, p" c0 E! V) m) S4 b    private static void parse(byte[] data){
& O9 M$ [% T3 Y    if(data == null){
8 H" L- J% f/ B" M# C8 R4 Y1 r    System.out.println("服务器端反馈数据不正确!");
7 \! G- C4 ^: D2 M. A    return;
& \. w. Z( @) f    }
3 V& I' D0 ]7 A, u, x    byte value = data[0]; //取第一个byte  o& |$ P7 C6 w$ p% d: K& f
    //按照协议格式解析
2 A/ x: f+ R, C) A. j' E6 O    switch(value){  Q* D  S. i( }$ m
    case 0:( V9 ?% B% V- P
    System.out.println("质数");3 c$ m, O! ^3 a+ s0 @
    break;. G& P+ `: ?2 r" s! @
    case 1:7 N: d  v0 w3 b! x; w9 u
    System.out.println("不是质数");
% B4 [# ^8 `# Y$ a    break;" r! y& d  z. x/ Y+ h
    case 2:
2 W* \9 U, l) Y6 q; e' O    System.out.println("协议格式错误");! a. _, R1 ^5 E6 V, c6 m+ u5 s5 A1 m% \
    break;
5 v6 A5 Q+ ]/ H8 O0 ~    }- c4 @1 O& L7 N) H  c, v' T5 f
    }
5 Z& w( _, ]: L; o$ X3 m/ a4 a$ j5 B    /**
. K: I0 Q" ~6 l% C. W* g7 W8 ?8 o9 \  h    * 关闭流和连接
8 N* y7 O$ i1 `    */+ V3 v* @9 c1 {4 H! S
    private static void close(){( z( @3 D, a8 X% C: l! w) q
    try{
" G- _$ {! r2 U8 b    br.close();
+ c" w3 G0 H  c' c" N    is.close();
2 M+ x* s, P' v    os.close();) N5 i2 Y' m5 x( X" y" l: I. o
    socket.close();
# S% }9 D8 h7 B0 [, T" l# P' M    }catch(Exception e){( b4 d/ n. |+ S6 r5 ?7 U' B- W0 s
    e.printStackTrace();
  d# r) q3 l2 x3 q5 k; N    }
6 B! z: p6 f  l+ s  s- s    }
; a; G' M5 x5 q; V$ c    }</p>
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-27 21:09 , Processed in 0.336432 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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