java的Socket

來源:互聯網
上載者:User

標籤:

java API為我們網路通訊提供了伺服器通訊端ServerSocket類和用戶端通訊端Socket,Socket是網路驅動層提供給應用程式編程的介面和一種機制。下面提供具體實現例子
服務端--ServerSocket     ServerSocket類實現了伺服器的通訊端,主要方法ServerSocket(int port)-----建立綁定到特定連接埠的伺服器通訊端void setSoTimeout(timeout);----指定逾時時間InetAdress getInetAddress()----返回此伺服器通訊端的本機地址Socket accept()--------------偵聽並接受此通訊端的串連
範例程式碼:
  1. package com;  
  2.   
  3. import java.io.BufferedInputStream;  
  4. import java.io.BufferedOutputStream;  
  5. import java.io.IOException;  
  6. import java.net.ServerSocket;  
  7. import java.net.Socket;  
  8.   
  9.   
  10. public class Test {  
  11.   
  12.     public static void main(String[] args) {  
  13.           
  14.         try {  
  15.             ServerSocket server=new ServerSocket(8080);  
  16.             //等待用戶端串連  
  17.             while(true){  
  18.                 Socket client=server.accept();  
  19.                 //每個用戶端建立一個線程  
  20.                 new Thread(new myRunnable(client)).start();;  
  21.             }  
  22.               
  23.         } catch (IOException e) {  
  24.             e.printStackTrace();  
  25.         }  
  26.       
  27.     }  
  28.       
  29. }  
  30.   
  31. class myRunnable implements Runnable{  
  32.       
  33.     private Socket socket;  
  34.       
  35.     public myRunnable(Socket s)  
  36.     {  
  37.         this.socket=s;  
  38.     }  
  39.     //----run方法運行完畢,線程正常結束  
  40.     @Override  
  41.     public void run() {  
  42.           
  43.         try {  
  44.             //接收用戶端資料  
  45.             BufferedInputStream is=new BufferedInputStream(socket.getInputStream());              
  46.             int data=is.read()+1;//把客戶的資料加一  
  47.               
  48.             Thread.sleep(1000);//休眠一秒  
  49.             //輸出到用戶端  
  50.             BufferedOutputStream os=new BufferedOutputStream(socket.getOutputStream());           
  51.             os.write(data);//返回資料給用戶端  
  52.               
  53.             os.close();       
  54.             os.close();  
  55.                           
  56.         } catch (IOException | InterruptedException e) {  
  57.             e.printStackTrace();  
  58.         }  
  59.           
  60.           
  61.     }  
  62.       
  63. }  
複製代碼用戶端----SocketSocket類實現用戶端通訊端,通訊端是兩台機器間通訊的端點,主要方法有
Socket(String host,int port)----建立一個通訊端將其串連到指定主機的指定連接埠號碼InputStream getInputStream()----返回此通訊端的輸入資料流OutputStream getOutputStream()----返回此通訊端的輸出資料流
範例程式碼:
  1. package com;  
  2.   
  3. import java.io.BufferedInputStream;  
  4. import java.io.BufferedOutputStream;  
  5. import java.io.IOException;  
  6. import java.net.Socket;  
  7. import java.net.UnknownHostException;  
  8.   
  9. public class Client {  
  10.   
  11.     public static void main(String[] args) {  
  12.   
  13.         for(int i=0;i<20;i++)  
  14.         {  
  15.   
  16.             try {  
  17.                 Socket socket = new Socket("localhost", 8080);  
  18.                 //輸出到伺服器  
  19.                 BufferedOutputStream os=new BufferedOutputStream(socket.getOutputStream());               
  20.                 os.write(i);              
  21.                 os.flush();  
  22.                 //os.close();不能再這裡關閉流,關閉流會導致socket也關閉  
  23.   
  24.                 // 構建字元緩衝流  
  25.                 BufferedInputStream is=new BufferedInputStream(socket.getInputStream());  
  26.                   
  27.                 int data=is.read();       
  28.                 is.close();  
  29.                   
  30.                 os.close();  
  31.                   
  32.                 System.out.println(data);             
  33.             } catch (UnknownHostException e) {  
  34.                 e.printStackTrace();  
  35.             } catch (IOException e) {  
  36.                 e.printStackTrace();  
  37.             }  
  38.         }  
  39.           
  40.     }  
  41.   
  42. }  
複製代碼主要不能提前關閉輸入輸出資料流,關閉輸入輸出資料流會導致Socket關閉


