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

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

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

一、Socket通信簡(jiǎn)介
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)部提供了與外界通信的端口,即端口通信。通過(guò)建立socket連接,可為通信雙方的數(shù)據(jù)傳輸傳提供通道。socket的主要特點(diǎn)有數(shù)據(jù)丟失率低,使用簡(jiǎn)單且易于移植。

1.1什么是Socket Socket
是一種抽象層,應(yīng)用程序通過(guò)它來(lái)發(fā)送和接收數(shù)據(jù),使用Socket可以將應(yīng)用程序添加到網(wǎng)絡(luò)中,與處于同一網(wǎng)絡(luò)中的其他應(yīng)用程序進(jìn)行通信。簡(jiǎn)單來(lái)說(shuō),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ù)。 下面,我們來(lái)認(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()方法在沒(méi)有數(shù)據(jù)進(jìn)行接收的處于堵塞狀態(tài)。(Socketsocket=serversocket.accept()),一旦接收到數(shù)據(jù),通過(guò)inputstream讀取接收的數(shù)據(jù)。
  客戶端創(chuàng)建一個(gè)Socket對(duì)象,指定服務(wù)器端的ip地址和端口號(hào)(Socketsocket=newSocket("172.168.10.108",8080);),通過(guò)inputstream讀取數(shù)據(jù),獲取服務(wù)器發(fā)出的數(shù)據(jù)(OutputStreamoutputstream=socket.getOutputStream()),最后將要發(fā)送的數(shù)據(jù)寫(xiě)入到outputstream即可進(jìn)行TCP協(xié)議的socket數(shù)據(jù)傳輸。
3.2基于UDP協(xié)議的數(shù)據(jù)傳輸
服務(wù)器端首先創(chuàng)建一個(gè)DatagramSocket對(duì)象,并且指點(diǎn)監(jiān)聽(tīng)的端口。接下來(lái)創(chuàng)建一個(gè)空的DatagramSocket對(duì)象用于接收數(shù)據(jù)(bytedata[]=newbyte[1024;]DatagramSocketpacket=newDatagramSocket(data,data.length)),使用DatagramSocket的receive方法接收客戶端發(fā)送的數(shù)據(jù),receive()與serversocket的accepet()類似,在沒(méi)有數(shù)據(jù)進(jìn)行接收的處于堵塞狀態(tài)。
客戶端也創(chuàng)建個(gè)DatagramSocket對(duì)象,并且指點(diǎn)監(jiān)聽(tīng)的端口。接下來(lái)創(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上最簡(jiǎn)單的socket通信實(shí)現(xiàn)示例
服務(wù)器程序

服務(wù)器程序需要在PC上運(yùn)行,該程序比較的簡(jiǎn)單,因此不需要建立Android項(xiàng)目,直接定義一個(gè)JAVA類,并且運(yùn)行該類即可。它僅僅建立ServerSocket監(jiān)聽(tīng),并使用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)聽(tīng)客戶端socket的連接請(qǐng)求
    ServerSocket ss=new ServerSocket(30000);
    //采用循環(huán)不斷接受來(lái)自客戶端的請(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("來(lái)自服務(wù)器的數(shù)據(jù):"+line);

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

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

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

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

相關(guān)文章

  • 詳解spring boot starter redis配置文件

    詳解spring boot starter redis配置文件

    spring-boot-starter-Redis主要是通過(guò)配置RedisConnectionFactory中的相關(guān)參數(shù)去實(shí)現(xiàn)連接redis service。下面通過(guò)本文給大家介紹在spring boot的配置文件中redis的基本配置,需要的的朋友參考下
    2017-07-07
  • Spring Boot整合tk.mybatis代碼實(shí)例

    Spring Boot整合tk.mybatis代碼實(shí)例

    這篇文章主要介紹了Spring Boot整合tk.mybatis代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • 解決JPA @OneToMany及懶加載無(wú)效的問(wèn)題

    解決JPA @OneToMany及懶加載無(wú)效的問(wèn)題

    這篇文章主要介紹了解決JPA @OneToMany及懶加載無(wú)效的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 基于Java中兩種jersey文件上傳方式

    基于Java中兩種jersey文件上傳方式

    這篇文章主要介紹了基于Java中兩種jersey文件上傳方式的相關(guān)資料,需要的朋友可以參考下
    2016-01-01
  • Java中SpringBoot的@Transactional原理

    Java中SpringBoot的@Transactional原理

    這篇文章主要介紹了Java中SpringBoot的@Transactional原理,面向元數(shù)據(jù)遍歷已經(jīng)成為越來(lái)越多開(kāi)發(fā)者的偏好,因此原理從Springboot的EnableTransactionManagement注解說(shuō)起,需要的朋友可以參考下
    2023-07-07
  • HashMap源碼中的位運(yùn)算符&詳解

    HashMap源碼中的位運(yùn)算符&詳解

    這篇文章主要介紹了HashMap源碼中的位運(yùn)算符&詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Java?Stream對(duì)象并行處理方法parallel()代碼示例

    Java?Stream對(duì)象并行處理方法parallel()代碼示例

    在Java中Stream是一種用于處理集合數(shù)據(jù)的流式操作API,它提供了一種簡(jiǎn)潔、靈活、高效的方式來(lái)對(duì)集合進(jìn)行各種操作,下面這篇文章主要給大家介紹了關(guān)于Java?Stream對(duì)象并行處理方法parallel()的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • Java內(nèi)存管理垃圾回收基礎(chǔ)詳解

    Java內(nèi)存管理垃圾回收基礎(chǔ)詳解

    這篇文章主要為大家介紹了Java內(nèi)存管理垃圾回收基礎(chǔ)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Java使用FutureTask實(shí)現(xiàn)預(yù)加載的示例詳解

    Java使用FutureTask實(shí)現(xiàn)預(yù)加載的示例詳解

    基于FutureTask的特性,通??梢允褂肍utureTask做一些預(yù)加載工作,比如一些時(shí)間較長(zhǎng)的計(jì)算等,本文就來(lái)和大家講講具體實(shí)現(xiàn)方法吧,感興趣的可以了解一下
    2023-06-06
  • Mybatis引入與使用的圖文步驟

    Mybatis引入與使用的圖文步驟

    本文主要介紹了Mybatis引入與使用的圖文步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09

最新評(píng)論