Android端发送字符到Wed端,Android面试-socket和websocket
Android與服務器的通信方式主要有兩種,一是Http通信,一是Socket通信。兩者的最大差異在于,http連接使用的是“請求—響應方式”,即在請求時建立連接通道,當客戶端向服務器發送請求后,服務器端才能向客戶端返回數據。而Socket通信則是在雙方建立起連接后就可以直接進行數據的傳輸,在連接時可實現信息的主動推送,而不需要每次由客戶端想服務器發送請求。 那么,什么是socket?Socket又稱套接字,在程序內部提供了與外界通信的端口,即端口通信。通過建立socket連接,可為通信雙方的數據傳輸傳提供通道。socket的主要特點有數據丟失率低,使用簡單且易于移植。
Socket是一種抽象層,應用程序通過它來發送和接收數據,使用Socket可以將應用程序添加到網絡中,與處于同一網絡中的其他應用程序進行通信。簡單來說,Socket提供了程序內部與外界通信的端口并為通信雙方的提供了數據傳輸通道。
Socket類型為流套接字(streamsocket)和數據報套接字(datagramsocket)。流套接字將TCP作為其端對端協議,提供了一個可信賴的字節流服務。數據報套接字使用UDP協議,提供數據打包發送服務
基于TCP協議的Socket
1)服務器端首先聲明一個ServerSocket對象并且指定端口號,然后調用Serversocket的accept()方法接收客戶端的數據。accept()方法在沒有數據進行接收的處于堵塞狀態。(Socketsocket=serversocket.accept()),一旦接收到數據,通過inputstream讀取接收的數據。
2)客戶端創建一個Socket對象,指定服務器端的ip地址和端口號(Socketsocket=newSocket(“172.168.10.108”,8080);),通過inputstream讀取數據,獲取服務器發出的數據(OutputStreamoutputstream=socket.getOutputStream()),最后將要發送的數據寫入到outputstream即可進行TCP協議的socket數據傳輸。
基于UDP協議的數據傳輸
1)服務器端首先創建一個DatagramSocket對象,并且指點監聽的端口。接下來創建一個空的DatagramSocket對象用于接收數據(bytedata[]=newbyte[1024;]DatagramSocketpacket=newDatagramSocket(data,data.length)),使用DatagramSocket的receive方法接收客戶端發送的數據,receive()與serversocket的accepet()類似,在沒有數據進行接收的處于堵塞狀態。
2)客戶端也創建個DatagramSocket對象,并且指點監聽的端口。接下來創建一個InetAddress對象,這個對象類似與一個網絡的發送地址(InetAddressserveraddress=InetAddress.getByName(“172.168.1.120”)).定義要發送的一個字符串,創建一個DatagramPacket對象,并制定要講這個數據報包發送到網絡的那個地址以及端口號,最后使用DatagramSocket的對象的send()發送數據。
WebSocket:
我們知道,在網絡中的兩個應用程序(進程)需要全雙工相互通信(全雙工即雙方可同時向對方發送消息),需要用到的就是socket,它能夠提供端對端通信,對于程序員來講,他只需要在某個應用程序的一端(暫且稱之為客戶端)創建一個socket實例并且提供它所要連接一端(暫且稱之為服務端)的IP地址和端口,而另外一端(服務端)創建另一個socket并綁定本地端口進行監聽,然后客戶端進行連接服務端,服務端接受連接之后雙方建立了一個端對端的TCP連接,在該連接上就可以雙向通訊了,而且一旦建立這個連接之后,通信雙方就沒有客戶端服務端之分了,提供的就是端對端通信了。我們可以采取這種方式構建一個桌面版的im程序,讓不同主機上的用戶發送消息。從本質上來說,socket并不是一個新的協議,它只是為了便于程序員進行網絡編程而對tcp/ip協議族通信機制的一種封裝。
websocket是html5規范中的一個部分,它借鑒了socket這種思想,為web應用程序客戶端和服務端之間(注意是客戶端服務端)提供了一種全雙工通信機制。同時,它又是一種新的應用層協議,websocket協議是為了提供web應用程序和服務端全雙工通信而專門制定的一種應用層協議,通常它表示為:ws://echo.websocket.org/?encoding=text HTTP/1.1,可以看到除了前面的協議名和http不同之外,它的表示地址就是傳統的url地址。
既然是基于瀏覽器端的web技術,那么它的通信肯定少不了http,websocket本身雖然也是一種新的應用層協議,但是它也不能夠脫離http而單獨存在。具體來講,我們在客戶端構建一個websocket實例,并且為它綁定一個需要連接到的服務器地址,當客戶端連接服務端的時候,會向服務端發送一個類似下面的http報文,注意該報文中有一個upgrade首部,它的作用是告訴服務端需要將通信協議切換到websocket,如果服務端支持websocket協議,那么它就會將自己的通信協議切換到websocket,同時發給客戶端類似于以下的一個響應報文頭,返回的狀態碼為101,表示同意客戶端協議轉換請求,并將它轉換為websocket協議。以上過程都是利用http通信完成的,稱之為websocket協議握手(websocket Protocol handshake),進過這握手之后,客戶端和服務端就建立了websocket連接,以后的通信走的都是websocket協議了。所以總結為websocket握手需要借助于http協議,建立連接后通信過程使用websocket協議。同時需要了解的是,該websocket連接還是基于我們剛才發起http連接的那個TCP連接。一旦建立連接之后,我們就可以進行數據傳輸了,websocket提供兩種數據傳輸:文本數據和二進制數據。
基于以上分析,我們可以看到,websocket能夠提供低延遲,高性能的客戶端與服務端的雙向數據通信。它顛覆了之前web開發的請求處理響應模式,并且提供了一種真正意義上的客戶端請求,服務器推送數據的模式,特別適合實時數據交互應用開發。
WebSocket 是 HTML5 一種新的協議。它實現了瀏覽器與服務器全雙工通信,能更好的節省服務器資源和帶寬并達到實時通訊,它建立在 TCP 之上,同 HTTP 一樣通過 TCP 來傳輸數據,但是它和 HTTP 最大不同是:
WebSocket 是一種雙向通信協議,在建立連接后,WebSocket 服務器和 Browser/Client Agent 都能主動的向對方發送或接收數據,就像 Socket 一樣;
WebSocket 需要類似 TCP 的客戶端和服務器端通過握手連接,連接成功后才能相互通信。
相對于傳統 HTTP 每次請求-應答都需要客戶端與服務端建立連接的模式,WebSocket 是類似 Socket 的 TCP 長連接的通訊模式,一旦 WebSocket 連接建立后,后續數據都以幀序列的形式傳輸。在客戶端斷開 WebSocket 連接或 Server 端斷掉連接前,不需要客戶端和服務端重新發起連接請求。在海量并發及客戶端與服務器交互負載流量大的情況下,極大的節省了網絡帶寬資源的消耗,有明顯的性能優勢,且客戶端發送和接受消息是在同一個持久連接上發起,實時性優勢明顯。
在客戶端,new WebSocket 實例化一個新的 WebSocket 客戶端對象,連接類似 ws://yourdomain:port/path 的服務端 WebSocket URL,WebSocket 客戶端對象會自動解析并識別為 WebSocket 請求,從而連接服務端端口,執行雙方握手過程,可以看到,客戶端發起的 WebSocket 連接報文類似傳統 HTTP 報文,”Upgrade:websocket”參數值表明這是 WebSocket 類型請求,“Sec-WebSocket-Key”是 WebSocket 客戶端發送的一個 base64 編碼的密文,要求服務端必須返回一個對應加密的“Sec-WebSocket-Accept”應答,否則客戶端會拋出“Error during WebSocket handshake”錯誤,并關閉連接。
最后做下小廣告:BAT大咖助力 全面升級Android面試
這是我android面試視頻課程,大家可以看看,里面涵蓋了絕大部分的內容
總結
以上是生活随笔為你收集整理的Android端发送字符到Wed端,Android面试-socket和websocket的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 生成树生成森林c语言中文网,生成树协议(
- 下一篇: android中调用fft函数,J使用P