欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android Socket通信詳解

 更新時(shí)間:2015年12月20日 10:44:51   作者:0代碼狂人0  
這篇文章主要介紹了Android Socket通信詳解的相關(guān)資料,需要的朋友可以參考下

一、Socket通信簡介 

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

1.1什么是Socket Socket

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

 1.2Socket的分類

 根據(jù)不同的的底層協(xié)議,Socket的實(shí)現(xiàn)是多樣化的。本指南中只介紹TCP/IP協(xié)議族的內(nèi)容,在這個(gè)協(xié)議族當(dāng)中主要的Socket類型為流套接字(streamsocket)和數(shù)據(jù)報(bào)套接字(datagramsocket)。流套接字將TCP作為其端對(duì)端協(xié)議,提供了一個(gè)可信賴的字節(jié)流服務(wù)。數(shù)據(jù)報(bào)套接字使用UDP協(xié)議,提供數(shù)據(jù)打包發(fā)送服務(wù)。 下面,我們來認(rèn)識(shí)一下這兩種Socket類型的基本實(shí)現(xiàn)模型。

二、Socket 基本通信模型

三、Socket基本實(shí)現(xiàn)原理

 3.1基于TCP協(xié)議的Socket

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

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

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

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

客戶端也創(chuàng)建個(gè)DatagramSocket對(duì)象,并且指點(diǎn)監(jiān)聽的端口。接下來創(chuàng)建一個(gè)InetAddress對(duì)象,這個(gè)對(duì)象類似與一個(gè)網(wǎng)絡(luò)的發(fā)送地址(InetAddressserveraddress=InetAddress.getByName("172.168.1.120")).定義要發(fā)送的一個(gè)字符串,創(chuàng)建一個(gè)DatagramPacket對(duì)象,并制定要講這個(gè)數(shù)據(jù)報(bào)包發(fā)送到網(wǎng)絡(luò)的那個(gè)地址以及端口號(hào),最后使用DatagramSocket的對(duì)象的send()發(fā)送數(shù)據(jù)。*(Stringstr="hello";bytedata[]=str.getByte();DatagramPacketpacket=new DatagramPacket(data,data.length,serveraddress,4567);socket.send(packet);)

四、android 實(shí)現(xiàn)socket簡單通信

前言:添加權(quán)限

 <!--允許應(yīng)用程序改變網(wǎng)絡(luò)狀態(tài)-->   
 <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>       
 <!--允許應(yīng)用程序改變WIFI連接狀態(tài)-->   
 <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>       
 <!--允許應(yīng)用程序訪問有關(guān)的網(wǎng)絡(luò)信息-->   
 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>       
 <!--允許應(yīng)用程序訪問WIFI網(wǎng)卡的網(wǎng)絡(luò)信息-->   
 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>       
 <!--允許應(yīng)用程序完全使用網(wǎng)絡(luò)-->   
 <uses-permission android:name="android.permission.INTERNET"/>    

4.1使用TCP協(xié)議通信

android端實(shí)現(xiàn):

 protected void connectServerWithTCPSocket() {  
    Socket socket; 
    try {// 創(chuàng)建一個(gè)Socket對(duì)象,并指定服務(wù)端的IP及端口號(hào) 
      socket = new Socket("...", ); 
       // 創(chuàng)建一個(gè)InputStream用戶讀取要發(fā)送的文件。 
       InputStream inputStream = new FileInputStream("e://a.txt"); 
       // 獲取Socket的OutputStream對(duì)象用于發(fā)送數(shù)據(jù)。 
       OutputStream outputStream = socket.getOutputStream(); 
       // 創(chuàng)建一個(gè)byte類型的buffer字節(jié)數(shù)組,用于存放讀取的本地文件 
       byte buffer[] = new byte[ * ]; 
       int temp = ; 
       // 循環(huán)讀取文件 
       while ((temp = inputStream.read(buffer)) != -) { 
         // 把數(shù)據(jù)寫入到OuputStream對(duì)象中 
         outputStream.write(buffer, , temp); 
       } 
       // 發(fā)送讀取的數(shù)據(jù)到服務(wù)端 
       outputStream.flush(); 
  
       /** 或創(chuàng)建一個(gè)報(bào)文,使用BufferedWriter寫入,看你的需求 **/ 
 //     String socketData = "[;fjks;]"; 
 //     BufferedWriter writer = new BufferedWriter(new OutputStreamWriter( 
 //         socket.getOutputStream())); 
 //     writer.write(socketData.replace("\n", " ") + "\n"); 
 //     writer.flush(); 
       /************************************************/ 
     } catch (UnknownHostException e) { 
       e.printStackTrace(); 
     } catch (IOException e) { 
       e.printStackTrace(); 
     } 
  
   }

 服務(wù)器端簡單實(shí)現(xiàn):

