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

首頁(yè) > 系統(tǒng) > Android > 正文

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

2019-10-22 18:28:55
字體:
供稿:網(wǎng)友

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

1.開篇簡(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é)來傳輸。

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ā)過來的信息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ā)送過來信息,并用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ā)送過來的數(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ā)來的信息,并通過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方法來判斷Socket對(duì)象是否連接成功。  看到這個(gè)名字,也許讀者會(huì)產(chǎn)生誤解。  其實(shí)isConnected方法所判斷的并不是Socket對(duì)象的當(dāng)前連接狀態(tài),  而是Socket對(duì)象是否曾經(jīng)連接成功過,如果成功連接過,即使現(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)的輸入、輸出流,而它們并沒有同時(shí)關(guān)閉網(wǎng)絡(luò)連接的功能。和isClosed、isConnected方法一樣,Socket類也提供了兩個(gè)方法來判斷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)系詳解》。

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


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到Android開發(fā)頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 安化县| 都匀市| 团风县| 东丽区| 新化县| 太和县| 龙口市| 宣武区| 道孚县| 唐河县| 长兴县| 淄博市| 黎川县| 枣阳市| 泽库县| 大石桥市| 赫章县| 台北市| 武清区| 蓝田县| 那曲县| 高尔夫| 邛崃市| 兴山县| 兰溪市| 南郑县| 武义县| 固原市| 沂源县| 襄垣县| 班戈县| 汝阳县| 竹北市| 东山县| 郁南县| 梁平县| 冕宁县| 澄迈县| 永兴县| 多伦县| 巩留县|