<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      安卓筆記俠

      專注安卓開發

      導航

      Android IPC機制(五)用Socket實現跨進程聊天程序

      1.Socket簡介

      Socket也稱作“套接字“,是在應用層和傳輸層之間的一個抽象層,它把TCP/IP層復雜的操作抽象為幾個簡單的接口供應用層調用以實現進程在網絡中通信。它分為流式套接字和數據包套接字,分別對應網絡傳輸控制層的TCP和UDP協議。TCP協議是一種面向連接的、可靠的、基于字節流的傳輸層通信協議。它使用三次握手協議建立連接,并且提供了超時重傳機制,具有很高的穩定性。UDP協議則是是一種無連接的協議,且不對傳送數據包進行可靠性保證,適合于一次傳輸少量數據,UDP傳輸的可靠性由應用層負責。在網絡質量令人十分不滿意的環境下,UDP協議數據包丟失會比較嚴重。但是由于UDP的特性:它不屬于連接型協議,因而具有資源消耗小,處理速度快的優點,所以通常音頻、視頻和普通數據在傳送時使用UDP較多。 
      這里寫圖片描述

      從上圖我們也可以看出,不同的用戶進程通過Socket來進行通信,所以Socket也是一種IPC方式,接下來我們用TCP服務來實現一個簡單的聊天程序。

      2.實現聊天程序服務端

      配置

      首先我們來實現服務端,當然要使用Socket我們需要在AndroidManifest.xml聲明如下的權限:

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

      我們需要實現一個遠程的Service來當作聊天程序的服務端,AndroidManifest.xml文件中配置service:

      <service
                  android:name=".SocketServerService"
                  android:process=":remote" />
      

      實現Service

      接下來我們在Service啟動時,在線程中建立TCP服務,我們監聽的是8688端口,等待客戶端連接,當客戶端連接時就會生成Socket。通過每次創建的Socket就可以和不同的客戶端通信了。當客戶端斷開連接時,服務端也會關閉Socket并結束結束通話線程。服務端首先會向客戶端發送一條消息:“您好,我是服務端”,并接收客戶端發來的消息,將收到的消息進行加工再返回給客戶端。

      package com.example.liuwangshu.moonsocket;
      import android.app.Service;
      import android.content.Intent;
      import android.os.IBinder;
      import android.text.TextUtils;
      import android.util.Log;
      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;
      
      public class SocketServerService extends Service {
          private boolean isServiceDestroyed = false;
      
          @Override
          public void onCreate() {
              new Thread(new TcpServer()).start();
              super.onCreate();
          }
      
          @Override
          public IBinder onBind(Intent intent) {
              // TODO: Return the communication channel to the service.
              throw new UnsupportedOperationException("Not yet implemented");
          }
      
          private class TcpServer implements Runnable {
              @Override
              public void run() {
                  ServerSocket serverSocket;
                  try {
                      //監聽8688端口
                      serverSocket = new ServerSocket(8688);
                  } catch (IOException e) {
      
                      return;
                  }
                  while (!isServiceDestroyed) {
                      try {
                          // 接受客戶端請求,并且阻塞直到接收到消息
                          final Socket client = serverSocket.accept();
                          new Thread() {
                              @Override
                              public void run() {
                                  try {
                                      responseClient(client);
                                  } catch (IOException e) {
                                      e.printStackTrace();
                                  }
                              }
                          }.start();
                      } catch (IOException e) {
                          e.printStackTrace();
                      }
                  }
              }
          }
      
          private void responseClient(Socket client) throws IOException {
              // 用于接收客戶端消息
              BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
              // 用于向客戶端發送消息
              PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(client.getOutputStream())), true);
              out.println("您好,我是服務端");
              while (!isServiceDestroyed) {
                  String str = in.readLine();
                  Log.i("moon", "收到客戶端發來的信息" + str);
                  if (TextUtils.isEmpty(str)) {
                      //客戶端斷開了連接
                      Log.i("moon", "客戶端斷開連接");
                      break;
                  }
                  String message = "收到了客戶端的信息為:" + str;
                  // 從客戶端收到的消息加工再發送給客戶端
                  out.println(message);
              }
              out.close();
              in.close();
              client.close();
          }
      
          @Override
          public void onDestroy() {
              isServiceDestroyed = true;
              super.onDestroy();
          }
      }
      

      3.實現聊天程序客戶端

      客戶端Activity會在onCreate方法中啟動服務端,并開啟線程連接服務端Socket。為了確保能連接成功,采用了超時重連的策略,每次連接失敗時都會重新建立連接。連接成功后,客戶端會收到服務端發送的消息:“您好,我是服務端”,我們也可以在EditText輸入字符并發送到服務端。

      package com.example.liuwangshu.moonsocket;
      
      import android.content.Intent;
      import android.os.SystemClock;
      import android.support.v7.app.AppCompatActivity;
      import android.os.Bundle;
      import android.text.TextUtils;
      import android.view.View;
      import android.widget.Button;
      import android.widget.EditText;
      import android.widget.TextView;
      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;
      
      
      public class SocketClientActivity extends AppCompatActivity {
          private Button bt_send;
          private EditText et_receive;
          private Socket mClientSocket;
          private PrintWriter mPrintWriter;
          private TextView tv_message;
      
      
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_socket);
              initView();
              Intent service = new Intent(this, SocketServerService.class);
              startService(service);
              new Thread() {
                  @Override
                  public void run() {
                      connectSocketServer();
                  }
              }.start();
      
          }
      
          private void initView() {
              et_receive= (EditText) findViewById(R.id.et_receive);
              bt_send= (Button) findViewById(R.id.bt_send);
              tv_message= (TextView) this.findViewById(R.id.tv_message);
              bt_send.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      final String msg = et_receive.getText().toString();
                      //向服務器發送信息
                      if(!TextUtils.isEmpty(msg)&&null!=mPrintWriter) {
                          mPrintWriter.println(msg);
                          tv_message.setText(tv_message.getText() + "\n" + "客戶端:" + msg);
                          et_receive.setText("");
                      }
                  }
              });
      
          }
      
          private void connectSocketServer() {
              Socket socket = null;
              while (socket == null) {
                  try {
                      //選擇和服務器相同的端口8688
                      socket = new Socket("localhost", 8688);
                      mClientSocket = socket;
                      mPrintWriter = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
                  } catch (IOException e) {
                      SystemClock.sleep(1000);
              }
              }
              try {
                  // 接收服務器端的消息
                  BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                  while (!isFinishing()) {
                      final String msg = br.readLine();
                      if (msg != null) {
                          runOnUiThread(new Runnable() {
                                            @Override
                                            public void run() {
                                                tv_message.setText(tv_message.getText() + "\n" + "服務端:" + msg);
                                            }
                                        }
                          );
                      }
                  }
                  mPrintWriter.close();
                  br.close();
                  socket.close();
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
      
      }
      

      布局很簡單(activity_socket.xml):

      <?xml version="1.0" encoding="utf-8"?>
      <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="match_parent"
          android:layout_height="match_parent">
      
          <TextView
              android:id="@+id/tv_message"
              android:layout_width="match_parent"
              android:layout_height="400dp" />
      
          <LinearLayout
              android:layout_width="match_parent"
              android:layout_height="50dp"
              android:layout_alignParentBottom="true"
              android:orientation="horizontal">
      
              <EditText
                  android:id="@+id/et_receive"
                  android:layout_width="0dp"
                  android:layout_height="match_parent"
                  android:layout_weight="2"
                  />
      
              <Button
                  android:id="@+id/bt_send"
                  android:layout_width="0dp"
                  android:layout_height="match_parent"
                  android:layout_weight="1"
                  android:text="向服務器發消息" />
          </LinearLayout>
      </RelativeLayout>
      

      4.運行聊天程序

      運行程序,我們可以看到客戶端和服務端是兩個進程: 
      這里寫圖片描述

      客戶端首先會收到服務端的信息:”您好,我是服務端”,接下來我們向服務端發送“我想要怒放的生命”。這時候服務端收到了這條信息并返回給客戶端加工后的這條信息: 
      這里寫圖片描述

        

        

      https://github.com/henrymorgen/MoonSocket  

        

      posted on 2018-07-10 11:18  安卓筆記俠  閱讀(1045)  評論(0)    收藏  舉報

      主站蜘蛛池模板: 91福利视频一区二区| 北辰区| 亚洲精品一区二区三区免| 长海县| 国产精品成人久久电影| 免费人成在线观看网站| 久久精品国产亚洲不AV麻豆| 欧美级特黄aaaaaa片| 国产精品毛片av999999| 精品人妻系列无码天堂| 少妇被粗大的猛烈进出视频 | 性色欲情网站iwww九文堂| 国产精品无码a∨麻豆| 在线免费不卡视频| 国产伦一区二区三区视频| 无码av中文字幕免费放| 久久av无码精品人妻出轨| 幻女free性俄罗斯毛片| 97久久精品人人做人人爽| 波多野结衣的av一区二区三区| 久久亚洲人成网站| 精品精品国产国产自在线| 99精品久久毛片a片| 四虎国产精品成人免费久久| 亚洲人妻一区二区精品| 国产精品无码专区| 最近免费中文字幕大全| 狠狠色婷婷久久综合频道日韩| 迭部县| 国产av一区二区不卡| 2020精品自拍视频曝光| 亚洲日韩图片专区第1页| 日韩av不卡一区二区在线| 日韩成人一区二区三区在线观看| 日韩在线一区二区每天更新| 中国熟女仑乱hd| 乱码视频午夜在线观看| 少妇高潮流白浆在线观看| 色哟哟www网站入口成人学校| 高清国产一区二区无遮挡| 国产精品二区中文字幕|