国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Android開發中Socket通信的基本實現方法講解

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

2020-03-06 19:49銀狐公子 JAVA教程

這篇文章主要介紹了Android開發中Socket通信的基本實現方法講解,是安卓上移動互聯網程序開發的基礎,需要的朋友可以參考下

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

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

三、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獲取輸入輸出流。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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();
  }
 
  }}

客戶端程序

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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文件當中,需要對互聯網的訪問進行授權。

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 视频一区 日韩 | 天天干天天操天天射 | 欧美亚洲天堂 | 亚洲视频综合网 | 亚洲精品乱码久久久久久金桔影视 | 婷婷五月色综合 | 亚洲欧美另类久久久精品2019 | 欧美一区二区三区精品 | 黄色在线观看网站 | 免费观看黄视频网站 | 久久亚洲国产精品 | 午夜精品一区二区三区在线视频 | 久久夜色精品国产 | 亚洲永久免费 | 日本高清视频网站www | 日韩精品在线一区 | 亚洲欧美在线免费 | 亚洲高清资源 | 国产一区二区三区视频在线观看 | 久久精品电影网 | 中文字幕欧美激情 | 亚洲成人影音 | 中文字幕 国产精品 | 精品免费视频 | 精品亚洲一区二区 | 中文字幕精品一区 | 久久99亚洲精品 | 伊人网综合 | 亚洲精品1区2区 | 中文字幕在线一区 | 91黄视频 | 免费成人在线电影 | 一区二区不卡视频 | 国产精选一区二区三区不卡催乳 | 好看的国产精彩视频 | 亚洲午夜av久久乱码 | 欧美日韩在线精品 | 欧美日视频 | 精品国产黄a∨片高清在线 欧美一级免费 | 免费看的av| 日韩手机在线 |