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

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

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

一、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 基本通信模型

2015121145004211.jpg (593×802)

三、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上最簡單的socket通信實(shí)現(xiàn)示例
服務(wù)器程序

服務(wù)器程序需要在PC上運(yùn)行,該程序比較的簡單,因此不需要建立Android項(xiàng)目,直接定義一個(gè)JAVA類,并且運(yùn)行該類即可。它僅僅建立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)建一個(gè)ServerSocket,用于監(jiān)聽客戶端socket的連接請(qǐng)求
    ServerSocket ss=new ServerSocket(30000);
    //采用循環(huán)不斷接受來自客戶端的請(qǐng)求,服務(wù)器端也對(duì)應(yīng)產(chǎn)生一個(gè)Socket
    while(true){
      Socket s=ss.accept();
      OutputStream os=s.getOutputStream();
      os.write("您好,您收到了服務(wù)器的新年祝福!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("自己計(jì)算機(jī)的IP地址", 30000);
      //設(shè)置10秒之后即認(rèn)為是超時(shí)
      socket.setSoTimeout(10000);
      BufferedReader br = new BufferedReader(new InputStreamReader(
          socket.getInputStream()));
      String line = br.readLine();

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

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

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

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

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

相關(guān)文章

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

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

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

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

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

    Java ArrayAdapter用法案例詳解

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

    Java的Dialog和FileDialog你知道啊

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

    springboot啟動(dòng)腳本start.sh和停止腳本 stop.sh的詳細(xì)教程

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

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

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

    Java通俗易懂系列設(shè)計(jì)模式之觀察者模式

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

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

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

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

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

    MyBatis Plus關(guān)閉SQL日志打印的方法

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

最新評(píng)論

红原县| 普宁市| 辽中县| 安徽省| 阿坝| 华宁县| 镶黄旗| 错那县| 霍邱县| 巧家县| 斗六市| 库伦旗| 遂溪县| 苗栗县| 托里县| 九台市| 鄂州市| 丹寨县| 中山市| 福清市| 浦北县| 庆安县| 丹阳市| 松原市| 嘉义县| 沾化县| 宁陵县| 永兴县| 顺昌县| 板桥市| 休宁县| 商城县| 金秀| 竹北市| 全椒县| 岳普湖县| 永善县| 响水县| 城口县| 南乐县| 开鲁县|