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

首頁 > 編程 > Java > 正文

Android開發中Socket通信的基本實現方法講解

2019-11-26 14:48:11
字體:
來源:轉載
供稿:網友

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

1.1什么是Socket Socket
是一種抽象層,應用程序通過它來發送和接收數據,使用Socket可以將應用程序添加到網絡中,與處于同一網絡中的其他應用程序進行通信。簡單來說,Socket提供了程序內部與外界通信的端口并為通信雙方的提供了數據傳輸通道。

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

二、Socket 基本通信模型

2015121145004211.jpg (593×802)

三、Socket基本實現原理

3.1基于TCP協議的Socket
服務器端首先聲明一個ServerSocket對象并且指定端口號,然后調用Serversocket的accept()方法接收客戶端的數據。accept()方法在沒有數據進行接收的處于堵塞狀態。(Socketsocket=serversocket.accept()),一旦接收到數據,通過inputstream讀取接收的數據。
  客戶端創建一個Socket對象,指定服務器端的ip地址和端口號(Socketsocket=newSocket("172.168.10.108",8080);),通過inputstream讀取數據,獲取服務器發出的數據(OutputStreamoutputstream=socket.getOutputStream()),最后將要發送的數據寫入到outputstream即可進行TCP協議的socket數據傳輸。
3.2基于UDP協議的數據傳輸
服務器端首先創建一個DatagramSocket對象,并且指點監聽的端口。接下來創建一個空的DatagramSocket對象用于接收數據(bytedata[]=newbyte[1024;]DatagramSocketpacket=newDatagramSocket(data,data.length)),使用DatagramSocket的receive方法接收客戶端發送的數據,receive()與serversocket的accepet()類似,在沒有數據進行接收的處于堵塞狀態。
客戶端也創建個DatagramSocket對象,并且指點監聽的端口。接下來創建一個InetAddress對象,這個對象類似與一個網絡的發送地址(InetAddressserveraddress=InetAddress.getByName("172.168.1.120")).定義要發送的一個字符串,創建一個DatagramPacket對象,并制定要講這個數據報包發送到網絡的那個地址以及端口號,最后使用DatagramSocket的對象的send()發送數據。*(Stringstr="hello";bytedata[]=str.getByte();DatagramPacketpacket=new DatagramPacket(data,data.length,serveraddress,4567);socket.send(packet);)

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

服務器程序需要在PC上運行,該程序比較的簡單,因此不需要建立Android項目,直接定義一個JAVA類,并且運行該類即可。它僅僅建立ServerSocket監聽,并使用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    //創建一個ServerSocket,用于監聽客戶端socket的連接請求    ServerSocket ss=new ServerSocket(30000);    //采用循環不斷接受來自客戶端的請求,服務器端也對應產生一個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("來自服務器的數據:"+line);      br.close();      socket.close();    } catch (UnknownHostException e) {      // TODO Auto-generated catch block      Log.e("UnknownHost", "來自服務器的數據");      e.printStackTrace();    } catch (IOException e) {      Log.e("IOException", "來自服務器的數據");      // TODO Auto-generated catch block      e.printStackTrace();    }  }}

需要注意的是,在Manifest.xml文件當中,需要對互聯網的訪問進行授權。

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 浦东新区| 堆龙德庆县| 东山县| 开江县| 汉寿县| 武定县| 象山县| 宽甸| 河北区| 称多县| 合水县| 齐河县| 右玉县| 江城| 安新县| 鲁山县| 安国市| 肃北| 土默特左旗| 清镇市| 桐乡市| 策勒县| 阿勒泰市| 城固县| 河源市| 迁安市| 潞城市| 阿瓦提县| 平遥县| 龙口市| 友谊县| 枣阳市| 大姚县| 霍林郭勒市| 桂平市| 虹口区| 洮南市| 平罗县| 兴安县| 沽源县| 名山县|