① android Socket 的使用方法
Socket是位於應用層和傳輸層之間的一個抽象層,把TCP/IP層復雜的操作抽象為幾個簡單的介面,供應用層調用以實現進程在網路中通信。
Socket分為流式套接字和數據包套接字,分別對應網路傳輸控制層的TCP協議和UDP協議。TCP協議是一種面向連接的,可靠的,基於位元組流的傳輸層通信協議,它使用三次握手協議建立連接,並且提供了超時重傳機制,具有很高的穩定性。UDP協議是一種無連接的協議,且不對數據包進行可靠性保證。
在網路差的情況下,UDP協議數據包丟失會比較嚴重,但由於其不屬於連接型協議,具有資源消耗少,處理速度快的優點,在音頻視頻等傳輸時使用UDP協議較多。
這里我們通過socket實現兩個進程之間的通信。
3.TestClientSocket
客戶端首先就是開啟while循環,創建Socket與ServerSocket進行連接,直到建立與ServerSocket的連接;然後同樣是獲得ServerSocket,通過InputStream讀取其內容,通過OutputStream向其寫入內容。
4.再打開客戶端
客戶端開啟之後建立與服務端的連接。
連接創建好之後,客戶端向服務端發送信息。
在上層,socket基於對相同IP和相同埠的監聽實現的。
劉望舒的Android進階指北。
② android socket編程中,網路如何設置
原則上,對socket的操作(打開/讀寫)應該在子線程中進行。你放在UI的主線程里操作不對。
另外你都沒貼log出穗友來或者說明log里列印的是猜宏槐什麼exception,那絕桐樣更有針對性。
③ Android - Socket簡單使用
ServerSocket類提供如下構造器:
當ServerSocket使用完畢,應使用 close() 方法來關閉此ServerSocket。通常情況下,伺服器不應該只接收一個客戶端請求,而應該不斷接收來自客戶端的請求,所以程序可以通過循環,不斷調用ServerSocket的accept方法:
Socket 常用構造器
註:上面兩個構造器指定遠程主機時既可以使用InetAddress來指定,也可以直接使用String對象來指定遠程IP。本地主機只有一個IP地址時,使用第一個方法更簡單。
在與伺服器進行通訊的時候,無法判斷遠程的伺服器是否斷開連接。如果使用 OutputStream 發送數據則會影響正常的數據發送(無法區分)。所以就引入了一個心跳機制。
心跳機制實現,使用 Socket.sendUrgentData() 方法發送一個位元組流數據(緊急數據)。可以通過判斷服務端的 OOBINLINE 屬性是否打開,來確定是否斷開連接;
setSoTimeout()理解 :設置超時時間;例如:設置為2s,如果阻塞的時間>2s ,那麼就會報錯。
④ Android 基於UDP的Socket通信
1、連接DatagramSocket的服務端(ip和port):開啟非同步線程和socket
2、發送數據(DatagramPacket):非同步
3、接收數據(DatagramPacket):注意連接狀態,非同步讀取
4、關閉連接:關閉DatagramSocket和對應線程
1、異常:android.os.NetworkOnMainThreadException。 socket需要在線程中使用
2、前後端統一傳輸或者接收協議 [requestcode size d1 d2 d3 ... ],在解析時候用得到
3、實施監控socket的連接狀態,還是用心跳包發過去,然後返回數據,一段時間沒有的話則代表socket連接失敗。
4、注意receive接收數據後的有效長度(一個是預存的buffer,一個是有效結果buffer)
5、客戶端連上去後不知道為何一定要先發送一次,才能接收?
6、UDP不安全,有長度限制64K
2019 (* ̄(oo) ̄) 諸事順利!
⑤ Android 多個Activity 共用一個socket
想要讓多個activity共用一個socket(本文使用bluetoothsocket,TCP通信其實也是一樣的,只是socket引入的庫不同而已),網上三個方法,這里只是實現了比較簡單的一種(application實體類)。
第一步實現socket實體類:
第二步:設置AndroidManifest.xml
加入android:name=".Mysocket"
第三步:在第一次創建鏈接時對它初始化:
因為我是藍牙與51單片機進行通信,初始化bluetoothsocket後,再使用((Mysocket)getApplication()).setSocket(socket8051);這句話初始化實體類。
第四步:在其他的activity調用這個socket可以使用
不出意外可以正常運行。
實體類
`hello`
⑥ Android中Socket編程(二)
LocalServerSocket是屬於Android系統內置的一個類,屬於net包下,類似java中的serversocket類的功能。
這個類比較簡單,構造方法有兩個:
一般使用第一個即可;
本類中方法只有四個,分別是:
查看LocalServerSocket源碼可知:
本類內容比較簡單,主要實現方式都在LocalSocketImpl中,下次分析。
內容基本同LocalScoket,主要功能也是通過LocalSocketImpl實現的。
⑦ Android-Socket
由於二者不屬於同一層面,所以本來是沒有可比性的。但隨著發展,默認的Http里封裝了下面幾層的使用,所以才會出現Socket & HTTP協議的對比:(主要是工作方式的不同):
Socket可理解為一種特殊的文件,在伺服器和客戶端各自維護一個文件,並使用SocketAPI函數對其進行文件操作。在建立連接打開後,可以向各自文件寫入內容供對方讀取或讀取對方內容,通信結束時關閉文件。在UNIX哲學中「一切皆文件」,文件的操作模式基本為「打開-讀寫-關閉」三大步驟,Socket其實就是這個模式的一個實現。
創建socket的時候,也可以指定不同的參數創建不同的socket描述符,socket函數的三個參數分別為:
當我們調用socket創建一個socket時,返回的socket描述字它存在於協議族(address family,AF_XXX)空間中,但沒有一個具體的地址。如果想要給它賦值一個地址,就必須調用bind()函數,否則就當調用connect()、listen()時系統會自動隨機分配一個埠。
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
函數的三個參數分別為:
如果作為一個伺服器,在調用socket()、bind()之後就會調用listen()來監聽這個socket,如果客戶端這時調用connect()發出連接請求,伺服器端就會接收到這個請求。
TCP伺服器端依次調用socket()、bind()、listen()之後,就會監聽指定的socket地址了。TCP客戶端依次調用socket()、connect()之後就想TCP伺服器發送了一個連接請求。TCP伺服器監聽到這個請求之後,就會調用accept()函數取接收請求,這樣連接就建立好了。之後就可以開始網路I/O操作了,即類同於普通文件的讀寫I/O操作。
注意:accept的第一個參數為伺服器的socket描述字,是伺服器開始調用socket()函數生成的,稱為監聽socket描述字;而accept函數返回的是已連接的socket描述字。一個伺服器通常通常僅僅只創建一個監聽socket描述字,它在該伺服器的生命周期內一直存在。內核為每個由伺服器進程接受的客戶連接創建了一個已連接socket描述字,當伺服器完成了對某個客戶的服務,相應的已連接socket描述字就被關閉。
萬事具備只欠東風,至此伺服器與客戶已經建立好連接了。可以調用網路I/O進行讀寫操作了,即實現了網咯中不同進程之間的通信!網路I/O操作有下面幾組:
read()/write()
recv()/send()
readv()/writev()
recvmsg()/sendmsg()
recvfrom()/sendto()
我推薦使用recvmsg()/sendmsg()函數,這兩個函數是最通用的I/O函數,實際上可以把上面的其它函數都替換成這兩個函數。
從圖中可以看出,當客戶端調用connect時,觸發了連接請求,向伺服器發送了SYN J包,這時connect進入阻塞狀態;伺服器監聽到連接請求,即收到SYN J包,調用accept函數接收請求向客戶端發送SYN K ,ACK J+1,這時accept進入阻塞狀態;客戶端收到伺服器的SYN K ,ACK J+1之後,這時connect返回,並對SYN K進行確認;伺服器收到ACK K+1時,accept返回,至此三次握手完畢,連接建立。
總結:客戶端的connect在三次握手的第二個次返回,而伺服器端的accept在三次握手的第三次返回。
某個應用進程首先調用close主動關閉連接,這時TCP發送一個FIN M;
另一端接收到FIN M之後,執行被動關閉,對這個FIN進行確認。它的接收也作為文件結束符傳遞給應用進程,因為FIN的接收意味著應用進程在相應的連接上再也接收不到額外數據;
一段時間之後,接收到文件結束符的應用進程調用close關閉它的socket。這導致它的TCP也發送一個FIN N;
接收到這個FIN的源發送端TCP對它進行確認。
這樣每個方向上都有一個FIN和ACK。
所謂短連接,即連接只保持在數據傳輸過程,請求發起,連接建立,數據返回,連接關閉。它適用於一些實時數據請求,配合輪詢來進行新舊數據的更替。
https://github.com/nuisanceless/MySocketDemo
https://github.com/xuuhaoo/OkSocket
⑧ Android Socket通信如何設置超時時間
今天太閑了,實在是一個寫博客的好日子! 其實關於這個問題可能用到的人不會很多,不過我在這里還是說說。 正常很多人寫socket通信時,都會直接通過new socket(IP,PORT)直接去鏈接伺服器。其實這種做法也沒岩蔽純有錯誤,但是若當服務並耐器IP不存在會伺服器沒有響應時,程序會卡在這句代碼老長一段時間,才會跳出並報異常粗咐。這對於這種問題,通過設置連接超時時間可以進行解決: socket = new Socket(); SocketAddresssocAddress = new InetSocketAddress(this.netAdress, this.port); 5000就是你所設置的超時時間!