熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

網絡編程 質數判別示例

2013-11-23 18:47:56  來源: Java核心技術 
    該示例實現的功能是質數判斷程序實現的功能為客戶端程序接收用戶輸入的數字然後將用戶輸入的內容發送給服務器端服務器端判斷客戶端發送的數字是否是質數並將判斷的結果反饋給客戶端客戶端根據服務器端的反饋顯示判斷結果
    質數的規則是最小的質數是只能被和自身整除的自然數當用戶輸入小於的數字以及輸入的內容不是自然數時都屬於非法輸入
    網絡程序的功能都分為客戶端程序和服務器端程序實現下面先描述一下每個程序分別實現的功能
      客戶端程序功能
    a)         接收用戶控制台輸入
    b)         判斷輸入內容是否合法
    c)         按照協議格式生成發送數據
    d)         發送數據
    e)         接收服務器端反饋
    f)          解析服務器端反饋信息並輸出
      服務器端程序功能
    a)         接收客戶端發送數據
    b)         按照協議格式解析數據
    c)         判斷數字是否是質數
    d)         根據判斷結果生成協議數據
    e)         將數據反饋給客戶端
    分解好了網絡程序的功能以後就可以設計網絡協議格式了如果該程序的功能比較簡單所以設計出的協議格式也不復雜
    客戶端發送協議格式
    將用戶輸入的數字轉換為字符串再將字符串轉換為byte數組即可
    例如用戶輸入則轉換為字符串使用getBytes轉換為byte數組
    客戶端發送quit字符串代表結束連接
    服務器端發送協議格式
    反饋數據長度為個字節數字代表是質數代表不是質數代表協議格式錯誤
    例如客戶端發送數字則反饋發送則反饋發送則反饋
    功能設計完成以後就可以分別進行客戶端和服務器端程序的編寫了在編寫完成以後聯合起來進行調試即可
    下面分別以TCP方式和UDP方式實現該程序注意其實現上的差異不管使用哪種方式實現客戶端都可以多次輸入數據進行判斷對於UDP方式來說不需要向服務器端發送quit字符串
    以TCP方式實現的客戶端程序代碼如下
    package example;
    import javaio*;
    import *;
    /**
    * 以TCP方式實現的質數判斷客戶端程序
    */
    public class TCPPrimeClient {
    static BufferedReader br;
    static Socket socket;
    static InputStream is;
    static OutputStream os;
    /**服務器IP*/
    final static String HOST = ;
    /**服務器端端口*/
    final static int PORT = ;
    public static void main(String[] args) {
    init() //初始化
    while(true){
    Systemoutprintln(請輸入數字
    String input = readInput() //讀取輸入
    if(isQuit(input)){ //判讀是否結束
    byte[] b = quitgetBytes()
    send(b)
    break; //結束程序
    }
    if(checkInput(input)){ //校驗合法
    //發送數據
    send(inputgetBytes())
    //接收數據
    byte[] data = receive()
    //解析反饋數據
    parse(data)
    }else{
    Systemoutprintln(輸入不合法請重新輸入!
    }
    }
    close()  //關閉流和連接
    }
    /**
    * 初始化
    */
    private static void init(){
    try {
    br = new BufferedReader(
    new InputStreamReader(Systemin))
    socket = new Socket(HOSTPORT)
    is = socketgetInputStream()
    os = socketgetOutputStream()
    } catch (Exception e) {}
    }
    /**
    * 讀取客戶端輸入
    */
    private static String readInput(){
    try {
    return brreadLine()
    } catch (Exception e) {
    return null;
    }
    }
    /**
    * 判斷是否輸入quit
    * @param input 輸入內容
    * @return true代表結束false代表不結束
    */
    private static boolean isQuit(String input){
    if(input == null){
    return false;
    }else{
    if(quitequalsIgnoreCase(input)){
    return true;
    }else{
    return false;
    }
    }
    }
    /**
    * 校驗輸入
    * @param input 用戶輸入內容
    * @return true代表輸入符合要求false代表不符合
    */
    private static boolean checkInput(String input){
    if(input == null){
    return false;
    }
    try{
    int n = IntegerparseInt(input)
    if(n >= ){
    return true;
    }else{
    return false;
    }
    }catch(Exception e){
    return false;  //輸入不是整數
    }
    }
    /**
    * 向服務器端發送數據
    * @param data 數據內容
    */
    private static void send(byte[] data){
    try{
    oswrite(data)
    }catch(Exception e){}
    }
    /**
    * 接收服務器端反饋
    * @return 反饋數據
    */
    private static byte[] receive(){
    byte[] b = new byte[];
    try {
    int n = isread(b)
    byte[] data = new byte[n];
    //復制有效數據
    Systemarraycopy(b data n)
    return data;
    } catch (Exception e){}
    return null;
    }
    /**
    * 解析協議數據
    * @param data 協議數據
    */
    private static void parse(byte[] data){
    if(data == null){
    Systemoutprintln(服務器端反饋數據不正確!
    return;
    }
    byte value = data[]; //取第一個byte
    //按照協議格式解析
    switch(value){
    case :
    Systemoutprintln(質數
    break;
    case :
    Systemoutprintln(不是質數
    break;
    case :
    Systemoutprintln(協議格式錯誤
    break;
    }
    }
    /**
    * 關閉流和連接
    */
    private static void close(){
    try{
    brclose()
    isclose()
    osclose()
    socketclose()
    }catch(Exception e){
    eprintStackTrace()
    }
    }
    }


    在該代碼中將程序的功能使用方法進行組織使得結構比較清晰核心的邏輯流程在main方法中實現
    以TCP方式實現的服務器端的代碼如下
    package example;
    import *;
    /**
    * 以TCP方式實現的質數判別服務器端
    */
    public class TCPPrimeServer {
    public static void main(String[] args) {
    final int PORT = ;
    ServerSocket ss  = null;
    try {
    ss = new ServerSocket(PORT)
    Systemoutprintln(服務器端已啟動
    while(true){
    Socket s = ssaccept()
    new PrimeLogicThread(s)
    }
    } catch (Exception e) {}
    finally{
    try {
    ssclose()
    } catch (Exception e) {}
    }
    }
    }
    package example;
    import javaio*;
    import *;
    /**
    * 實現質數判別邏輯的線程
    */
    public class PrimeLogicThread extends Thread {
    Socket socket;
    InputStream is;
    OutputStream os;
    public PrimeLogicThread(Socket socket){
    thissocket = socket;
    init()
    start()
    }
    /**
    * 初始化
    */
    private void init(){
    try{
    is = socketgetInputStream()
    os = socketgetOutputStream()
    }catch(Exception e){}
    }
    public void run(){
    while(true){
    //接收客戶端反饋
    byte[] data = receive()
    //判斷是否是退出
    if(isQuit(data)){
    break;  //結束循環
    }
    //邏輯處理
    byte[] b = logic(data)
    //反饋數據
    send(b)
    }
    close()
    }
    /**
    * 接收客戶端數據
    * @return 客戶端發送的數據
    */
    private  byte[] receive(){
    byte[] b = new byte[];
    try {
    int n = isread(b)
    byte[] data = new byte[n];
    //復制有效數據
    Systemarraycopy(b data n)
    return data;
    } catch (Exception e){}
    return null;
    }
    /**
    * 向客戶端發送數據
    * @param data 數據內容
    */
    private void send(byte[] data){
    try{
    oswrite(data)
    }catch(Exception e){}
    }
    /**
    * 判斷是否是quit
    * @return 是返回true否則返回false
    */
    private boolean isQuit(byte[] data){
    if(data == null){
    return false;
    }else{
    String s = new String(data)
    if(sequalsIgnoreCase(quit)){
    return true;
    }else{
    return false;
    }
    }
    }
    private byte[] logic(byte[] data){
    //反饋數組
    byte[] b = new byte[];
    //校驗參數
    if(data == null){
    b[] = ;
    return b;
    }
    try{
    //轉換為數字
    String s = new String(data)
    int n = IntegerparseInt(s)
    //判斷是否是質數
    if(n >= ){
    boolean flag = isPrime(n)
    if(flag){
    b[] = ;
    }else{
    b[] = ;
    }
    }else{
    b[] = ;  //格式錯誤
    Systemoutprintln(n)
    }
    }catch(Exception e){
    eprintStackTrace()
    b[] = ;
    }
    return b;
    }
    /**
    *
    * @param n
    * @return
    */
    private boolean isPrime(int n){
    boolean b = true;
    for(int i = ;i <= Mathsqrt(n)i++){
    if(n % i == ){
    b = false;
    break;
    }
    }
    return b;
    }
    /**
    * 關閉連接
    */
    private void close(){
    try {
    isclose()
    osclose()
    socketclose()
    } catch (Exception e){}
    }
    }
    本示例使用的服務器端的結構和前面示例中的結構一致只是邏輯線程的實現相對來說要復雜一些在線程類中的logic方法中實現了服務器端邏輯根據客戶端發送過來的數據判斷是否是質數然後根據判斷結果按照協議格式要求生成客戶端反饋數據實現服務器端要求的功能


From:http://tw.wingwit.com/Article/program/Java/hx/201311/25745.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.