a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 153|回复: 2

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

[复制链接]
发表于 2012-8-4 12:44:44 | 显示全部楼层 |阅读模式
该示例实现的功能是质数判断,程序实现的功能为客户端程序接收用户输入的数字,然后将用户输入的内容发送给服务器端,服务器端判断客户端发送的数字是否是质数,并将判断的结果反馈给客户端,客户端根据服务器端的反馈显示判断结果。" \  M2 M* U2 N/ M5 |
    质数的规则是:最小的质数是2,只能被1和自身整除的自然数。当用户输入小于2的数字,以及输入的内容不是自然数时,都属于非法输入。1 ^: W! y: p1 ~& P/ H* m' t
    网络程序的功能都分为客户端程序和服务器端程序实现,下面先描述一下每个程序分别实现的功能:) m6 j1 S# B; B1 ~/ D5 O) |$ S7 v; Z6 A
    1、  客户端程序功能:
3 l: R9 S6 S7 |; W0 Q    a)         接收用户控制台输入1 s" \, l+ b. e7 O
    b)         判断输入内容是否合法
* K0 t: S5 f4 L& p- g7 `    c)         按照协议格式生成发送数据
! D" E0 n- z9 z; F    d)         发送数据! \& R5 Q2 ~+ C0 Z8 D! T/ p5 q; o  U6 {
    e)         接收服务器端反馈
+ ~& @; j3 g# Y( C' G; f    f)          解析服务器端反馈信息,并输出  m/ p. f: h0 a
    2、  服务器端程序功能:8 U+ V1 x: J7 q' _5 u( A
    a)         接收客户端发送数据
: l$ i7 {+ R% L, o' r    b)         按照协议格式解析数据( q! ?2 T4 i' G
    c)         判断数字是否是质数) Y$ Y) k/ d' A: |+ Q" U6 l- j& @  Y
    d)         根据判断结果,生成协议数据
$ D9 g* \" O! c5 L1 ~7 A+ [* X  y    e)         将数据反馈给客户端
' s; [2 E5 N  E    分解好了网络程序的功能以后,就可以设计网络协议格式了,如果该程序的功能比较简单,所以设计出的协议格式也不复杂。
( R/ A0 A/ X2 ?! m2 B    客户端发送协议格式:
7 F. l& H% U% t. g    将用户输入的数字转换为字符串,再将字符串转换为byte数组即可。
* D' D  ^( o8 d4 J+ ?- M; D    例如用户输入16,则转换为字符串“16”,使用getBytes转换为byte数组。$ F2 w1 d! J2 M( C1 g7 T
    客户端发送“quit”字符串代表结束连接4 z3 T1 C2 ^! S! |
    服务器端发送协议格式:6 A  X9 \+ ]6 b+ @9 X% G& f
    反馈数据长度为1个字节。数字0代表是质数,1代表不是质数,2代表协议格式错误。. l( O+ Y: m! M- d- ~6 a% C$ S
    例如客户端发送数字12,则反馈1,发送13则反馈0,发送0则反馈2。- s. F8 i( e- U9 B1 t5 I  O
    功能设计完成以后,就可以分别进行客户端和服务器端程序的编写了,在编写完成以后联合起来进行调试即可。# e( b5 q7 @$ t9 `3 j% p
    下面分别以TCP方式和UDP方式实现该程序,注意其实现上的差异。不管使用哪种方式实现,客户端都可以多次输入数据进行判断。对于UDP方式来说,不需要向服务器端发送quit字符串。. U% q! A! G& ~4 F; e" |3 X) O" T
    以TCP方式实现的客户端程序代码如下:2 A& A" Z" z3 ?8 v
    package example1;
