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編程的實現方法,希望能對大家有所協助。