qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          Java實現簡單的server/client回顯功能

          Socket是指在一個特定編程模型下,進程間通信鏈路的端點。因為這個特定編程模型的流行,Socket這個名字在其他領域得到了復用,包括Java叫技術。

            如果要建立連接,一臺機器必須運行一個進程來等待連接,而另一臺機器必須試圖到達第一臺機器。這個電話系統類似:一方必須發起呼叫,而另一方在此時必須等待電話呼叫。

            java網絡模型圖

            下面通過一個有“回顯”功能的服務器和客戶端來介紹應用java.net包編寫網絡應用程序。

            這個例子主要功能是服務器端的程序等待客戶的輸入,然后將讀取到的信息回顯給客戶端,同時在服務器端的控制臺輸出。而客戶端從控制臺接收信息后,向客戶端發送輸入,并接收服務器的回顯數據,然后顯示在控制臺。

            客戶端程序代碼如下:

          package com.javapp.ch11;
           import java.io.*;
           import java.net.*;
           /**
           * Description: 具有“回顯”功能的服務器端和客戶端程序
           */
           public class EchoClientDemo {
               // 服務器端的服務端口。
               public static final int SERVERPORT = 990;
               public static void main(String[] args) {
                   try {
                       // 建立連接套接字。
                       Socket s = new Socket("localhost",SERVERPORT);
                       System.out.println("socket = " + s);
                       // 新建網絡連接的輸入流。
                       BufferedReader in = new BufferedReader(new InputStreamReader(s
                               .getInputStream()));
                       // 新建網絡連接的自動刷新的輸出流。
                       PrintWriter out = new PrintWriter(new BufferedWriter(
                               new OutputStreamWriter(s.getOutputStream())),true);
                       // 先使用System.in構造InputStreamReader,再構造BufferedReader。
                       BufferedReader stdin = new BufferedReader(
                               new InputStreamReader(System.in));
                       System.out.println("Enter a string, Enter BYE to exit! ");
                       while (true) {
                           // 讀取從控制臺輸入的字符串,并向網絡連接輸出,即向服務器端發送數據。
                           out.println(stdin.readLine());
                           // 從網絡連接讀取一行,即接收服務器端的數據。
                           String str = in.readLine();
                   // 如果接收到的數據為空(如果直接按Enter,不是空數據),則退出循環,關閉連接。
                           if (str == null) {
                               break;
                           }
                           System.out.println(str);
                       }
                       s.close();
                   } catch (IOException e) {
                       System.err.println("IOException" + e.getMessage());
                   }
               }
           }
           上面客戶端程序中。首先用java.net包中的Socket類建立一個連接套接字,其后應用的Socket對象的getInputStream 方法從服務器接收數據,并且應用Socket對象的getOuputStream方法發送數據到服務器。創建完輸入輸出流,就可以像讀寫文件的方式來讀寫 數據。

            支持多客戶端的“回顯”服務器端程序代碼如下:

          package com.javapp.ch11;
           import java.io.*;
           import java.net.*;
           /**
           * Description:支持多客戶端的“回顯”服務器端程序
           */
           public class EchoServerThreadDemo {
               // 服務器端的服務端口。
               public static final int SERVERPORT = 990;
               public static void main(String[] args) {
                   try {
                       // 已經連接上的客戶端的序號。
                       int number = 1;
                       // 建立服務器端傾聽套接字。
                       ServerSocket s = new ServerSocket(SERVERPORT);
                       System.out.println("Started: " + s);
                       while (true) {
                           // 等待并接收請求,建立連接套接字。
                           Socket incoming = s.accept();
                           System.out.println("Connection " + number + " accepted: ");
                           System.out.println(incoming);
                           // 啟動一個線程來進行服務器端和客戶端的數據傳輸。
                           // 主程序繼續監聽是否有請求到來。
                           Thread t = new EchoThread(incoming,number);
                           t.start();
                           number++;
                       }
                   } catch (IOException e) {
                       System.err.println("IOException");
                   }
               }
           }
           class EchoThread extends Thread {
               private Socket s;
               int n;
               public EchoThread(Socket incoming,int number) {
                   s = incoming;
                   n = number;
               }
               public void run() {
                   try {
                       // 新建網絡連接的輸入流。
                       BufferedReader in = new BufferedReader(new InputStreamReader(s
                               .getInputStream()));
                       // 新建網絡連接的自動刷新的輸出流。
                       PrintWriter out = new PrintWriter(new BufferedWriter(
                               new OutputStreamWriter(s.getOutputStream())),true);
                       System.out.println("Hello! Enter BYE to exit.");
                       // 回顯客戶端的輸入。
                       while (true) {
                           // 從網絡連接讀取一行,即接收客戶端的數據。
                           String line = in.readLine();
                   // 如果接收到的數據為空(如果直接按Enter,不是空數據),則退出循環,關閉連接。
                           if (line == null) {
                               break;
                           } else {
                               if (line.trim().equals("BYE")) {
                                   System.out.println("The client " + n + " entered BYE!");
                                   System.out.println("Connection " + n + " will be closed!");
                                   break;
                               }
                               System.out.println("Echo " + n + ": " + line);
                               // 向網絡連接輸出一行,即向客戶端發送數據。
                               out.println("Echo " + n + ": " + line);
                           }
                       }
                       // 關閉套接字。
                       s.close();
                   } catch (IOException e) {
                       System.err.println("IOException");
                   }
               }
           }

            在服務器端程序中,首先用java.net包中的ServerSocket類創建一個服務器端偵聽套接字。其后應用ServerSocket類 的accept方法等待并接收用戶請求。當服務器每接收到一個連接請求后,就啟動一個線程來單獨處理服務器和客戶端的數據傳輸。服務器端數據的接收和發送 與上面介紹的客戶端數據的發送和介紹相同。

          posted on 2013-05-24 10:31 順其自然EVO 閱讀(204) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2013年5月>
          2829301234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 吉首市| 望谟县| 泽州县| 任丘市| 高雄市| 吴桥县| 宜宾县| 大田县| 桑植县| 营口市| 唐海县| 徐州市| 永州市| 沙雅县| 泾川县| 镇原县| 金川县| 黄梅县| 上饶市| 葫芦岛市| 新竹市| 正阳县| 甘南县| 革吉县| 石城县| 遵化市| 大足县| 潜山县| 专栏| 恩平市| 兴仁县| 阿勒泰市| 曲麻莱县| 岳阳县| 宾川县| 廊坊市| 秦皇岛市| 鱼台县| 尼木县| 沾益县| 织金县|