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

Android開(kāi)發(fā)之Socket通信傳輸簡(jiǎn)單示例

 更新時(shí)間:2017年08月30日 12:10:37   作者:Devin Zhang  
這篇文章主要介紹了Android開(kāi)發(fā)之Socket通信傳輸實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Android socket傳輸?shù)脑怼?shí)現(xiàn)方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了Android Socket通信傳輸實(shí)現(xiàn)方法。分享給大家供大家參考,具體如下:

1.開(kāi)篇簡(jiǎn)介

Socket本質(zhì)上就是Java封裝了傳輸層上的TCP協(xié)議(注:UDP用的是DatagramSocket類)。要實(shí)現(xiàn)Socket的傳輸,需要構(gòu)建客戶端和服務(wù)器端。另外,傳輸?shù)臄?shù)據(jù)可以是字符串和字節(jié)。字符串傳輸主要用于簡(jiǎn)單的應(yīng)用,比較復(fù)雜的應(yīng)用(比如Java和C++進(jìn)行通信),往往需要構(gòu)建自己的應(yīng)用層規(guī)則(類似于應(yīng)用層協(xié)議),并用字節(jié)來(lái)傳輸。

2.基于字符串傳輸?shù)腟ocket案例

1)服務(wù)器端代碼(基于控制臺(tái)的應(yīng)用程序,模擬)

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main {
  private static final int PORT = 9999;
  private List<Socket> mList = new ArrayList<Socket>();
  private ServerSocket server = null;
  private ExecutorService mExecutorService = null; //thread pool
  public static void main(String[] args) {
    new Main();
  }
  public Main() {
    try {
      server = new ServerSocket(PORT);
      mExecutorService = Executors.newCachedThreadPool(); //create a thread pool
      System.out.println("服務(wù)器已啟動(dòng)...");
      Socket client = null;
      while(true) {
        client = server.accept();
        //把客戶端放入客戶端集合中
        mList.add(client);
        mExecutorService.execute(new Service(client)); //start a new thread to handle the connection
      }
    }catch (Exception e) {
      e.printStackTrace();
    }
  }
  class Service implements Runnable {
      private Socket socket;
      private BufferedReader in = null;
      private String msg = "";
      public Service(Socket socket) {
        this.socket = socket;
        try {
          in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
          //客戶端只要一連到服務(wù)器,便向客戶端發(fā)送下面的信息。
          msg = "服務(wù)器地址:" +this.socket.getInetAddress() + "come toal:"
            +mList.size()+"(服務(wù)器發(fā)送)";
          this.sendmsg();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
      @Override
      public void run() {
        try {
          while(true) {
            if((msg = in.readLine())!= null) {
              //當(dāng)客戶端發(fā)送的信息為:exit時(shí),關(guān)閉連接
              if(msg.equals("exit")) {
                System.out.println("ssssssss");
                mList.remove(socket);
                in.close();
                msg = "user:" + socket.getInetAddress()
                  + "exit total:" + mList.size();
                socket.close();
                this.sendmsg();
                break;
                //接收客戶端發(fā)過(guò)來(lái)的信息msg,然后發(fā)送給客戶端。
              } else {
                msg = socket.getInetAddress() + ":" + msg+"(服務(wù)器發(fā)送)";
                this.sendmsg();
              }
            }
          }
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
     /**
      * 循環(huán)遍歷客戶端集合,給每個(gè)客戶端都發(fā)送信息。
      */
      public void sendmsg() {
        System.out.println(msg);
        int num =mList.size();
        for (int index = 0; index < num; index ++) {
          Socket mSocket = mList.get(index);
          PrintWriter pout = null;
          try {
            pout = new PrintWriter(new BufferedWriter(
                new OutputStreamWriter(mSocket.getOutputStream())),true);
            pout.println(msg);
          }catch (IOException e) {
            e.printStackTrace();
          }
        }
      }
    }
}

2)Android客戶端代碼

package com.amaker.socket;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class SocketDemo extends Activity implements Runnable {
  private TextView tv_msg = null;
  private EditText ed_msg = null;
  private Button btn_send = null;
  // private Button btn_login = null;
  private static final String HOST = "10.0.2.2";
  private static final int PORT = 9999;
  private Socket socket = null;
  private BufferedReader in = null;
  private PrintWriter out = null;
  private String content = "";
  //接收線程發(fā)送過(guò)來(lái)信息,并用TextView顯示
  public Handler mHandler = new Handler() {
    public void handleMessage(Message msg) {
      super.handleMessage(msg);
      tv_msg.setText(content);
    }
  };
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    tv_msg = (TextView) findViewById(R.id.TextView);
    ed_msg = (EditText) findViewById(R.id.EditText01);
    btn_send = (Button) findViewById(R.id.Button02);
    try {
      socket = new Socket(HOST, PORT);
      in = new BufferedReader(new InputStreamReader(socket
          .getInputStream()));
      out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(
          socket.getOutputStream())), true);
    } catch (IOException ex) {
      ex.printStackTrace();
      ShowDialog("login exception" + ex.getMessage());
    }
    btn_send.setOnClickListener(new Button.OnClickListener() {
      @Override
      public void onClick(View v) {
        // TODO Auto-generated method stub
        String msg = ed_msg.getText().toString();
        if (socket.isConnected()) {
          if (!socket.isOutputShutdown()) {
            out.println(msg);
          }
        }
      }
    });
    //啟動(dòng)線程,接收服務(wù)器發(fā)送過(guò)來(lái)的數(shù)據(jù)
    new Thread(SocketDemo.this).start();
  }
  /**
   * 如果連接出現(xiàn)異常,彈出AlertDialog!
   */
  public void ShowDialog(String msg) {
    new AlertDialog.Builder(this).setTitle("notification").setMessage(msg)
        .setPositiveButton("ok", new DialogInterface.OnClickListener() {
          @Override
          public void onClick(DialogInterface dialog, int which) {
          }
        }).show();
  }
  /**
   * 讀取服務(wù)器發(fā)來(lái)的信息,并通過(guò)Handler發(fā)給UI線程
   */
  public void run() {
    try {
      while (true) {
        if (!socket.isClosed()) {
          if (socket.isConnected()) {
            if (!socket.isInputShutdown()) {
              if ((content = in.readLine()) != null) {
                content += "\n";
                mHandler.sendMessage(mHandler.obtainMessage());
              } else {
              }
            }
          }
        }
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

解析:除了isClose方法,Socket類還有一個(gè)isConnected方法來(lái)判斷Socket對(duì)象是否連接成功。  看到這個(gè)名字,也許讀者會(huì)產(chǎn)生誤解。  其實(shí)isConnected方法所判斷的并不是Socket對(duì)象的當(dāng)前連接狀態(tài),  而是Socket對(duì)象是否曾經(jīng)連接成功過(guò),如果成功連接過(guò),即使現(xiàn)在isClose返回true, isConnected仍然返回true。因此,要判斷當(dāng)前的Socket對(duì)象是否處于連接狀態(tài), 必須同時(shí)使用isClose和isConnected方法, 即只有當(dāng)isClose返回false,isConnected返回true的時(shí)候Socket對(duì)象才處于連接狀態(tài)。 雖然在大多數(shù)的時(shí)候可以直接使用Socket類或輸入輸出流的close方法關(guān)閉網(wǎng)絡(luò)連接,但有時(shí)我們只希望關(guān)閉OutputStreamInputStream,而在關(guān)閉輸入輸出流的同時(shí),并不關(guān)閉網(wǎng)絡(luò)連接。這就需要用到Socket類的另外兩個(gè)方法:shutdownInputshutdownOutput,這兩個(gè)方法只關(guān)閉相應(yīng)的輸入、輸出流,而它們并沒(méi)有同時(shí)關(guān)閉網(wǎng)絡(luò)連接的功能。和isClosed、isConnected方法一樣,Socket類也提供了兩個(gè)方法來(lái)判斷Socket對(duì)象的輸入、輸出流是否被關(guān)閉,這兩個(gè)方法是isInputShutdown()isOutputShutdown()。 shutdownInput和shutdownOutput并不影響Socket對(duì)象的狀態(tài)。

2.基于字節(jié)的傳輸

基于字節(jié)傳輸?shù)臅r(shí)候,只需要把相應(yīng)的字符串和整數(shù)等類型轉(zhuǎn)換為對(duì)應(yīng)的網(wǎng)絡(luò)字節(jié)進(jìn)行傳輸即可。具體關(guān)于如何把其轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié),請(qǐng)參《Java整型數(shù)與網(wǎng)絡(luò)字節(jié)序byte[]數(shù)組轉(zhuǎn)換關(guān)系詳解》。

更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android通信方式總結(jié)》、《Android開(kāi)發(fā)入門與進(jìn)階教程》、《Android調(diào)試技巧與常見(jiàn)問(wèn)題解決方法匯總》、《Android多媒體操作技巧匯總(音頻,視頻,錄音等)》、《Android基本組件用法總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》及《Android控件用法總結(jié)

希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • Android自定義圓環(huán)倒計(jì)時(shí)控件

    Android自定義圓環(huán)倒計(jì)時(shí)控件

    這篇文章主要為大家詳細(xì)介紹了Android自定義圓環(huán)倒計(jì)時(shí)控件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • 基于Flutter制作一個(gè)火箭發(fā)射動(dòng)畫(huà)

    基于Flutter制作一個(gè)火箭發(fā)射動(dòng)畫(huà)

    北京時(shí)間10月16日0時(shí)23分,神舟十三號(hào)飛船成功發(fā)射,為慶祝這一喜事,本文將用Flutter制作一個(gè)火箭發(fā)射動(dòng)畫(huà),感興趣的小伙伴可以動(dòng)手試一試
    2022-03-03
  • RxJava取消訂閱的各種方式的實(shí)現(xiàn)

    RxJava取消訂閱的各種方式的實(shí)現(xiàn)

    這篇文章主要介紹了RxJava取消訂閱的各種方式的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 實(shí)例講解Android應(yīng)用中自定義組合控件的方法

    實(shí)例講解Android應(yīng)用中自定義組合控件的方法

    這篇文章主要介紹了實(shí)例講解Android應(yīng)用中自定義組合控件的方法,通過(guò)例子講解了view組合控件及自定義屬性的用法,需要的朋友可以參考下
    2016-04-04
  • Retrofit網(wǎng)絡(luò)請(qǐng)求和響應(yīng)處理重點(diǎn)分析講解

    Retrofit網(wǎng)絡(luò)請(qǐng)求和響應(yīng)處理重點(diǎn)分析講解

    這篇文章主要介紹了Retrofit網(wǎng)絡(luò)請(qǐng)求和響應(yīng)處理重點(diǎn)分析,在使用?Retrofit發(fā)起網(wǎng)絡(luò)請(qǐng)求時(shí),我們可以通過(guò)定義一個(gè)接口并使用Retrofit的注解來(lái)描述這個(gè)接口中的請(qǐng)求,Retrofit會(huì)自動(dòng)生成一個(gè)實(shí)現(xiàn)該接口的代理對(duì)象
    2023-03-03
  • Android入門之Menu組件的使用教程詳解

    Android入門之Menu組件的使用教程詳解

    這篇文章主要為大家詳細(xì)介紹了Android中常用的幾個(gè)Menu組件的使用教程,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的可以了解一下
    2022-11-11
  • 舉例講解Android應(yīng)用中SimpleAdapter簡(jiǎn)單適配器的使用

    舉例講解Android應(yīng)用中SimpleAdapter簡(jiǎn)單適配器的使用

    這篇文章主要介紹了Android應(yīng)用中SimpleAdapter簡(jiǎn)單適配器的使用例子,SimpleAdapter經(jīng)常在ListView被使用,需要的朋友可以參考下
    2016-04-04
  • Android?控件自動(dòng)貼邊實(shí)現(xiàn)實(shí)例詳解

    Android?控件自動(dòng)貼邊實(shí)現(xiàn)實(shí)例詳解

    這篇文章主要為大家介紹了Android?控件自動(dòng)貼邊實(shí)現(xiàn)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Android中EditText setText方法的踩坑實(shí)戰(zhàn)

    Android中EditText setText方法的踩坑實(shí)戰(zhàn)

    這篇文章主要給大家分享了一些關(guān)于Android中EditText setText方法的踩坑記錄,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)各位Android開(kāi)發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • android新建草稿刪除后下次開(kāi)機(jī)還會(huì)顯示保存的草稿

    android新建草稿刪除后下次開(kāi)機(jī)還會(huì)顯示保存的草稿

    android 新建一個(gè)草稿,保存,然后全部刪除會(huì)話,關(guān)機(jī)再開(kāi)機(jī)后還會(huì)顯示保存的草稿,下面與大家分享下具體的解決方法
    2013-06-06

最新評(píng)論