日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android端发送字符到Wed端,Android面试-socket和websocket

發(fā)布時間:2024/4/13 Android 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android端发送字符到Wed端,Android面试-socket和websocket 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Android與服務(wù)器的通信方式主要有兩種,一是Http通信,一是Socket通信。兩者的最大差異在于,http連接使用的是“請求—響應(yīng)方式”,即在請求時建立連接通道,當(dāng)客戶端向服務(wù)器發(fā)送請求后,服務(wù)器端才能向客戶端返回數(shù)據(jù)。而Socket通信則是在雙方建立起連接后就可以直接進行數(shù)據(jù)的傳輸,在連接時可實現(xiàn)信息的主動推送,而不需要每次由客戶端想服務(wù)器發(fā)送請求。 那么,什么是socket?Socket又稱套接字,在程序內(nèi)部提供了與外界通信的端口,即端口通信。通過建立socket連接,可為通信雙方的數(shù)據(jù)傳輸傳提供通道。socket的主要特點有數(shù)據(jù)丟失率低,使用簡單且易于移植。

Socket是一種抽象層,應(yīng)用程序通過它來發(fā)送和接收數(shù)據(jù),使用Socket可以將應(yīng)用程序添加到網(wǎng)絡(luò)中,與處于同一網(wǎng)絡(luò)中的其他應(yīng)用程序進行通信。簡單來說,Socket提供了程序內(nèi)部與外界通信的端口并為通信雙方的提供了數(shù)據(jù)傳輸通道。

Socket類型為流套接字(streamsocket)和數(shù)據(jù)報套接字(datagramsocket)。流套接字將TCP作為其端對端協(xié)議,提供了一個可信賴的字節(jié)流服務(wù)。數(shù)據(jù)報套接字使用UDP協(xié)議,提供數(shù)據(jù)打包發(fā)送服務(wù)

基于TCP協(xié)議的Socket

1)服務(wù)器端首先聲明一個ServerSocket對象并且指定端口號,然后調(diào)用Serversocket的accept()方法接收客戶端的數(shù)據(jù)。accept()方法在沒有數(shù)據(jù)進行接收的處于堵塞狀態(tài)。(Socketsocket=serversocket.accept()),一旦接收到數(shù)據(jù),通過inputstream讀取接收的數(shù)據(jù)。

2)客戶端創(chuàng)建一個Socket對象,指定服務(wù)器端的ip地址和端口號(Socketsocket=newSocket(“172.168.10.108”,8080);),通過inputstream讀取數(shù)據(jù),獲取服務(wù)器發(fā)出的數(shù)據(jù)(OutputStreamoutputstream=socket.getOutputStream()),最后將要發(fā)送的數(shù)據(jù)寫入到outputstream即可進行TCP協(xié)議的socket數(shù)據(jù)傳輸。

基于UDP協(xié)議的數(shù)據(jù)傳輸

1)服務(wù)器端首先創(chuàng)建一個DatagramSocket對象,并且指點監(jiān)聽的端口。接下來創(chuàng)建一個空的DatagramSocket對象用于接收數(shù)據(jù)(bytedata[]=newbyte[1024;]DatagramSocketpacket=newDatagramSocket(data,data.length)),使用DatagramSocket的receive方法接收客戶端發(fā)送的數(shù)據(jù),receive()與serversocket的accepet()類似,在沒有數(shù)據(jù)進行接收的處于堵塞狀態(tài)。

2)客戶端也創(chuàng)建個DatagramSocket對象,并且指點監(jiān)聽的端口。接下來創(chuàng)建一個InetAddress對象,這個對象類似與一個網(wǎng)絡(luò)的發(fā)送地址(InetAddressserveraddress=InetAddress.getByName(“172.168.1.120”)).定義要發(fā)送的一個字符串,創(chuàng)建一個DatagramPacket對象,并制定要講這個數(shù)據(jù)報包發(fā)送到網(wǎng)絡(luò)的那個地址以及端口號,最后使用DatagramSocket的對象的send()發(fā)送數(shù)據(jù)。

WebSocket:

我們知道,在網(wǎng)絡(luò)中的兩個應(yīng)用程序(進程)需要全雙工相互通信(全雙工即雙方可同時向?qū)Ψ桨l(fā)送消息),需要用到的就是socket,它能夠提供端對端通信,對于程序員來講,他只需要在某個應(yīng)用程序的一端(暫且稱之為客戶端)創(chuàng)建一個socket實例并且提供它所要連接一端(暫且稱之為服務(wù)端)的IP地址和端口,而另外一端(服務(wù)端)創(chuàng)建另一個socket并綁定本地端口進行監(jiān)聽,然后客戶端進行連接服務(wù)端,服務(wù)端接受連接之后雙方建立了一個端對端的TCP連接,在該連接上就可以雙向通訊了,而且一旦建立這個連接之后,通信雙方就沒有客戶端服務(wù)端之分了,提供的就是端對端通信了。我們可以采取這種方式構(gòu)建一個桌面版的im程序,讓不同主機上的用戶發(fā)送消息。從本質(zhì)上來說,socket并不是一個新的協(xié)議,它只是為了便于程序員進行網(wǎng)絡(luò)編程而對tcp/ip協(xié)議族通信機制的一種封裝。