5 M9 I% h, z7 U6 N" Q    import java.io.*;/ I: B- Q- q! `4 T1 f
    import java.net.*;( p' ^: k( }! \6 K8 J. C6 k4 c# e7 Z
    /**
3 e8 d" l3 g3 n- ^+ Y+ Z    * 以TCP方式实现的质数判断客户端程序$ O+ \5 ~& i( e5 {9 y; o
    */
% t1 S1 d* X4 J$ E! o    public class TCPPrimeClient {
) a# h) Y: A/ W  ~    static BufferedReader br;- \* L- E! y- x# W0 Q# H& Y+ K
    static Socket socket;
# J7 D4 _8 P3 S( O3 ]( a9 W0 T    static InputStream is;
2 Z" h. p8 S$ Q    static OutputStream os;
  R  ]) P3 K5 ]3 g- U( u    /**服务器IP*/9 G& ?7 {) q7 H" E
    final static String HOST = "127.0.0.1";; @8 m8 @' x) Y4 P( ?$ k
    /**服务器端端口*/
& p* |5 y, R$ L6 }% t    final static int PORT = 10005;9 ]& I" }, M9 j5 ^$ t& e
    public static void main(String[] args) {$ _. B7 R" a( o4 a7 J
    init(); //初始化$ L& [/ z# L" `, ~8 {% J
    while(true){% I) h4 ~, i( N1 T
    System.out.println("请输入数字:");
: Y* M7 j" J. j( @& r+ S4 {    String input = readInput(); //读取输入& ^0 b# T6 a! r5 |
    if(isQuit(input)){ //判读是否结束! n' X! _/ W! o; O8 R; Q; W
    byte[] b = "quit".getBytes();+ G+ |& U7 H! ~1 p! Y3 }. Z3 `! u. w
    send(b);
" n8 v/ J+ Z% p6 R0 `    break; //结束程序# n/ A6 x5 V" X9 }) f) R! t% n- B
    }
% ^5 n. m+ ]6 V& `    if(checkInput(input)){ //校验合法
5 x7 U' v2 z$ n5 k% x2 J5 x: T    //发送数据
2 u1 p. q9 M% |- w* {8 W    send(input.getBytes());
. @) ^/ b4 s% G- M    //接收数据/ g0 L. m. \/ k8 H
    byte[] data = receive();
2 i3 y: I3 B) J5 f! r    //解析反馈数据; u( ?4 r4 e  V
    parse(data);
8 ^" y& \5 m0 u5 T- v    }else{
5 X" R; x" I$ N5 z# z$ }+ G, ^: H    System.out.println("输入不合法,请重新输入!");
5 Q1 X7 }8 U& k2 s3 V: @    }
: r7 K9 Y8 B/ W3 a" [; k* k    }
* f( L2 T5 M2 ~  W) l0 r" n! ]2 D: o    close();  //关闭流和连接9 A8 M! v/ K/ g6 \
    }" n% Z( Y% n0 [* a4 L9 f
    /**
回复

使用道具 举报

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

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

</p>9 O3 M9 q/ x* i$ L
    * 初始化# J$ C! s- \0 E
    */
2 J9 f  Z! f: e% |: }  |+ |/ t    private static void init(){; B  g. h+ }' |  [& a& F5 e
    try {
8 G( R- ]) z; T+ V2 C    br = new BufferedReader(. P/ o$ n8 U7 I$ [3 t
    new InputStreamReader(System.in));
8 g+ H. M( j) B9 q) `0 w    socket = new Socket(HOST,PORT);
1 ?' H1 n( w$ ]& X3 x) T    is = socket.getInputStream();
- M+ i1 s1 w4 b  r( y9 i/ G    os = socket.getOutputStream();+ o+ I9 q9 @( c. V1 ^/ x
    } catch (Exception e) {}
" l2 L1 A7 T  u# U' [6 W& G    }/ t3 f/ n/ H0 f$ |& o! B, Q4 v
    /**
# x3 k6 u$ |2 |, V2 R6 Y" |: h    * 读取客户端输入
# ?: S5 g3 }1 e8 M& W) \    */  W& l) k. @7 @8 A6 O4 h
    private static String readInput(){) f/ G9 P- b" D' C+ t
    try {
1 u; o; O6 _) l+ A3 O3 M    return br.readLine();1 t3 m8 f2 E/ K# V5 t# g* |/ N
    } catch (Exception e) {6 T& \3 N7 W& L) N) s
    return null;* K" U8 q7 D1 |2 M& u" P; S( \
    }
$ l: _7 u9 P" R' ?, H    }
: U$ X+ @' `7 a' W! D3 r3 {    /**: f8 h$ N. d3 t  m+ A* n! Q
    * 判断是否输入quit
  |1 I+ A% x: D2 o0 h- |- E( ]3 x    * @param input 输入内容8 }) m2 C$ ~7 z
    * @return true代表结束,false代表不结束% [" U* }2 s% H) R; p% p2 s! i) y! M
    */! d6 p) F5 o+ n2 T% A" [; a
    private static boolean isQuit(String input){
4 k: Z; _; m. X1 c# x. s/ n    if(input == null){
2 V( n1 d# O3 n- X# y. ]    return false;
) Y- s3 ~$ M' k! i" k" O; M    }else{
* m( E4 ?' p  y! e1 P& s    if("quit".equalsIgnoreCase(input)){
5 T- d- H$ e  f* }# V4 I    return true;
" V% A: K2 c2 b+ Y    }else{$ d. N: V/ s7 o* L+ ]2 U# B
    return false;
1 C  e# f& M8 B# ~: Z, l% t    }( P% J6 g( z  z$ J( B* Y
    }
