最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android開發(fā)中Socket通信的基本實現(xiàn)方法講解

 更新時間:2015年12月01日 14:52:35   作者:銀狐公子  
這篇文章主要介紹了Android開發(fā)中Socket通信的基本實現(xiàn)方法講解,是安卓上移動互聯(lián)網(wǎng)程序開發(fā)的基礎,需要的朋友可以參考下

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

1.1什么是Socket Socket
是一種抽象層,應用程序通過它來發(fā)送和接收數(shù)據(jù),使用Socket可以將應用程序添加到網(wǎng)絡中,與處于同一網(wǎ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é)流服務。數(shù)據(jù)報套接字使用UDP協(xié)議,提供數(shù)據(jù)打包發(fā)送服務。 下面,我們來認識一下這兩種Socket類型的基本實現(xiàn)模型。

二、Socket 基本通信模型

2015121145004211.jpg (593×802)

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

3.1基于TCP協(xié)議的Socket
服務器端首先聲明一個ServerSocket對象并且指定端口號,然后調(diào)用Serversocket的accept()方法接收客戶端的數(shù)據(jù)。accept()方法在沒有數(shù)據(jù)進行接收的處于堵塞狀態(tài)。(Socketsocket=serversocket.accept()),一旦接收到數(shù)據(jù),通過inputstream讀取接收的數(shù)據(jù)。
  客戶端創(chuàng)建一個Socket對象,指定服務器端的ip地址和端口號(Socketsocket=newSocket("172.168.10.108",8080);),通過inputstream讀取數(shù)據(jù),獲取服務器發(fā)出的數(shù)據(jù)(OutputStreamoutputstream=socket.getOutputStream()),最后將要發(fā)送的數(shù)據(jù)寫入到outputstream即可進行TCP協(xié)議的socket數(shù)據(jù)傳輸。
3.2基于UDP協(xié)議的數(shù)據(jù)傳輸
服務器端首先創(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)絡的發(fā)送地址(InetAddressserveraddress=InetAddress.getByName("172.168.1.120")).定義要發(fā)送的一個字符串,創(chuàng)建一個DatagramPacket對象,并制定要講這個數(shù)據(jù)報包發(fā)送到網(wǎng)絡的那個地址以及端口號,最后使用DatagramSocket的對象的send()發(fā)送數(shù)據(jù)。*(Stringstr="hello";bytedata[]=str.getByte();DatagramPacketpacket=new DatagramPacket(data,data.length,serveraddress,4567);socket.send(packet);)

三、Android上最簡單的socket通信實現(xiàn)示例
服務器程序

服務器程序需要在PC上運行,該程序比較的簡單,因此不需要建立Android項目,直接定義一個JAVA類,并且運行該類即可。它僅僅建立ServerSocket監(jiān)聽,并使用Socket獲取輸入輸出流。

import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class SimpleServer {

  /**
   * @param args
   * @throws IOException 
   */
  public static void main(String[] args) throws IOException {
    // TODO Auto-generated method stub

    //創(chuàng)建一個ServerSocket,用于監(jiān)聽客戶端socket的連接請求
    ServerSocket ss=new ServerSocket(30000);
    //采用循環(huán)不斷接受來自客戶端的請求,服務器端也對應產(chǎn)生一個Socket
    while(true){
      Socket s=ss.accept();
      OutputStream os=s.getOutputStream();
      os.write("您好,您收到了服務器的新年祝福!n".getBytes("utf-8"));
      os.close();
      s.close();
  }

  }}

客戶端程序

package my.learn.tcp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.EditText;

public class SimpleClient extends Activity {
  private EditText show;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    show = (EditText) findViewById(R.id.show);

    try {

      Socket socket = new Socket("自己計算機的IP地址", 30000);
      //設置10秒之后即認為是超時
      socket.setSoTimeout(10000);
      BufferedReader br = new BufferedReader(new InputStreamReader(
          socket.getInputStream()));
      String line = br.readLine();

      show.setText("來自服務器的數(shù)據(jù):"+line);

      br.close();
      socket.close();

    } catch (UnknownHostException e) {
      // TODO Auto-generated catch block
      Log.e("UnknownHost", "來自服務器的數(shù)據(jù)");
      e.printStackTrace();
    } catch (IOException e) {
      Log.e("IOException", "來自服務器的數(shù)據(jù)");
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
}

需要注意的是,在Manifest.xml文件當中,需要對互聯(lián)網(wǎng)的訪問進行授權。

<uses-permission android:name="android.permission.INTERNET"/>

相關文章

