Java Client/Server 基礎知識

Java的網絡類庫支持多種Internet協議,包括Telnet, FTP 和HTTP (WWW),與此相對應的Java網絡類庫的子類庫爲: 

   Java.net 
   Java.net.ftp 
   Java.net.www.content 
   Java.net.www.html 
   Java.net.www.http 

  這些子類庫各自容納了可用於處理Internet協議的類和方法。其中,java.net用於處理一些基本的網絡功能,包括遠程登陸(Telnet);java.net.ftp用於處理ftp協議;java.net.www.content用於處理WWW 頁面內容;java.net.www.html 和java.net.www.http 則分別提供了對HTML 語言和HTTP 協議的支持。 html

客戶機/服務器環境下的Java應用程序 

  客戶機/服務器在分佈處理過程當中,使用基於鏈接的網絡通訊模式。該通訊模式首先在客戶機和服務器之間定義一套通訊協議,並建立一Socket類,利用這個類創建一條可靠的連接;而後,客戶機/服務器再在這條連接上可靠地傳輸數據。客戶機發出請求,服務器監聽來自客戶機的請求,併爲客戶機提供響應服務。這就是典型的"請求-- 應答" 模式。下面是客戶機/服務器的一個典型運做過程: 

  一、服務器監聽相應端口的輸入; 

  二、客戶機發出一個請求; 

  三、服務器接收到此請求; 

  四、服務器處理這個請求,並把結果返回給客戶機; 

  五、重複上述過程,直至完成一次會話過程。 java

按照以上過程,咱們使用Java語言編寫一個分別針對服務器和客戶機的應用程序(Application)。該程序在服務器上時,程序負責監聽客戶機請求,爲每一個客戶機請求創建Socket 鏈接,從而爲客戶機提供服務。本程序提供的服務爲:讀取來自客戶機的一行文本,反轉該文本,並把它發回給客戶機。 
客戶端實例:
服務器

 

public class ClientTest {
  public void starClient(){
  Socket client=null;
  try {
    client = new Socket("192.168.1.122",8080);
    System.out.println("客戶端成功啓動");
    while(true){
      //發送數據到服務器
      Scanner sc = new Scanner(System.in);
      System.out.println("請輸入要發送給服務器的數據:");
      String str = sc.next();
      PrintStream ps= new PrintStream(client.getOutputStream());
      ps.println(str);

       //接受服務器發回來的消息
        InputStream is = client.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String line = br.readLine();
        System.out.println("服務器說 :"+line);
     }


  } catch (UnknownHostException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  } catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  }finally{
  if(client!=null){
  try {
  client.close();
  } catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
   }
  }
}
}
public static void main(String[] args) {
  ClientTest test = new ClientTest();
  test.starClient();
}
}網絡

服務器實例:多線程

public class ServerTest {
public void starServer(){
//建立服務器
ServerSocket server=null;
try {

server = new ServerSocket(5000);
System.out.println("服務器啓動成功");
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
System.out.println("服務器啓動失敗");
}

Socket client = null;
try {


//等待客戶端鏈接
client = server.accept();
while(true){
//獲取客戶端的數據
InputStream is = client.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line = br.readLine();
System.out.println("客戶端說:"+line);

//服務器放送數據給客戶端
PrintStream ps = new PrintStream(client.getOutputStream());
Scanner sc = new Scanner(System.in);
System.out.println("請輸入發送給客戶端的信息");
String str = sc.next();
ps.println(str);
}

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}函數

public static void main(String[] args) {
ServerTest test = new ServerTest();
test.starServer();
}spa

}.net


  經過該程序實例咱們看到,使用Java語言設計C/S程序時須要注意如下幾點: 

  (1)、 服務器應使用ServerSocket 類來處理客戶機的鏈接請求。當客戶機鏈接到服務器所監聽的端口時,ServerSocket將分配一新的Socket 對象。這個新的Socket 對象將鏈接到一些新端口,負責處理與之相對應客戶機的通訊。而後,服務器繼續監聽ServerSocket,處理新的客戶機鏈接。 

  Socket 和ServerSocket 是Java網絡類庫提供的兩個類。 

  (2)、服務器使用了多線程機制。Server對象自己就是一個線程,它的run()方法是一個無限循環,用以監聽來自客戶機的鏈接。每當有一個新的客戶機鏈接時,ServerSocket就會建立一個新的Socket類實例,同時服務器也將建立一新線程,即一個Connection 對象,以處理基於Socket 的通訊。與客戶機的全部通訊均由這個Connection 對象處理。Connection的構造函數將初始化基於Socket 對象的通訊流,並啓動線程的運行。與客戶機 的通訊以及服務的提供,均由Connection對象處理。 

  (3)、客戶機首先建立一Socket對象,用以與服務器通訊。以後需建立兩個對象:DataInputStream 和PrintStream,前者用以從Socket 的InputStream 輸入流中讀取數據,後者則用於往Socket的OutputStream 中寫數據。最後,客戶機程序從標準輸入(如:控制檯)中讀取數據,並把這些數據寫到服務器,在從服務器讀取應答消息,而後把這些應答消息寫到準輸出。 
線程

相關文章
相關標籤/搜索