成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

怎么在Android中實現(xiàn)Socket通信傳輸

今天就跟大家聊聊有關怎么在Android中實現(xiàn)Socket通信傳輸,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據(jù)這篇文章可以有所收獲。

成都創(chuàng)新互聯(lián)公司成都企業(yè)網(wǎng)站建設服務,提供成都做網(wǎng)站、網(wǎng)站設計網(wǎng)站開發(fā),網(wǎng)站定制,建網(wǎng)站,網(wǎng)站搭建,網(wǎng)站設計,自適應網(wǎng)站建設,網(wǎng)頁設計師打造企業(yè)風格網(wǎng)站,提供周到的售前咨詢和貼心的售后服務。歡迎咨詢做網(wǎng)站需要多少錢:18980820575

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

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

1)服務器端代碼(基于控制臺的應用程序,模擬)

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("服務器已啟動...");
      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()));
          //客戶端只要一連到服務器,便向客戶端發(fā)送下面的信息。
          msg = "服務器地址:" +this.socket.getInetAddress() + "come toal:"
            +mList.size()+"(服務器發(fā)送)";
          this.sendmsg();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
      @Override
      public void run() {
        try {
          while(true) {
            if((msg = in.readLine())!= null) {
              //當客戶端發(fā)送的信息為:exit時,關閉連接
              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+"(服務器發(fā)送)";
                this.sendmsg();
              }
            }
          }
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
     /**
      * 循環(huán)遍歷客戶端集合,給每個客戶端都發(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);
          }
        }
      }
    });
    //啟動線程,接收服務器發(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();
  }
  /**
   * 讀取服務器發(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類還有一個isConnected方法來判斷Socket對象是否連接成功。  看到這個名字,也許讀者會產(chǎn)生誤解。  其實isConnected方法所判斷的并不是Socket對象的當前連接狀態(tài),  而是Socket對象是否曾經(jīng)連接成功過,如果成功連接過,即使現(xiàn)在isClose返回true, isConnected仍然返回true。因此,要判斷當前的Socket對象是否處于連接狀態(tài), 必須同時使用isClose和isConnected方法, 即只有當isClose返回false,isConnected返回true的時候Socket對象才處于連接狀態(tài)。 雖然在大多數(shù)的時候可以直接使用Socket類或輸入輸出流的close方法關閉網(wǎng)絡連接,但有時我們只希望關閉OutputStream或InputStream,而在關閉輸入輸出流的同時,并不關閉網(wǎng)絡連接。這就需要用到Socket類的另外兩個方法:shutdownInput和shutdownOutput,這兩個方法只關閉相應的輸入、輸出流,而它們并沒有同時關閉網(wǎng)絡連接的功能。和isClosed、isConnected方法一樣,Socket類也提供了兩個方法來判斷Socket對象的輸入、輸出流是否被關閉,這兩個方法是isInputShutdown()isOutputShutdown()。 shutdownInput和shutdownOutput并不影響Socket對象的狀態(tài)。

看完上述內容,你們對怎么在Android中實現(xiàn)Socket通信傳輸有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。

文章題目:怎么在Android中實現(xiàn)Socket通信傳輸
文章路徑:http://jinyejixie.com/article38/ijjopp.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供移動網(wǎng)站建設、商城網(wǎng)站、網(wǎng)站導航、App開發(fā)標簽優(yōu)化、全網(wǎng)營銷推廣

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

外貿網(wǎng)站制作
乐清市| 自贡市| 偃师市| 秦安县| 滕州市| 大足县| 玉溪市| 揭东县| 诏安县| 本溪市| 永寿县| 鲁山县| 花莲县| 孝昌县| 南汇区| 甘谷县| 天长市| 吐鲁番市| 宝兴县| 调兵山市| 岗巴县| 阳泉市| 铜鼓县| 新宁县| 曲松县| 香港 | 邯郸市| 乌兰浩特市| 安阳县| 水富县| 娱乐| 乌拉特后旗| 宜黄县| 迭部县| 临猗县| 尉氏县| 易门县| 卓资县| 兴隆县| 马边| 疏勒县|