Java網絡編程:Socket和WebSocket

一、Socket總結

1、Socket簡介

在計算機通信領域,Socket 被翻譯爲“套接字”,它是計算機之間進行通信一種約定。通過 Socket 這種約定,一臺計算機可以接收其他計算機的數據,也可以向其他計算機發送數據。

Socket所處層次

 

圖中可以看到Socket是應用層與TCP/IP協議族通信的中間軟件抽象層,就是提供了tcp/ip協議的抽象,對外提供了一套接口,同過這個接口就可以統一方便的使用tcp/ip協議的功能。

2、Socket常用方法圖解

圖片來源於網絡,侵刪

3、Socket網絡通信流程

Socket基於Tcp連接的通信流程圖

4、Java中Socket使用舉例

在Java中,我們使用Socket有兩種,一個是基於TCP的Socket,一個是基於UDP的DatagramSocket,本篇只分析基於TCP的Socket。現在我們來看Socket的使用:

客戶端:指明主機端口創建Socket,獲取輸出流,寫入數據。

        Socket socket = null;
        OutputStream os = null;

        try {
            socket = new Socket("192.168.1.106",9200);
            os = socket.getOutputStream();
            os.write("hello server !".getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if(os != null){
                    os.close();
                }
                if(socket != null){
                    socket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

服務端:指明綁定的端口,創建ServerSocket,開啓端口監聽。

      ServerSocket serverSocket;
        try {
            serverSocket = new ServerSocket(9200);
        } catch (IOException e) {   
            return;
        }

        while (isRunning){
            try {
                Socket client = serverSocket.accept();
                handleClient(client);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        try {
            serverSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

這裏只是一個簡單的示例,當然實際開發中可能需要更多的東西,比如在handleClient(client)處理數據的時候加入線程池去處理,以及client的關閉等,這裏只是簡單的使用。

二、WebSocket總結

1、WebSocket簡介

WebSocket 是 HTML5 一種新的應用層協議,它實現了瀏覽器與服務器全雙工通信,能更好的節省服務器資源和帶寬並達到實時通訊。

在 WebSocket API 中,瀏覽器和服務器只需要完成一次握手,兩者之間就直接可以創建持久性的連接,並進行雙向數據傳輸。

在此WebSocket 協議中,爲我們實現即使服務帶來了兩大好處:

a. Header

互相溝通的Header是很小的-大概只有 2 Bytes

b. Server Push

服務器可以主動傳送數據給客戶端

2、WebSocket作用

WebSocket可以實現網站即時通訊技術,替代輪詢

     網站上的即時通訊是很常見的,比如網頁的QQ,聊天系統等。按照以往的技術能力實現即時通訊通常是採用輪詢、Comet技術解決。

     HTTP協議是非持久化的,單工的網絡協議,在建立連接後只允許瀏覽器向服務器發出請求後,服務器才能返回相應的數據。當需要即時通訊時,通過輪詢在特定的時間間隔(如1秒),由瀏覽器向服務器發送Request請求,然後將最新的數據返回給瀏覽器。這樣的方法最明顯的缺點就是需要不斷的發送請求,而且通常HTTP request的Header是非常長的,爲了傳輸一個很小的數據 需要付出巨大的代價,是很不合算的,佔用了很多的寬帶。而最比較新的技術去做輪詢的效果是Comet – 用了AJAX。但這種技術雖然可達到全雙工通信,但依然需要發出請求。

    然而WebSocket全雙工通信協議的出現可以彌補這一缺點。在WebSocket中,瀏覽器和服務器只需要要做一個握手的動作,然後,瀏覽器和服務器之間就形成了一條快速通道。兩者之間就直接可以數據互相傳送。

3、WebSocket與Socket的區別

Socket其實並不是一個協議,就是提供了tcp/ip協議的抽象,對外提供了一套接口,同過這個接口就可以統一方便的使用tcp/ip協議的功能。

Socket是應用層與TCP/IP協議族通信的中間軟件抽象層,它是一組接口。在設計模式中,Socket其實就是一個門面模式,它把複雜的TCP/IP協議族隱藏在Socket接口後面,對用戶來說,一組簡單的接口就是全部,讓Socket去組織數據,以符合指定的協議。

WebSocket則是Html5開始提供的一個典型的應用層協議,可以用來實現網站的即時通訊。

 

補充:現在大多數的手機即時通訊app基本都是通過XMPP協議來實現的,服務器端比如 Netty + openfire等等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章