可以引起網路連接關閉的情況有以下4種:
1.直接調用Socket類的close方法。
2.只要Socket類的InputStream和OutputStream有一個關閉,網路連接自動關閉(必須通過調用InputStream和OutputStream的 close方法關閉流,才能使網路可愛接自動關閉)。
3.在程式退出時網路連接自動關閉。4.將Socket對象設為null或未關閉最使用new Socket(…)建立新對象後,由JVM的記憶體回收行程回收為Socket對象分配的記憶體空間後自動關閉網路連接。
線程池   在處理多個用戶端時是為每一個串連建立一個線程,然而頻繁的線程建立會影響效能,所以我們可以使用線程池來解決頻線程的建立問題。
線程池:線程池是一種預先建立線程的一種技術。線程池在任務還沒到來之前,建立一定數量的線程,放到空閑隊列,然後對這些資源進行複用,減少頻繁的線程建立和銷毀。
        JDK1.5版本後提供了線程池,線程池的頂級介面是Executor,是一個執行工具,線程池的直接介面是ExecutorService,是並發開發中常用的工具類
      要配置一個線程池是比較複雜的,尤其是對於線程池的原理不是很清楚的情況下,很有可能配置的線程池不是較優的,因此在Executors類裡面提供了一些靜態工廠,產生一些常用的線程池。
1. newSingleThreadExecutor
建立一個單線程的線程池。這個線程池只有一個線程在工作,也就是相當於單線程串列執行所有任務。如果這個唯一的線程因為異常結束,那麼會有一個新的線程來替代它。此線程池保證所有任務的執行順序按照任務的提交順序執行。
2. newFixedThreadPool
建立固定大小的線程池。每次提交一個任務就建立一個線程,直到線程達到線程池的最大大小。線程池的大小一旦達到最大值就會保持不變,如果某個線程因為執行異常而結束,那麼線程池會補充一個新線程。
3. newCachedThreadPool
建立一個可快取的線程池。如果線程池的大小超過了處理任務所需要的線程,
那麼就會回收部分空閑(60秒不執行任務)的線程,當任務數增加時,此線程池又可以智能的添加新線程來處理任務。此線程池不會對線程池大小做限制,線程池大小完全依賴於作業系統(或者說JVM)能夠建立的最大線程大小。
4. newScheduledThreadPool建立一個大小無限的線程池。此線程池支援定時以及周期性執行任務的需求。
此時我們在伺服器的用上線程池,使用newFixedThreadPool,代碼改為Java代碼  [url=][/url]
  1. package com;  
  2.   
  3. import java.io.BufferedInputStream;  
  4. import java.io.BufferedOutputStream;  
  5. import java.io.IOException;  
  6. import java.net.ServerSocket;  
  7. import java.net.Socket;  
  8.   
  9. import java.util.concurrent.ExecutorService;  
  10. import java.util.concurrent.Executors;  
  11.   
  12.   
  13. public class Test {  
  14.   
  15.     public static void main(String[] args) {  
  16.           
  17.         try {  
  18.             ServerSocket server=new ServerSocket(8080);  
  19.             //擷取cpu數  
  20.             int cpu_Num=Runtime.getRuntime().availableProcessors();  
  21.             //建立指定大小的線程池  
  22.             ExecutorService es=Executors.newFixedThreadPool(cpu_Num);  
  23.             //等待用戶端串連  
  24.             while(true){  
  25.                 Socket client=server.accept();  
  26.                 //每個用戶端建立一個線程  
  27.                 //new Thread(new myRunnable(client)).start();  
  28.                 es.execute(new myRunnable(client));  
  29.             }  
  30.               
  31.         } catch (IOException e) {  
  32.             e.printStackTrace();  
  33.         }  
  34.       
  35.     }  
  36.       
  37. }  
  38.   
  39. class myRunnable implements Runnable{  
  40.       
  41.     private Socket socket;  
  42.       
  43.     public myRunnable(Socket s)  
  44.     {  
  45.         this.socket=s;  
  46.     }  
  47.     //----run方法運行完畢,線程正常結束  
  48.     @Override  
  49.     public void run() {  
  50.           
  51.         try {  
  52.             //接收用戶端資料  
  53.             BufferedInputStream is=new BufferedInputStream(socket.getInputStream());              
  54.             int data=is.read()+1;//把客戶的資料加一  
  55.               
  56.             Thread.sleep(1000);//休眠一秒  
  57.             //輸出到用戶端  
  58.             BufferedOutputStream os=new BufferedOutputStream(socket.getOutputStream());           
  59.             os.write(data);//返回資料給用戶端  
  60.               
  61.             os.close();       
  62.             os.close();  
  63.                           
  64.         } catch (IOException | InterruptedException e) {  
  65.             e.printStackTrace();  
  66.         }  
  67.           
  68.           
  69.     }  
  70.       
  71. }  
複製代碼這樣雖然現實了並發伺服器,但這樣的伺服器效率低,輸送量低,想提高伺服器效能,可以研究學習java的nio和aio,能大大提升伺服器效能。

java的Socket

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.