, q# y9 O/ t: M! R  z0 l$ x    }
" g# G5 v7 [8 K    /**
$ _+ m/ n! g; O0 N    * 校验输入7 e, Z+ j$ G! ?% `% a: W& f
    * @param input 用户输入内容- c" Y& M$ d5 T! \" S- X
    * @return true代表输入符合要求,false代表不符合
, U; h- v+ B. v! [; H; c    */" a' G3 T, J4 p. @
    private static boolean checkInput(String input){
, L9 X% j; @9 Q$ b7 U, _, n, u    if(input == null){
" l, f8 J1 Z6 G6 r5 u$ J3 J    return false;
; B; Y+ i6 g1 s& E# b    }+ W* b  |* g7 e' x3 o  x2 }* n
    try{8 t2 X5 {( C5 j1 m1 j& u3 c* C
    int n = Integer.parseInt(input);
' L3 x5 d# \% v    if(n >= 2){
6 R! `+ Z% u3 w1 w    return true;% `/ v3 _; }; ]  W" Y  m, \4 Y
    }else{
- Y. l- S% q% y$ j    return false;
+ a" t9 M- w5 {8 T) Q1 q    }/ ~+ o- i" K9 g/ ~
    }catch(Exception e){& X, J/ r7 i5 w1 r: o  E( F6 H
    return false;  //输入不是整数1 v  |7 x, S1 f1 f& G1 K2 l8 a
    }
* k# U( B( V# E( C    }. n/ f" _5 F6 G+ `4 `& u
    /**6 V+ k3 W/ q8 f
    * 向服务器端发送数据
8 L5 s" D7 q; _# R8 b    * @param data 数据内容6 p4 p: F6 W$ h+ I! P
    */
  w1 y2 A* A) b) l    private static void send(byte[] data){
' T) V+ @; A. M/ {( Z* Q; V9 c4 I    try{
2 c7 i% O5 S0 ~: {    os.write(data);( y( `8 l. P, @: U
    }catch(Exception e){}( ]* d5 ]( l, }6 v
    }
回复 支持 反对

使用道具 举报

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

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

/**
5 U6 P3 p; e: j& X5 d5 `1 X    * 接收服务器端反馈
( x0 g. c* ]" Q7 c, u: g    * @return 反馈数据) U) i7 k5 ^, l: U& ]- ^9 ]/ H
    */
3 E7 h+ j- l/ @- O& \% D$ A  v8 v    private static byte[] receive(){! z1 K6 D* r4 I
    byte[] b = new byte[1024];! p9 }5 `0 v: l. M: `9 M
    try {+ P' d/ `: o8 Q! L0 u; K
    int n = is.read(b);; @6 v7 ~. `$ l9 s5 R* k: Y) z( H
    byte[] data = new byte[n];+ [4 D9 ~0 u" r* ?# l- A1 E* A& h
    //复制有效数据
4 i1 K  V5 x& G+ {) Q6 @    System.arraycopy(b, 0, data, 0, n);5 v6 @5 w7 q. I% \& G! U
    return data;4 w7 ?- C) ~5 i4 ^0 v1 j  w
    } catch (Exception e){}) z4 S: f; P* P& o2 \" U2 ?
    return null;
8 `0 T% Y' R0 H3 x! g# @    }& }3 I4 O5 I" o
    /**
. F" e. s  K: J    * 解析协议数据- Q8 y  s7 |7 u% L2 G
    * @param data 协议数据  ^- O( e7 e3 s+ `/ A
    */
0 |3 c0 u* K" ?7 |0 C    private static void parse(byte[] data){
' K& r% |2 p( b* t% c    if(data == null){* W  R/ r5 U4 M
    System.out.println("服务器端反馈数据不正确!");, u% B6 `+ o6 U/ g1 h  J
    return;0 W  G( f  I8 j0 r$ A
    }: |! ~- \0 R$ ^' _
    byte value = data[0]; //取第一个byte
' E) [* x( i( |4 N/ R; Z/ W    //按照协议格式解析. i% e: i0 c/ i2 C& |; Q% s
    switch(value){
+ h* J: A7 U6 v# D  I* n' y  j    case 0:
" u$ N( P' W4 V$ j+ U! }& L4 l    System.out.println("质数");6 |) b# Q3 p0 l2 u( e: z
    break;3 q* w3 [/ C; a
    case 1:
1 O! \7 z( o2 j    System.out.println("不是质数");5 `6 `& S3 Z; l* w( h# s
    break;7 o" y6 ]/ ~% _
    case 2:
; X) P5 X# K  T    System.out.println("协议格式错误");
& S4 r0 c6 v, G9 T5 _# w! H: k, @    break;
) j6 A, e1 V9 x$ V$ V" i    }  N" K4 X! K, c0 U% U6 I
    }
1 g! ~) N$ ]: v! J8 m/ C# F, `" }    /**
& t8 k" c9 s) w4 T    * 关闭流和连接; B; V# R7 b5 b# _
    */
2 p8 L1 l4 x# t% m8 k. i3 W6 b! e    private static void close(){
* Q+ Z7 @( p  G4 A    try{
# H, f2 ?7 M7 O: h, p$ @    br.close();, u( f& E3 D/ E8 J
    is.close();' N% F# [. u' e, O0 T% o' U
    os.close();" s& t/ p2 s4 F. Q
    socket.close();
7 O3 k) D/ \$ N* K    }catch(Exception e){& f# W0 z$ z8 q/ u9 A
    e.printStackTrace();6 H' O! g4 H/ K" E
    }6 p2 T; N. h/ X( Z
    }
5 l5 W& w1 w/ H6 H    }</p>
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-26 11:10 , Processed in 0.187801 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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