Java Socket 編程原理

事實上網絡編程簡單的理解就是兩臺計算機相互通訊數據而已.對於程序員而言,去掌握一種編程接口並使用一種編程模型相對就會顯得簡單的多了.Java SDK提供一些相對簡單的Api來完成這些工作.Java Socket編程就是其中之一.對於Java而言.這些Api存在與java.net 這個包裡面.因此只要導入這個包就可以準備網絡編程了。

Socket是網絡上運行的兩個程序間雙向通訊的一端,它既可以接受請求,也可以發送請求,利用它可以較為方便的編寫網絡上的數據的傳遞。在java中,有專門的socket類來處理用戶的請求和響應。利用SOCKET類的方法,就可以實現兩臺計算機之間的通訊。這裡就介紹一下在JAVA中如何利用socket進行網絡編程。

Java Socket 編程原理

建立服務器類

Java中有一個專門用來建立Socket服務器的類,名叫ServerSocket,可以用服務器需要使用的端口號作為參數來創建服務器對象。

ServerSocket server = new ServerSocket(9998)

這條語句創建了一個服務器對象,這個服務器使用9998號端口。當一個客戶端程序建立一個Socket連接,所連接的端口號為9998時,服務器對象server便響應這個連接,並且server.accept()方法會創建一個Socket對象。服務器端便可以利用這個Socket對象與客戶進行通訊。

Socket incoming = server.accept()

進而得到輸入流和輸出流,並進行封裝

BufferedReader in = new BufferedReader(new InputStreamReader(incoming.getInputStream()));

PrintWriter out = new PrintWriter(incoming.getOutputStream(),true);

隨後,就可以使用in.readLine()方法得到客戶端的輸入,也可以使用out.println()方法向客戶端發送數據。從而可以根據程序的需要對客戶端的不同請求進行回應。

在所有通訊結束以後應該關閉這兩個數據流,關閉的順序是先關閉輸出流,再關閉輸入流,即使用:

out.close();

in.close();

Java Socket 編程原理

客戶端和服務端同時讀和寫

前面已經說了Socket之間是雙向通信的,它既可以接收數據,同時也可以發送數據。

服務端代碼

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);

//讀完後寫一句

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

writer.write("Hello Client.");

writer.flush();

writer.close();

reader.close();

socket.close();

server.close();

}

}


分享到:


相關文章: