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

淺談Socket編程及Java實現

編輯:關於JAVA

Java是一種可用於進行網絡編程的語言,它提供了兩種功能強大的網絡支持機制:URL訪問網絡資源的類和用Socket通訊的類,來滿足不同的要求。一是URL用於訪問Internet網上資源的應用;另一種是針對client/server(客戶端/服務器)模式的應用以及實現某些特殊的協議的應用,它的通訊過程是基於TCP/IP協議中傳輸層接口socket實現的。本文想簡單的介紹一下Socket編程的Java實現方法。

客戶基於服務器之間使用的大部分通訊組件都是基於socket接口來實現的。Socket是兩個程序之間進行雙向數據傳輸的網絡通訊端點,有一個地址和一個端口號來標識。每個服務程序在提供服務時都要在一個端口進行,而想使用該服務的客戶機也必須連接該端口。Socket因為是基於傳輸層,所以它是比較原始的通訊協議機制。通過Socket的數據表現形式為字節流信息,因此通訊雙方要想完成某項具體的應用則必須按雙方約定的方式進行數據的格式化和解釋,我們可以看出使用Socket編程比較麻煩,但是它具有更強的靈活性和更廣泛的使用領域。

有些朋友會問,客戶機/服務器工作的模式到底是什麼樣的呢?好,下面我想結合一張圖來介紹一下它們的工作模式。

那麼Java應用程序是如何實現上述過程的呢?java.net包中有兩個類Socket和ServerSocket,分別用於在客戶機和服務器上創建Socket通訊。

讓我們先來看看客戶段程序編寫的流程:

1、首先調用Socket類的構造函數,以服務器的指定的IP地址或指定的主機名和指定的端口號為參數,創建一個Socket流,在創建Socket流的過程中包含了向服務器請求建立通訊連接的過程實現。

2、建立了客戶端通訊Socket後。就可以使用Socket的方法getInputStream()和getOutputStream()來創建輸入/輸出流。這樣,使用Socket類後,網絡輸入輸出也轉化為使用流對象的過程。

3、使用輸入輸出流對象的相應方法讀寫字節流數據,因為流連接著通訊所用的Socket,Socket又是和服務器端建立連接的一個端點,因此數據將通過連接從服務器得到或發向服務器。這時我們就可以對字節流數據按客戶端和服務器之間的協議進行處理,完成雙方的通訊任務。

4、待通訊任務完畢後,我們用流對象的close()方法來關閉用於網絡通訊的輸入輸出流,在用Socket對象的close()方法來關閉Socket。

下面,我想通過一個簡單的例子來進一步介紹一下客戶端程序的編寫

代碼一:

import java.io.*;
   import java.net.*;
   public class SocketCommunicationClient
   {
    public static void main(String[] args)
    {
    try{
    Socket clientSocket =new Socket ("mice",9000);//創建一個流Socket並與主機mice上的端口9000相連接
    OutputStream output =clientSocket.getOutputStream();//向此Socket寫入字節的一個輸出流
    DataInputStream input=new DataInputStream(clientSocket.getInputStream());
    file://創建新的數據輸入流以便從指定的輸入流中讀出數據
    int c;
    String response;
    while (( c= System.in.read())!=-1)//從屏幕上接受輸入的字符串,並且分解成一個個字符
     {
     output.write((byte)c);
     if(c=='\n')//如果字符為回車,則輸出字符串緩沖
     {
      output.flush();
      response=input.readLine();
      System.out.println("Communication:"+response);
     }
    }
    output.close();
    input.close();
    clientSocket.close();
    } catch (Exception e){
     System.err.println("Exception :"+e);
    }
   }
   }

這個程序是一個非常的簡單的數據通訊的例子,程序先創建了一個Socket並和主機mice上的端口9000相連接,然後打開輸入輸出流,接著程序從標准輸入接收字符並寫入流中,每寫滿一行(以用戶鍵入回車為標志),就把緩沖區中的字符串送往mice上的服務器端程序進行處理,等待服務器端的應答。input.readLine()方法調用將導致程序停滯直到收到應答信息,程序將一直重復這個過程,直到用戶輸入中止符。最後程序要關閉socket輸入輸出流,在關閉socket和服務器端的連接。

上面我們看了如何使用Java編寫客戶端的Socket接口程序,下面我也想簡要的談一談服務器端的Socket接口程序的Java實現方法,其過程如下所述:

1、首先調用ServerSocket類以某個端口號為參數,創建一個ServerSocket對象,即是服務器端的服務程序在該指定端口監聽的Socket。

2、服務器端程序使用ServerSocket對象的accept()方法,接收來自客戶機程序的連接請求,此時服務器端將一直保持停滯狀態,直到收到客戶端發來的連接請求,此時該方法將返回一個新建的Socket類的實例,代表和客戶機建立的通訊鏈路在服務程序內的通訊端點。如果采用Java的多線程編程方法,可以實現並發服務器,繼續監聽來自其他客戶的連接請求。

3、使用新建的Socket對象創建輸入、輸出流對象。

4、使用流對象的方法完成和客戶端的數據傳輸,按約定協議識別並處理來自客戶端的請求數據,並把處理的結果返回給客戶端。

5、客戶端工作完畢後,則服務器端程序關閉和客戶端通訊的流和通訊的Socket。

6、在服務器程序運行結束之間,應當關閉用來監聽的Socket.

下面讓我們來看一個服務器端的程序的Java實現:

代碼二:

import java.net.*;
   import java.io.*;
   public class SocketCommunicationServer
   {
    public static void main(String[] args)
    try
    {
     boolean flag=true;//設置標志位為真
     Socket client=null;//創建Socket client以接收來自客戶端的請求
     String inputLine;
     ServerSocket serverSocket =new ServerSocket (9000);//以端口9000創建一個服務器Socket
     System.out.println("服務器在端口9000上監聽");
     file://也可以使用serverSocket.getLocalPort()來獲得端口號
     while(flag)
     {
      client=serverSocket.accept();
      file://監聽並接受與此Socket的連接,該方法會阻塞直到有一個連接產生
      DataInputStream input=new DataInputStream(new BufferedInputStream(client.getInputStream()));
      PrintStream output=new PrintStream(new BufferedOutputStream(client.getOutputStream());
      while (( inputLine= input.readLine())!=null)
       {
        if(inputLine.equals("Stop"))
        {
         flag=false;
         break;
        }
        output.println(inputLine);
        output.flush();
       }
       output.close();
       input.close();
       client.close();
      }
      serverSocket.close();
      }catch(IOException e){}
     }
    }
   }

以上,我簡略的談了一下Socket編程的機制以及使用Java進行Socket編程的實現方法,希望能對大家有所幫助。

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