public void ServerReceviedByTcp() { 
   // 聲明一個(gè)ServerSocket對(duì)象 
   ServerSocket serverSocket = null; 
   try { 
     // 創(chuàng)建一個(gè)ServerSocket對(duì)象,并讓這個(gè)Socket在端口監(jiān)聽 
     serverSocket = new ServerSocket(); 
     // 調(diào)用ServerSocket的accept()方法,接受客戶端所發(fā)送的請(qǐng)求, 
     // 如果客戶端沒有發(fā)送數(shù)據(jù),那么該線程就停滯不繼續(xù) 
     Socket socket = serverSocket.accept(); 
     // 從Socket當(dāng)中得到InputStream對(duì)象 
     InputStream inputStream = socket.getInputStream(); 
     byte buffer[] = new byte[ * ]; 
     int temp = ; 
     // 從InputStream當(dāng)中讀取客戶端所發(fā)送的數(shù)據(jù) 
     while ((temp = inputStream.read(buffer)) != -) { 
       System.out.println(new String(buffer, , temp)); 
    } 
    serverSocket.close(); 
  } catch (IOException e) { 
     e.printStackTrace(); 
   } 
 } 

4.2使用UDP協(xié)議通信

客戶端發(fā)送數(shù)據(jù)實(shí)現(xiàn):

protected void connectServerWithUDPSocket() {   
   DatagramSocket socket; 
   try { 
     //創(chuàng)建DatagramSocket對(duì)象并指定一個(gè)端口號(hào),注意,如果客戶端需要接收服務(wù)器的返回?cái)?shù)據(jù), 
     //還需要使用這個(gè)端口號(hào)來receive,所以一定要記住 
     socket = new DatagramSocket(); 
    //使用InetAddress(InetAddress).getByName把IP地址轉(zhuǎn)換為網(wǎng)絡(luò)地址  
     InetAddress serverAddress = InetAddress.getByName("..."); 
     //InetAddress serverAddress = (InetAddress) InetAddress.getByName("...");  
     String str = "[;fjks;]";//設(shè)置要發(fā)送的報(bào)文  
     byte data[] = str.getBytes();//把字符串str字符串轉(zhuǎn)換為字節(jié)數(shù)組  
     //創(chuàng)建一個(gè)DatagramPacket對(duì)象,用于發(fā)送數(shù)據(jù)。  
     //參數(shù)一:要發(fā)送的數(shù)據(jù) 參數(shù)二:數(shù)據(jù)的長度 參數(shù)三:服務(wù)端的網(wǎng)絡(luò)地址 參數(shù)四:服務(wù)器端端口號(hào)  
     DatagramPacket packet = new DatagramPacket(data, data.length ,serverAddress ,);  
     socket.send(packet);//把數(shù)據(jù)發(fā)送到服務(wù)端。  
   } catch (SocketException e) { 
     e.printStackTrace(); 
   } catch (UnknownHostException e) { 
     e.printStackTrace(); 
   } catch (IOException e) { 
     e.printStackTrace(); 
   }  
 } 

客戶端接收服務(wù)器返回的數(shù)據(jù):

public void ReceiveServerSocketData() { 
   DatagramSocket socket; 
   try { 
     //實(shí)例化的端口號(hào)要和發(fā)送時(shí)的socket一致,否則收不到data 
     socket = new DatagramSocket(); 
     byte data[] = new byte[ * ]; 
     //參數(shù)一:要接受的data 參數(shù)二:data的長度 
     DatagramPacket packet = new DatagramPacket(data, data.length); 
     socket.receive(packet); 
     //把接收到的data轉(zhuǎn)換為String字符串 
     String result = new String(packet.getData(), packet.getOffset(), 
         packet.getLength()); 
     socket.close();//不使用了記得要關(guān)閉 
     System.out.println("the number of reveived Socket is :" + flag 
         + "udpData:" + result); 
   } catch (SocketException e) { 
     e.printStackTrace(); 
   } catch (IOException e) { 
     e.printStackTrace(); 
   } 
 } 

