国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android Socket通信詳解

2020-04-11 11:09:58
字體:
供稿:網(wǎng)友

一、Socket通信簡介 

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

1.1什么是Socket Socket

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

 1.2Socket的分類

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

二、Socket 基本通信模型

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

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

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

  客戶端創(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ù)傳輸。

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

服務(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)。

客戶端也創(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ù)。*(Stringstr="hello";bytedata[]=str.getByte();DatagramPacketpacket=new DatagramPacket(data,data.length,serveraddress,4567);socket.send(packet);)

四、android 實現(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端實現(xiàn):

 protected void connectServerWithTCPSocket() {      Socket socket;     try {// 創(chuàng)建一個Socket對象,并指定服務(wù)端的IP及端口號       socket = new Socket("...", );        // 創(chuàng)建一個InputStream用戶讀取要發(fā)送的文件。        InputStream inputStream = new FileInputStream("e://a.txt");        // 獲取Socket的OutputStream對象用于發(fā)送數(shù)據(jù)。        OutputStream outputStream = socket.getOutputStream();        // 創(chuàng)建一個byte類型的buffer字節(jié)數(shù)組,用于存放讀取的本地文件        byte buffer[] = new byte[ * ];        int temp = ;        // 循環(huán)讀取文件        while ((temp = inputStream.read(buffer)) != -) {          // 把數(shù)據(jù)寫入到OuputStream對象中          outputStream.write(buffer, , temp);        }        // 發(fā)送讀取的數(shù)據(jù)到服務(wù)端        outputStream.flush();          /** 或創(chuàng)建一個報文,使用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ù)器端簡單實現(xiàn):

public void ServerReceviedByTcp() {    // 聲明一個ServerSocket對象    ServerSocket serverSocket = null;    try {      // 創(chuàng)建一個ServerSocket對象,并讓這個Socket在端口監(jiān)聽      serverSocket = new ServerSocket();      // 調(diào)用ServerSocket的accept()方法,接受客戶端所發(fā)送的請求,      // 如果客戶端沒有發(fā)送數(shù)據(jù),那么該線程就停滯不繼續(xù)      Socket socket = serverSocket.accept();      // 從Socket當中得到InputStream對象      InputStream inputStream = socket.getInputStream();      byte buffer[] = new byte[ * ];      int temp = ;      // 從InputStream當中讀取客戶端所發(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ù)實現(xiàn):

protected void connectServerWithUDPSocket() {      DatagramSocket socket;    try {      //創(chuàng)建DatagramSocket對象并指定一個端口號,注意,如果客戶端需要接收服務(wù)器的返回數(shù)據(jù),      //還需要使用這個端口號來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ā)送的報文       byte data[] = str.getBytes();//把字符串str字符串轉(zhuǎn)換為字節(jié)數(shù)組       //創(chuàng)建一個DatagramPacket對象,用于發(fā)送數(shù)據(jù)。       //參數(shù)一:要發(fā)送的數(shù)據(jù) 參數(shù)二:數(shù)據(jù)的長度 參數(shù)三:服務(wù)端的網(wǎng)絡(luò)地址 參數(shù)四:服務(wù)器端端口號       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 {      //實例化的端口號要和發(fā)送時的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ù)器接收客戶端實現(xiàn):

 public void ServerReceviedByUdp(){    //創(chuàng)建一個DatagramSocket對象,并指定監(jiān)聽端口。(UDP使用DatagramSocket)     DatagramSocket socket;    try {     socket = new DatagramSocket();      //創(chuàng)建一個byte類型的數(shù)組,用于存放接收到得數(shù)據(jù)       byte data[] = new byte[*];      //創(chuàng)建一個DatagramPacket對象,并指定DatagramPacket對象的大小       DatagramPacket packet = new DatagramPacket(data,data.length);       //讀取接收到得數(shù)據(jù)       socket.receive(packet);       //把客戶端發(fā)送的數(shù)據(jù)轉(zhuǎn)換為字符串。       //使用三個參數(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)知識,希望大家喜歡。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 天等县| 剑河县| 沂源县| 牡丹江市| 娄底市| 景泰县| 涿鹿县| 阳山县| 平阳县| 色达县| 堆龙德庆县| 荔波县| 孝昌县| 呼伦贝尔市| 兰州市| 潼南县| 江门市| 瑞金市| 南皮县| 黑山县| 岚皋县| 伊川县| 曲麻莱县| 阳信县| 沙湾县| 武陟县| 自贡市| 江华| 外汇| 西乌| 双城市| 桑植县| 腾冲县| 仪陇县| 天全县| 南皮县| 石家庄市| 谷城县| 兴业县| 南投市| 金门县|