在JavaME的網絡開發中,我們通常使用的兩種網絡通信協議是HTTP超文本傳輸協議和Socket套接字協議,但是由於HTTP是短連接,因此在某些手機中可能會出現不斷出現連接網絡的提示,因此很多時候我們通過Socket來實現網絡連接。在Socket開發中,我們應用的比較多的是手機端與手機端之間的通信,還有手機與服務器的通信。下面分別簡單歸納下兩種通信的基本實現。
一、手機端與服務器端的Socket通訊我們通常需要在手機中實現某些功能,而這些功能需要服務器提供服務,因而在手機中需要建立與服務器之間的有效通信。在服務器端我們使用的是 ServerSocket來創建服務socket,代碼如:ServerSocket server = new ServerSocket(4321);,這樣就打開了一個ServerSocket,然後我們使用ServerSocket的accept方法來監聽客戶端建立的連接,該方法在沒有客戶端建立請求的時候會一直處於阻塞狀態,直到有連接建立則形成Socket對象,服務器通常需要為多客戶端同時提供服務,因此一般情況下,我們通過在一個循環中不斷監聽客戶端連接,並為每一個連接創建一個線程提供獨立服務。
ServerSocket server = new ServerSocket(4321);
while(true) {
socket = server.accept();
new ServerThread(socket).start();
}
然後在線程中打開socket的通信數據流與客戶端進行通訊。
在JavaME中,與JavaSE的socket使用方式有些不同,在打開Socket連接的時候,使用的不是Socket,而是 SocketConnection,並由JavaME中的網絡連接類Connector的open方法來建立socket連接,同時,由於open方法返回的是Connection對象,因此需要將其轉化為SocketConnection對象。
SocketConnection sc = (SocketConnection) Connector.open("socket://127.0.0.1:4321"); 這樣就打開了一個socket連接對象,然後通過獲取該socket的通信流就可以跟服務器之間進行數據交換。
二、手機端與手機端之間的Socket通訊有些開發應用中,實現了手機與手機之間直接的通訊,這就需要讓一個手機作為服務端,而另一手機作為客戶端來處理,作為客戶端的Socket使用方法與以上(一)中相同,不同的主要是作為服務端的手機程序實現。同樣的,在JavaME中並不是通過ServerSocket來創建服務Socket的,而是通過ServerSocketConnection來實現,並且一樣是通過Connector來打開連接,使用的方法是acceptAndOpen,具體實現如下:
ServerSocketConnection ssc = (ServerSocketConnection)Connector.open("socket://:1234");
SocketConnection sc = (SocketConnection)ssc.acceptAndOpen();
在得到SocketConnection對象之後便可以通過獲取相應的socket數據流進行通信。
DataInputStream dis = sc.openDataOutputStream();
DataOutputStream dos = sc.openDataInputStream();
以上為分別對手機與服務器端之間、手機與手機之間通過Socket進行通訊的基本方法。