服務(wù)器接收客戶端實(shí)現(xiàn):

 public void ServerReceviedByUdp(){ 
   //創(chuàng)建一個(gè)DatagramSocket對(duì)象,并指定監(jiān)聽端口。(UDP使用DatagramSocket)  
   DatagramSocket socket; 
   try { 
    socket = new DatagramSocket(); 
     //創(chuàng)建一個(gè)byte類型的數(shù)組,用于存放接收到得數(shù)據(jù)  
     byte data[] = new byte[*];  
    //創(chuàng)建一個(gè)DatagramPacket對(duì)象,并指定DatagramPacket對(duì)象的大小  
     DatagramPacket packet = new DatagramPacket(data,data.length);  
     //讀取接收到得數(shù)據(jù)  
     socket.receive(packet);  
     //把客戶端發(fā)送的數(shù)據(jù)轉(zhuǎn)換為字符串。  
     //使用三個(gè)參數(shù)的String方法。參數(shù)一:數(shù)據(jù)包 參數(shù)二:起始位置 參數(shù)三:數(shù)據(jù)包長  
     String result = new String(packet.getData(),packet.getOffset() ,packet.getLength());  
   } catch (SocketException e) { 
     e.printStackTrace(); 
   } catch (IOException e) { 
    e.printStackTrace(); 
   }  
 } 

以上內(nèi)容是小編給大家分享的Android Socket通信詳解的相關(guān)知識(shí),希望大家喜歡。

相關(guān)文章

  • Android自定義view之太極圖的實(shí)現(xiàn)教程

    Android自定義view之太極圖的實(shí)現(xiàn)教程

    這篇文章主要給大家介紹了關(guān)于Android自定義view之太極圖的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Android Studio打包H5網(wǎng)址頁面,封裝成APK

    Android Studio打包H5網(wǎng)址頁面,封裝成APK

    大家好,本篇文章主要講的是Android Studio打包H5網(wǎng)址頁面,封裝成APK,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • android自定義滾軸選擇器

    android自定義滾軸選擇器

    這篇文章主要為大家詳細(xì)介紹了android自定義滾軸選擇器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • Android簡單實(shí)現(xiàn)app每月簽到功能

    Android簡單實(shí)現(xiàn)app每月簽到功能

    這篇文章主要為大家詳細(xì)介紹了Android簡單實(shí)現(xiàn)app每月簽到功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • 深入剖析Android的Volley庫中的圖片加載功能

    深入剖析Android的Volley庫中的圖片加載功能

    這篇文章主要介紹了Android的Volley框架中的圖片加載功能,從源碼剖析了Volley加載圖片時(shí)的請(qǐng)求隊(duì)列處理等方面,需要的朋友可以參考下
    2016-04-04
  • Android實(shí)現(xiàn)從activity中停止Service的方法

    Android實(shí)現(xiàn)從activity中停止Service的方法

    這篇文章主要介紹了Android實(shí)現(xiàn)從activity中停止Service的方法,結(jié)合實(shí)例形式簡單分析了Android中Service的注冊(cè)、創(chuàng)建及使用stopService停止Service的方法,需要的朋友可以參考下
    2016-01-01
  • Android檢測(cè)url地址是否可達(dá)的兩種方法

    Android檢測(cè)url地址是否可達(dá)的兩種方法

    今天小編就為大家分享一篇Android檢測(cè)url地址是否可達(dá)的兩種方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • android桌面懸浮窗顯示錄屏?xí)r間控制效果

    android桌面懸浮窗顯示錄屏?xí)r間控制效果

    這篇文章主要為大家詳細(xì)介紹了android桌面懸浮窗,顯示錄屏?xí)r間控制效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • HttpURLConnection和okHttp兩種獲取網(wǎng)絡(luò)數(shù)據(jù)的實(shí)現(xiàn)方法

    HttpURLConnection和okHttp兩種獲取網(wǎng)絡(luò)數(shù)據(jù)的實(shí)現(xiàn)方法

    下面小編就為大家分享一篇HttpURLConnection和okHttp兩種獲取網(wǎng)絡(luò)數(shù)據(jù)的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • 實(shí)例解析Android系統(tǒng)中的ContentProvider組件用法

    實(shí)例解析Android系統(tǒng)中的ContentProvider組件用法

    這篇文章主要介紹了Android系統(tǒng)中的ContentProvider組件用法,舉例講解了ContentProvider傳遞數(shù)據(jù)及監(jiān)聽ContentProvider數(shù)據(jù)改變的方法,十分詳細(xì),需要的朋友可以參考下
    2016-04-04

最新評(píng)論