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

基於Socket的Java網絡編程集粹

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

  服務器:

  import javaio*;
  import *;

  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 *;
  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 can 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就建立起來了

  以上的代碼使用的是

BufferedReader in=new BufferedReader(new InputStreamReader(clientgetInputStream()));
PrintWriter out=new PrintWriter(clientgetOutputStream());
  還有一種方法是使用

DataInputStream isFromClient = new DataInputStream(clientgetInputStream());
DataOutputStream osToClient = new DataOutputStream(clientgetOutputStream());
  關於這兩種輸入輸出流的不同我也只知道前一種對字符串支持比較好後面對於讀取一個字符串需要處理但是可以支持很多種類型的輸出對於傳遞字符串而言前一種應該是很好的選擇了
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26834.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.