天天看點

Java Socket程式設計

對于Java Socket程式設計而言,有兩個概念,一個是ServerSocket,一個是Socket。服務端和用戶端之間通過Socket建立連接配接,之後它們就可以進行通信了。首先ServerSocket将在服務端監聽某個端口,當發現用戶端有Socket來試圖連接配接它時,它會accept該Socket的連接配接請求,同時在服務端建立一個對應的Socket與之進行通信。這樣就有兩個Socket了,用戶端和服務端各一個。

       服務端代碼

Java代碼 public class Server {   

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

      //為了簡單起見,所有的異常資訊都往外抛   

      int port = 8899;   

      //定義一個ServerSocket監聽在端口8899上   

      ServerSocket server = new ServerSocket(port);   

      //server嘗試接收其他Socket的連接配接請求,server的accept方法是阻塞式的   

      Socket socket = server.accept();   

      //跟用戶端建立好連接配接之後,我們就可以擷取socket的InputStream,并從中讀取用戶端發過來的資訊了。   

      Reader reader = new InputStreamReader(socket.getInputStream());   

      char chars[] = new char[64];   

      int len;   

      StringBuilder sb = new StringBuilder();   

      while ((len=reader.read(chars)) != -1) {   

         sb.append(new String(chars, 0, len));   

      }   

      System.out.println("from client: " + sb);   

      reader.close();   

      socket.close();   

      server.close();   

   }   

}  

服務端從Socket的InputStream中讀取資料的操作也是阻塞式的,如果從輸入流中沒有讀取到資料程式會一直在那裡不動,直到用戶端往Socket的輸出流中寫入了資料,或關閉了Socket的輸出流。當然,對于用戶端的Socket也是同樣如此。在操作完以後,整個程式結束前記得關閉對應的資源,即關閉對應的IO流和Socket。

       用戶端代碼

Java代碼

public class Client {   

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

      //為了簡單起見,所有的異常都直接往外抛   

      String host = "127.0.0.1";  //要連接配接的服務端IP位址   

      int port = 8899;   //要連接配接的服務端對應的監聽端口   

      //與服務端建立連接配接   

      Socket client = new Socket(host, port);   

      //建立連接配接後就可以往服務端寫資料了   

      Writer writer = new OutputStreamWriter(client.getOutputStream());   

      writer.write("Hello Server.");   

      writer.flush();//寫完後要記得flush   

      writer.close();   

      client.close();   

對于用戶端往Socket的輸出流裡面寫資料傳遞給服務端要注意一點,如果寫操作之後程式不是對應着輸出流的關閉,而是進行其他阻塞式的操作(比如從輸入流裡面讀資料),記住要flush一下,隻有這樣服務端才能收到用戶端發送的資料,否則可能會引起兩邊無限的互相等待。在稍後講到用戶端和服務端同時讀和寫的時候會說到這個問題。

本文轉自楊海龍的部落格部落格51CTO部落格,原文連結http://blog.51cto.com/7218743/1529869如需轉載請自行聯系原作者

IT達仁