a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 141|回复: 2

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

[复制链接]
发表于 2012-8-4 12:44:44 | 显示全部楼层 |阅读模式
该示例实现的功能是质数判断,程序实现的功能为客户端程序接收用户输入的数字,然后将用户输入的内容发送给服务器端,服务器端判断客户端发送的数字是否是质数,并将判断的结果反馈给客户端,客户端根据服务器端的反馈显示判断结果。  M& H/ Q+ ^' {
    质数的规则是:最小的质数是2,只能被1和自身整除的自然数。当用户输入小于2的数字,以及输入的内容不是自然数时,都属于非法输入。
0 L4 j2 S+ x. d& K    网络程序的功能都分为客户端程序和服务器端程序实现,下面先描述一下每个程序分别实现的功能:
1 ~- r. y# U! G, b* ~    1、  客户端程序功能:. [) f, ]; Q7 _6 ?, H" x
    a)         接收用户控制台输入
( C9 _( v* n  g7 i, [0 o" h    b)         判断输入内容是否合法
3 n- v9 F8 G. q% ?/ {    c)         按照协议格式生成发送数据
7 {. P- S% {2 Y5 P8 [9 `( n0 o9 }    d)         发送数据
$ t% h: j; ^- p( S3 F    e)         接收服务器端反馈, i5 C! S4 S! t) x
    f)          解析服务器端反馈信息,并输出
( c. t9 x! z; e( b5 X( j( v8 s' c% M    2、  服务器端程序功能:
; C! C/ {$ m6 S: J5 |5 u    a)         接收客户端发送数据
6 O! W5 m% q+ p5 o$ L0 f    b)         按照协议格式解析数据, Z' n- `! `" |; m' \0 b
    c)         判断数字是否是质数) k& x2 X" p: |4 m9 E. a$ ~
    d)         根据判断结果,生成协议数据6 w  [8 `+ N7 k
    e)         将数据反馈给客户端
2 h5 u  g" Z* u- s3 b    分解好了网络程序的功能以后,就可以设计网络协议格式了,如果该程序的功能比较简单,所以设计出的协议格式也不复杂。
& n! S: h$ M+ n- c0 y8 w4 J$ A    客户端发送协议格式:
  F: J- N6 k* {2 [1 Z    将用户输入的数字转换为字符串,再将字符串转换为byte数组即可。" z: F$ x3 v/ g5 r+ G
    例如用户输入16,则转换为字符串“16”,使用getBytes转换为byte数组。
4 l& S8 c7 ?: ]1 Y' e. T  G    客户端发送“quit”字符串代表结束连接' ?- g# Q, O* E. M( O) S0 m' S7 E
    服务器端发送协议格式:
+ s5 q5 M+ o: q1 p3 V0 T    反馈数据长度为1个字节。数字0代表是质数,1代表不是质数,2代表协议格式错误。$ F2 X/ x. x, {4 w
    例如客户端发送数字12,则反馈1,发送13则反馈0,发送0则反馈2。
0 R! \4 k2 L# J6 H+ U/ p- k6 _2 Z& _    功能设计完成以后,就可以分别进行客户端和服务器端程序的编写了,在编写完成以后联合起来进行调试即可。- Z- u4 ~4 O# j2 ~6 s
    下面分别以TCP方式和UDP方式实现该程序,注意其实现上的差异。不管使用哪种方式实现,客户端都可以多次输入数据进行判断。对于UDP方式来说,不需要向服务器端发送quit字符串。
% w8 X  Z5 C/ X    以TCP方式实现的客户端程序代码如下:
5 J% i% c# r5 V0 z    package example1;
. L# P6 f5 i* v4 B% m) h( u    import java.io.*;
, C" Y" \7 n- H3 m% s) X    import java.net.*;
5 G3 r$ W4 K1 S1 O$ ]1 ^9 j' ^4 z    /**# ^; t: u3 W8 a# e% d+ i+ C8 |
    * 以TCP方式实现的质数判断客户端程序6 _  X( N& I( G' u
    */, H+ V& Z+ P% p# L; `+ R
    public class TCPPrimeClient {6 q1 z7 O6 A% X1 V
    static BufferedReader br;% y3 \- Z! Z* N# H! d- H
    static Socket socket;6 X/ C" Y& f3 a' w- I
    static InputStream is;
# W6 [& w2 V( t* }- R  h    static OutputStream os;( E& I6 u2 I0 T# S& x* W& }
    /**服务器IP*/+ n4 H. @+ L+ d
    final static String HOST = "127.0.0.1";* Q8 Z1 B. v8 ]) ^8 R  C
    /**服务器端端口*/
- M5 j8 n5 u. u* y% P    final static int PORT = 10005;
0 Y. U# g4 T1 f    public static void main(String[] args) {
* R" P8 V+ n- j; T3 s    init(); //初始化6 B3 @# D( _6 i. [9 ~
    while(true){0 _) z( v  V( W% e4 k% A+ r2 f/ k
    System.out.println("请输入数字:");
- G# g0 O( X% q/ E3 s/ R% A2 R3 f' _    String input = readInput(); //读取输入+ G7 z; M" ~/ G4 m+ Z. U
    if(isQuit(input)){ //判读是否结束
7 M3 I9 u: X+ z, Z2 q+ S9 t    byte[] b = "quit".getBytes();1 {2 ^' A% J! r
    send(b);2 C- P  K& M/ j" ~, Q2 _* g
    break; //结束程序
回复

使用道具 举报

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

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

}
; r0 a9 i# H8 N; t, G" c    if(checkInput(input)){ //校验合法' d$ x% l$ i& a7 ?3 C+ U; T5 D
    //发送数据
* ]: u/ m7 D$ E# V- r. l4 c! P    send(input.getBytes());# z4 b5 K, v  a; ]
    //接收数据
; l& a1 v- @1 [, u" g+ Q    byte[] data = receive();
, h' z9 p/ C1 l% j0 i; N* R' h$ m    //解析反馈数据  c. k  i8 [0 w/ k  K
    parse(data);
9 d8 E3 B- h" g1 b; ]$ p    }else{( T5 ~, Y# H  r9 m# y4 a0 V+ x
    System.out.println("输入不合法,请重新输入!");
' j- R1 B+ E5 K3 W4 ?( v    }; u3 E3 _# ?2 f& e$ l1 g
    }
6 ^4 r9 S& f- U- n! m    close();  //关闭流和连接  u5 @% W6 r  R4 d; y+ D7 T8 M
    }
$ S$ ^, ^2 j$ r- v    /**- u4 U) c( W4 G7 A
    * 初始化
* [  U2 B8 N% P    */& x% ^  |+ ^% i! K1 `5 d! ~
    private static void init(){% D- d. g7 V: K3 h8 k
    try {
6 S! S8 _+ ]  r. w9 n    br = new BufferedReader(
) |! J: J6 B) J# Q/ N4 p    new InputStreamReader(System.in));5 f3 n8 N0 ]5 n' n
    socket = new Socket(HOST,PORT);
$ [2 C/ _; H8 e    is = socket.getInputStream();: d/ x6 B! e7 q  \! m
    os = socket.getOutputStream();
7 u$ N% {+ G& b    } catch (Exception e) {}. p$ {5 ]8 R6 h5 Q' x% [/ j
    }. k3 a7 Y; d8 ^6 P4 u: [
    /**. O2 n5 e) @" y; C7 V
    * 读取客户端输入7 B' D* o+ g$ P' d# G) n
    */) o5 }0 j  R" t, |* K
    private static String readInput(){
3 T/ \2 M5 }7 @- n. j' t. r    try {" r: R& o* \; X+ e& I4 m% ^' i! u
    return br.readLine();
  x, O% s, F# T4 [$ z7 M' x# x    } catch (Exception e) {
' W" d3 W/ F! {" H- ]& p- _) k    return null;, m/ f: G+ v1 }0 y; D. X. |
    }" C( G; Z3 e" K" G2 J3 a
    }
6 v( a/ c  }8 X0 x+ @( ?    /**# C+ ~5 g( i) {0 f% [4 c9 e7 Z: B
    * 判断是否输入quit+ ~: \7 p* A0 i( k7 [1 B5 _
    * @param input 输入内容. z$ S1 B$ l' f2 z
    * @return true代表结束,false代表不结束1 D  [8 d. ]5 n4 M+ I# z: G- d
    */
5 O" r7 s" v# S% [% u    private static boolean isQuit(String input){
0 P2 {2 R' u+ [, B1 j  A% _, m    if(input == null){& ]  P" Y5 [6 b8 [* k
    return false;' B' \, M6 \+ X& Y$ j" E  X# [
    }else{
! o3 q. z* @; w5 Y- v1 ?    if("quit".equalsIgnoreCase(input)){
& P/ Z$ ]$ w: X% w6 C. Z, P    return true;1 [  K$ J  i& o5 e
    }else{
6 D3 K2 h# f* H1 d& W% w    return false;+ l# N2 J8 D: N) t8 N) R
    }, p$ s) D: y% p$ \) n! R" Q, [4 y
    }
% g; R# H% I7 [% Y    }
+ E; V( w1 t$ U; ]4 c8 a. K7 K. u    /**' F. o+ m* T* l: I
    * 校验输入7 s/ i$ D5 S1 @# `- q
    * @param input 用户输入内容
% `6 z$ n* K! L6 V    * @return true代表输入符合要求,false代表不符合
$ q- E7 B- m: |& ]. x. @! ^    */
3 K  x" C0 P: V  j2 ~6 A    private static boolean checkInput(String input){
! s9 N7 X& `3 C( P  Y$ e    if(input == null){
1 z' c+ _  q0 ~$ N& g; z    return false;" f* ?" ]* `% Q5 Q
    }  D/ A% z$ |/ r5 ^1 }7 f! f
    try{
0 {3 F# D: G0 C4 g9 k* D2 d    int n = Integer.parseInt(input);
# \# s$ i. O6 {  i5 \4 U    if(n >= 2){
8 C  M( |" Z6 @  I    return true;
4 O' N+ Q* B+ v1 M4 j+ p( c" _    }else{" U, E3 k( J( c6 B* v% H
    return false;
' t  n* m* D# `* g) s    }
% y0 @+ C) M) d+ W9 ]- O1 \    }catch(Exception e){! P( m- g6 j% y$ O* E& N
    return false;  //输入不是整数
' }0 N$ X8 A' J' D. V8 M    }
4 ?2 g5 V% q, s4 ?    }
: c% l2 @; x5 X, k7 G8 {) Q    /**
回复 支持 反对

使用道具 举报

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

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

* 向服务器端发送数据
$ [# _3 _* N! O9 B1 b+ B    * @param data 数据内容
  L" Q! F: y# G9 V" U- u5 w    */" N0 y! ^" W7 ]5 Q$ I$ b4 G
    private static void send(byte[] data){1 m+ K  N$ W/ q- }1 D/ d& i/ l
    try{( f- C1 s  v$ W, b1 i3 |/ G
    os.write(data);
/ J  u& |: C) l    }catch(Exception e){}
, D! V9 h$ _6 C, \5 q' c    }1 p" t' w! [1 L+ N; r# [5 S$ K
    /**4 R( k. Q! u& j( t# t
    * 接收服务器端反馈# i' y) K) j/ X+ x" U& ]
    * @return 反馈数据
  p% o8 t& {) P/ S* y1 `- A* g/ ~9 J    */
1 r" z: ]! c. E& m8 G: F7 h    private static byte[] receive(){2 W$ }: N1 a) q8 U2 X5 ~
    byte[] b = new byte[1024];
4 W+ L% h% B( U' M    try {& u1 _& D/ c& v
    int n = is.read(b);+ w  r7 Y. ]( E; O
    byte[] data = new byte[n];$ b( Z& ^" R& K9 ~
    //复制有效数据
( g# e1 \9 D# U5 b. t# a" m    System.arraycopy(b, 0, data, 0, n);8 r: S1 a; T0 R1 E- G( x+ s, N1 |
    return data;- [+ ^4 b8 y( n4 D  k# {+ L4 \
    } catch (Exception e){}" W, S; Q* @+ _4 w% J' ]' b3 j& {
    return null;1 h4 o$ Y: }' I% ~2 q. x5 _2 M4 p
    }- k/ k; [8 @: Y  _
    /**
6 j# a2 p" h7 y+ g/ J    * 解析协议数据8 q# ]2 b9 k5 \( h1 E2 E8 A1 }* B
    * @param data 协议数据
# _* p5 ?6 [/ J7 L    */
9 T# F. \5 W" A% e0 G  E    private static void parse(byte[] data){% `, e2 f4 G  H+ x
    if(data == null){
8 o) S5 T2 o3 Q8 o; M# H    System.out.println("服务器端反馈数据不正确!");, E+ z- U2 |  V- y9 \; ~/ C
    return;
" C# {+ F& M* Z) s  v    }
* r  G! q$ P6 t# k# i) \6 N    byte value = data[0]; //取第一个byte
6 l) K2 Z! t! J1 F% |3 T" T    //按照协议格式解析
" V% R5 {8 ?0 O    switch(value){3 t! i& x$ g8 k: G" Z4 E( j/ P
    case 0:
' ]" P; a3 Y& Z  o* }& S8 t    System.out.println("质数");& e4 j$ h& Z3 p9 j7 @# ]0 @2 B, u
    break;
) ?, T# a. E( u    case 1:7 W, }7 A- S: l2 ~5 L: {
    System.out.println("不是质数");: s" M' }& O6 K5 i) o
    break;4 ^; R( S1 n2 }3 |  q
    case 2:
8 K+ R$ c: c" w3 P    System.out.println("协议格式错误");
% r( z: Q# O8 r8 ^' Q* K  A    break;1 d: d$ `) F% A2 x8 _
    }
$ u4 Z* Y8 u$ O' [    }6 M% _2 ^2 L: O+ O" u: l+ [7 }
    /**
; c3 Z# x( O: ?; _; z    * 关闭流和连接
6 Z7 H7 M$ E2 i7 [    */
2 b" N0 ~! _5 `+ b+ ?/ P    private static void close(){+ ^! y, c% ]% t* \
    try{4 [3 R( U, S7 `
    br.close();
9 s+ l/ N' b4 {' U2 [    is.close();
7 V7 H8 {( X+ ^    os.close();
3 X1 D7 {  p3 B. V, |! B+ t    socket.close();
) a; I9 c% }7 l- }; B% k! l3 ^    }catch(Exception e){- L) y$ b' a3 b$ W1 |
    e.printStackTrace();
# E% N* K$ ^! k" X% R    }
; ~0 ]) q8 H$ X, p: J0 v- U( P    }5 _0 c$ ]. z$ ~
    }
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-7 01:23 , Processed in 0.314956 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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