  • RabbitMQ?延遲隊列實現(xiàn)訂單支付結(jié)果異步階梯性通知(實例代碼)

    RabbitMQ?延遲隊列實現(xiàn)訂單支付結(jié)果異步階梯性通知(實例代碼)

    這篇文章主要介紹了RabbitMQ?延遲隊列實現(xiàn)訂單支付結(jié)果異步階梯性通知,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • Java?正則表達式URL?匹配與源碼全解析

    Java?正則表達式URL?匹配與源碼全解析

    在Web應用開發(fā)中,我們經(jīng)常需要對URL進行格式驗證,今天我們結(jié)合?Java?的?Pattern?和?Matcher?類,深入理解正則表達式在實際應用中的強大功能,并剖析一段實際的?Java?示例源碼,感興趣的朋友一起看看吧
    2025-04-04
  • Java ArrayAdapter用法案例詳解

    Java ArrayAdapter用法案例詳解

    這篇文章主要介紹了Java ArrayAdapter用法案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Java的Dialog和FileDialog你知道啊

    Java的Dialog和FileDialog你知道啊

    這篇文章主要為大家詳細介紹了Java的Dialog和FileDialog,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • springboot啟動腳本start.sh和停止腳本 stop.sh的詳細教程

    springboot啟動腳本start.sh和停止腳本 stop.sh的詳細教程

    這篇文章主要介紹了springboot啟動腳本start.sh和停止腳本 stop.sh的詳細教程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • Spring的循環(huán)依賴、三級緩存解決方案源碼詳細解析

    Spring的循環(huán)依賴、三級緩存解決方案源碼詳細解析

    這篇文章主要介紹了Spring的循環(huán)依賴、三級緩存解決方案源碼詳細解析,在Spring中,由于IOC的控制反轉(zhuǎn),創(chuàng)建對象不再是簡單的new出來,而是交給Spring去創(chuàng)建,會經(jīng)歷一系列Bean的生命周期才創(chuàng)建出相應的對象,需要的朋友可以參考下
    2024-01-01
  • Java通俗易懂系列設計模式之觀察者模式

    Java通俗易懂系列設計模式之觀察者模式

    這篇文章主要介紹了Java通俗易懂系列設計模式之觀察者模式,對設計模式感興趣的同學,一定要看一下
    2021-04-04
  • 解決Feign配置RequestContextHolder.getRequestAttributes()為null的問題

    解決Feign配置RequestContextHolder.getRequestAttributes()為null的問題

    這篇文章主要介紹了解決Feign配置RequestContextHolder.getRequestAttributes()為null的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • java實現(xiàn)順時針打印矩陣

    java實現(xiàn)順時針打印矩陣

    這篇文章主要為大家詳細介紹了java實現(xiàn)順時針打印矩陣的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • MyBatis Plus關閉SQL日志打印的方法

    MyBatis Plus關閉SQL日志打印的方法

    這篇文章主要介紹了MyBatis-Plus如何關閉SQL日志打印,文中通過圖文結(jié)合講解的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2024-02-02

最新評論

休宁县| 德保县| 资中县| 汉川市| 台前县| 乌苏市| 奉化市| 秭归县| 拜城县| 赞皇县| 通海县| 咸阳市| 桐柏县| 视频| 宝丰县| 灵寿县| 遵化市| 泽普县| 小金县| 调兵山市| 大名县| 六枝特区| 寿光市| 普定县| 汉沽区| 尤溪县| 武夷山市| 榆中县| 麟游县| 宜春市| 巨野县| 来宾市| 自治县| 华坪县| 柳河县| 锡林郭勒盟| 兴安县| 承德市| 高州市| 锦州市| 西乌珠穆沁旗|