websocket是html5規(guī)范中的一個部分,它借鑒了socket這種思想,為web應(yīng)用程序客戶端和服務(wù)端之間(注意是客戶端服務(wù)端)提供了一種全雙工通信機制。同時,它又是一種新的應(yīng)用層協(xié)議,websocket協(xié)議是為了提供web應(yīng)用程序和服務(wù)端全雙工通信而專門制定的一種應(yīng)用層協(xié)議,通常它表示為:ws://echo.websocket.org/?encoding=text HTTP/1.1,可以看到除了前面的協(xié)議名和http不同之外,它的表示地址就是傳統(tǒng)的url地址。

既然是基于瀏覽器端的web技術(shù),那么它的通信肯定少不了http,websocket本身雖然也是一種新的應(yīng)用層協(xié)議,但是它也不能夠脫離http而單獨存在。具體來講,我們在客戶端構(gòu)建一個websocket實例,并且為它綁定一個需要連接到的服務(wù)器地址,當(dāng)客戶端連接服務(wù)端的時候,會向服務(wù)端發(fā)送一個類似下面的http報文,注意該報文中有一個upgrade首部,它的作用是告訴服務(wù)端需要將通信協(xié)議切換到websocket,如果服務(wù)端支持websocket協(xié)議,那么它就會將自己的通信協(xié)議切換到websocket,同時發(fā)給客戶端類似于以下的一個響應(yīng)報文頭,返回的狀態(tài)碼為101,表示同意客戶端協(xié)議轉(zhuǎn)換請求,并將它轉(zhuǎn)換為websocket協(xié)議。以上過程都是利用http通信完成的,稱之為websocket協(xié)議握手(websocket Protocol handshake),進過這握手之后,客戶端和服務(wù)端就建立了websocket連接,以后的通信走的都是websocket協(xié)議了。所以總結(jié)為websocket握手需要借助于http協(xié)議,建立連接后通信過程使用websocket協(xié)議。同時需要了解的是,該websocket連接還是基于我們剛才發(fā)起http連接的那個TCP連接。一旦建立連接之后,我們就可以進行數(shù)據(jù)傳輸了,websocket提供兩種數(shù)據(jù)傳輸:文本數(shù)據(jù)和二進制數(shù)據(jù)。

基于以上分析,我們可以看到,websocket能夠提供低延遲,高性能的客戶端與服務(wù)端的雙向數(shù)據(jù)通信。它顛覆了之前web開發(fā)的請求處理響應(yīng)模式,并且提供了一種真正意義上的客戶端請求,服務(wù)器推送數(shù)據(jù)的模式,特別適合實時數(shù)據(jù)交互應(yīng)用開發(fā)。

WebSocket 是 HTML5 一種新的協(xié)議。它實現(xiàn)了瀏覽器與服務(wù)器全雙工通信,能更好的節(jié)省服務(wù)器資源和帶寬并達(dá)到實時通訊,它建立在 TCP 之上,同 HTTP 一樣通過 TCP 來傳輸數(shù)據(jù),但是它和 HTTP 最大不同是:

WebSocket 是一種雙向通信協(xié)議,在建立連接后,WebSocket 服務(wù)器和 Browser/Client Agent 都能主動的向?qū)Ψ桨l(fā)送或接收數(shù)據(jù),就像 Socket 一樣;

WebSocket 需要類似 TCP 的客戶端和服務(wù)器端通過握手連接,連接成功后才能相互通信。

相對于傳統(tǒng) HTTP 每次請求-應(yīng)答都需要客戶端與服務(wù)端建立連接的模式,WebSocket 是類似 Socket 的 TCP 長連接的通訊模式,一旦 WebSocket 連接建立后,后續(xù)數(shù)據(jù)都以幀序列的形式傳輸。在客戶端斷開 WebSocket 連接或 Server 端斷掉連接前,不需要客戶端和服務(wù)端重新發(fā)起連接請求。在海量并發(fā)及客戶端與服務(wù)器交互負(fù)載流量大的情況下,極大的節(jié)省了網(wǎng)絡(luò)帶寬資源的消耗,有明顯的性能優(yōu)勢,且客戶端發(fā)送和接受消息是在同一個持久連接上發(fā)起,實時性優(yōu)勢明顯。

在客戶端,new WebSocket 實例化一個新的 WebSocket 客戶端對象,連接類似 ws://yourdomain:port/path 的服務(wù)端 WebSocket URL,WebSocket 客戶端對象會自動解析并識別為 WebSocket 請求,從而連接服務(wù)端端口,執(zhí)行雙方握手過程,可以看到,客戶端發(fā)起的 WebSocket 連接報文類似傳統(tǒng) HTTP 報文,”Upgrade:websocket”參數(shù)值表明這是 WebSocket 類型請求,“Sec-WebSocket-Key”是 WebSocket 客戶端發(fā)送的一個 base64 編碼的密文,要求服務(wù)端必須返回一個對應(yīng)加密的“Sec-WebSocket-Accept”應(yīng)答,否則客戶端會拋出“Error during WebSocket handshake”錯誤,并關(guān)閉連接。

最后做下小廣告:BAT大咖助力 全面升級Android面試

這是我android面試視頻課程,大家可以看看,里面涵蓋了絕大部分的內(nèi)容

總結(jié)

以上是生活随笔為你收集整理的Android端发送字符到Wed端,Android面试-socket和websocket的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。