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

Java進階 關於Java Socket編程的詳細介紹[2]

2013-11-23 19:37:59  來源: Java核心技術 

  這個程序只是簡單的兩台計算機之間的通訊如果是多個客戶同時訪問一個服務器呢?你可以試著再運行一個客戶端結果是會拋出異常的那麼多個客戶端如何實現呢?

  其實簡單的分析一下就可以看出客戶和服務通訊的主要通道就是Socket本身而服務器通過accept方法就是同意和客戶建立通訊這樣當客戶建立Socket的同時服務器也會使用這一根連線來先後通訊那麼既然如此只要我們存在多條連線就可以了那麼我們的程序可以變為如下

  服務器:

  import javaio*;
  import javanet*;
  public class MyServer {
  public static void main(String[] args) throws IOException{
  ServerSocket server=new ServerSocket();
  while(true){
  Socket client=serveraccept();
  BufferedReader in=new BufferedReader(new InputStreamReader(clientgetInputStream()));
  PrintWriter out=new PrintWriter(clientgetOutputStream());
  while(true){
  String str=inreadLine();
  Systemoutprintln(str);
  outprintln(has receive);
  outflush();
  if(strequals(end))
  break;
  }
  clientclose();
  }
  }
  }

  這裡僅僅只是加了一個外層的While循環這個循環的目的就是當一個客戶進來就為它分配一個Socket直到這個客戶完成一次和服務器的交互這裡也就是接受到客戶的End消息那麼現在就實現了多客戶之間的交互了但是問題又來了這樣做雖然解決了多客戶可是是排隊執行的也就是說當一個客戶和服務器完成一次通訊之後下一個客戶才可以進來和服務器交互無法做到同時服務那麼要如何才能同時達到既能相互之間交流又能同時交流呢?很顯然這是一個並行執行的問題了所以線程是最好的解決方案

  那麼下面的問題是如何使用線程首先要做的事情是創建線程並使得其可以和網絡連線取得聯系然後由線程來執行剛才的操作要創建線程要麼直接繼承Thread要麼實現Runnable接口要建立和Socket的聯系只要傳遞引用就可以了而要執行線程就必須重寫run方法而run方法所做的事情就是剛才單線程版本main所做的事情因此我們的程序變成了這樣

  import javanet*;
  import javaio*;
  public class MultiUser extends Thread{
  private Socket client;
  public MultiUser(Socket c){
  thisclient=c;
  }
  public void run(){
  try{
  BufferedReader in=new BufferedReader(new InputStreamReader(clientgetInputStream()));
  PrintWriter out=new PrintWriter(clientgetOutputStream());
  //Mutil User but cant parallel
  while(true){
  String str=inreadLine();
  Systemoutprintln(str);
  outprintln(has receive);
  outflush();
  if(strequals(end))
  break;
  }
  clientclose();
  }catch(IOException ex){
  }finally{
  }
  }
  public static void main(String[] args)throws IOException{
  ServerSocket server=new ServerSocket();
  while(true){
  //transfer location change Single User or Multi User
  MultiUser mu=new MultiUser(serveraccept());
  mustart();
  }
  }
  }

  我的類直接從Thread類繼承了下來並且通過構造函數傳遞引用和客戶Socket建立了聯系這樣每個線程就有了一個通訊管道同樣我們可以填寫run方法把之前的操作交給線程來完成這樣多客戶並行的Socket就建立起來了

[]  []  


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