程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 基於Socket的Java網絡編程集粹

基於Socket的Java網絡編程集粹

編輯:關於JAVA

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

  服務器:

  import Java.io.*;

  import Java.Net.*;

  public class MyServer {

  public static void main(String[] args) throws IOException{

  ServerSocket server=new ServerSocket(5678);

  while(true){

  Socket clIEnt=server.accept();

  BufferedReader in=new BufferedReader(new InputStreamReader(clIEnt.getInputStream()));

  PrintWriter out=new PrintWriter(clIEnt.getOutputStream());

  while(true){

  String str=in.readLine();

  System.out.println(str);

  out.println("has receive....");

  out.flush();

  if(str.equals("end"))

  break;

  }

  clIEnt.close();

  }

  }

  }

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

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

  import Java.Net.*;

  import Java.io.*;

  public class MultiUser extends Thread{

  private Socket clIEnt;

  public MultiUser(Socket c){

  this.clIEnt=c;

  }

  public void run(){

  try{

  BufferedReader in=new BufferedReader(new InputStreamReader(clIEnt.getInputStream()));

  PrintWriter out=new PrintWriter(clIEnt.getOutputStream());

  //Mutil User but can parallel

  while(true){

  String str=in.readLine();

  System.out.println(str);

  out.println("has receive....");

  out.flush();

  if(str.equals("end"))

  break;

  }

  clIEnt.close();

  }catch(IOException ex){

  }finally{

  }

  }

  public static void main(String[] args)throws IOException{

  ServerSocket server=new ServerSocket(5678);

  while(true){

  //transfer location change Single User or Multi User

  MultiUser mu=new MultiUser(server.accept());

  mu.start();

  }

  }

  }

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

  以上的代碼使用的是

  BufferedReader in=new BufferedReader(new InputStreamReader(clIEnt.getInputStream()));

  PrintWriter out=new PrintWriter(clIEnt.getOutputStream());

  還有一種方法是使用

  DataInputStream isFromClient = new DataInputStream(clIEnt.getInputStream());

  DataOutputStream osToClient = new DataOutputStream(clIEnt.getOutputStream());

  關於這兩種輸入輸出流的不同,我也只知道前一種對字符串支持比較好,後面對於讀取一個字符串需要處理,但是可以支持很多種類型的輸出。對於傳遞字符串而言前一種應該是很好的選擇了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved