15.Android-實現TCP客戶端,支持讀寫

来源:https://www.cnblogs.com/lifexy/archive/2020/02/13/12304497.html

在上章14.Android-使用sendMessage線程之間通信我們學習瞭如何線上程之間發送數據. 接下來我們便來學習如何通過socket讀寫TCP. 需要註意的是socket必須寫在子線程中,不能在ui主線程中直接使用,所以我們這裡創建了兩個class: MainActivity(主界面)、Tc ...


在上章14.Android-使用sendMessage線程之間通信我們學習瞭如何線上程之間發送數據.

接下來我們便來學習如何通過socket讀寫TCP.

需要註意的是socket必須寫在子線程中,不能在ui主線程中直接使用,所以我們這裡創建了兩個class:

MainActivity(主界面)、TcpThread(獲取socket接收的數據)

由於代碼有註釋了,所以就不解釋了.

1.gif效果如下

 

2.activity_main.xml如下所示:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    
    <EditText 
        android:id="@+id/et_text"
        android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:layout_alignParentTop="true"
        android:hint="請填入要發送的內容"
        />
    
     <Button 
        android:id="@+id/btn_send"
        android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:layout_alignParentRight="true"
           android:layout_below="@+id/et_text"
        android:text="發送"
        />
     
     <TextView 
         android:id="@+id/tv_recv"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_below="@+id/btn_send"
         android:minLines="20"
         android:hint="接收的內容"
         />
</RelativeLayout>

3.MainActivity.java如下所示

package com.example.tcpdemo;


import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

    TcpThread mt;
    
    TextView tv_recv;
    EditText et_text;        //要發送的內容
    Button    btn_send;
    
    //定義一個handler
    public Handler mHandler = new Handler() {
        public void handleMessage(Message msg) {
            //列印伺服器端發來的消息
            System.out.println("read:"+msg.obj.toString());
            tv_recv.append(msg.obj.toString()+"\r\n");
        };
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        tv_recv =  (TextView)findViewById(R.id.tv_recv);
        et_text =  (EditText)findViewById(R.id.et_text);
        
        
        mt = new TcpThread();
        mt.setHandler(mHandler);    //設置handler
        mt.setIp("10.10.10.104");   //設置伺服器地址
        mt.start();                    //啟動線程
        
        
        btn_send =  (Button)findViewById(R.id.btn_send);
        
        btn_send.setOnClickListener(new OnClickListener() {
            
            //向伺服器端發送數據
            public void onClick(View v) {
                
                if(!mt.write(et_text.getText().toString()))
                {
                    Toast.makeText(getApplicationContext(), "發送失敗", Toast.LENGTH_SHORT).show();
                    
                }
            }
        });
    }
}

4.TcpThread.java如下所示

package com.example.tcpdemo;


import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

import android.os.Handler;
import android.os.Message;

public class TcpThread extends Thread {
    
        
        Handler mHandler=null; 
        Socket socket = null;
        String ip = null;
        OutputStream outputStream = null;        //輸出流
        InputStream inputStream=null;            //接收流
        //獲取另一個線程的Handler
        public void setHandler( Handler handler){
            mHandler = handler;
        }
        
        //設置伺服器IP
        public void setIp(String ip){
            this.ip = ip;
        }
                
        public void run(){
           
          try {
                    socket = new Socket(ip, 8080);        //訪問指定的ip地址:8080
                } catch (UnknownHostException e) { 
                    e.printStackTrace();
                } catch (IOException e) { 
                    e.printStackTrace();
                }
                
         
           //獲取輸出流
            try {
                outputStream = socket.getOutputStream();
                
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }    
            try{
                while (true)         //讀取伺服器端發送來的數據
                {
                    final byte[] buffer = new byte[1024];//創建接收緩衝區
                    inputStream = socket.getInputStream();
                    final int len = inputStream.read(buffer);//數據讀出來,並且返回數據的長度
                    if(len>0)
                    {
                         Message msg = mHandler.obtainMessage(); 
                         //設置發送的內容
                         msg.obj = new String(buffer,0,len); 
                         mHandler.sendMessage(msg);  
                    }
                    
                }
            }
            catch (IOException e) {
                
            }
            
        }
        
        //向伺服器端寫入數據
        public boolean write(String text){
            
            boolean ret = true;
            try {
                outputStream.write(text.toString().getBytes());
            } catch (IOException e) { 
                ret = false;
                e.printStackTrace();
            }
            return ret;
        }
}

 


您的分享是我們最大的動力!

更多相關文章
  • 下載安裝Kibana 1. 下載地址:https://www.elastic.co/cn/downloads/kibana 2. 解壓下載的壓縮包 [[email protected] ~]# tar -zxvf kibana-7.6.0-linux-x86_64.tar.gz 3. 給es用戶分配許可權 ...
  • 前面文章分享了Linux下常用命令以及Shell編程相關知識,本節繼續學習Linux用戶管理及文件許可權控制。 ...
  • CRUD 在我們的項目中有日誌是一個必不可少的東西,但是日誌的檢索是一個很麻煩的事情,如每天一個日誌,要找到問題就得一個一個找,並不能做到檢索功能,這還算好的,如果是分散式的,每個機器都得找一遍,這種效率太低,當然可以把日誌收集到一個文件中,多個機器每天的日誌可以收集到一塊,如果把所有的日誌收集一塊 ...
  • sprd_battery.c 是充電驅動,這個是充電功能的核心內容,電量顯示策略、溫度檢測策略、充電保護機制等功能在這裡實現,功能實現與硬體細節剝離,調用通用介面實現邏輯控制; 1 sprdbat_probe函數: 1.1 解析設備樹: sprdbat_parse_dt函數如下: 2. 各個工作隊列 ...
  • 鳴謝:http://blog.csdn.net/leimengyuanlian/article/details/18748599 http://www.cnblogs.com/maowang1991/archive/2013/02/05/2893142.html https://www.cnblog ...
  • 編譯安裝redisd [toc] 安裝方法: yum安裝 1. 查看yum倉庫redis版本 2. yum安裝 3. 啟動服務並設為開機啟動 4. 查看redis埠 5. 測試登錄redis 6. 測試使用 編譯安裝 下載當前最新release版本redis源碼包 :http://download ...
  • Apache Flink社區宣佈Flink 1.10.0正式發佈! 本次Release版本修複1.2K個問題,對Flink作業的整體性能和穩定性做了重大改進,同時增加了對K8S,Python的支持。 這個版本標志著與Blink集成的完成,並且強化了流式SQL與Hive的集成,本文將詳細介紹新功能和主 ...
  • 1、使用 show status 瞭解各種 SQL 的執行頻率 該命令可以查詢 sql 命令的執行次數。 2、定位執行效率較低的 SQL 語句 定位執行效率較低的 SQL 一般有兩種方法: 1. 通過慢查詢日誌定位效率低的 SQL,用 該選項啟動; 2. 慢查詢日誌在查詢結束後才會記錄,所以在應用執 ...
一周排行
  • 在園子裡面有很多關於各種技術細節的研究文章,都是比較牛逼的框架研究;但是一直沒有看到關於怎麼樣提高開發效率的文章,大多提高開發效率的文章都是關於自動化等方面的輔助工具類型的,而不是開發中的一些小技巧;今天從編碼規範、編碼技巧、開發思想、設計模式等各方面的經驗來分享如何提高開發效率。 ...
  • 前言 隨著近些年微服務的流行,有越來越多的開發者和團隊所採納和使用,它的確提供了很多的優勢也解決了很多的問題,但是我們也知道也並不是銀彈,提供優勢的同時它也給我們的開發人員和團隊也帶來了很多的挑戰。 為了迎接或者採用這些新技術,開發團隊需要更加註重一些流程或工具的使用,這樣才能更好的適應這些新技術所 ...
  • 本文是本系列的完結篇。本系列前面的文章: 邏輯式編程語言極簡實現(使用C#) - 1. 邏輯式編程語言介紹 邏輯式編程語言極簡實現(使用C#) - 2. 一道邏輯題:誰是凶手 邏輯式編程語言極簡實現(使用C#) - 3. 運行原理 下午,吃飽飯的老明和小皮,各拿著一杯剛買的咖啡回到會議室,開始了邏輯 ...
  • 微服務之間的通信之gRPC 介紹 gRPC是一種與語言無關的高性能遠程過程調用 (RPC) 框架,gRPC是Google發佈的基於HTTP 2.0傳輸層協議承載的高性能開源軟體框架,提供了支持多種編程語言的、對網路設備進行配置和納管的方法。由於是開源框架,通信的雙方可以進行二次開發,所以客戶端和服務 ...
  • 一、TLS 線程本地存儲(Thread Local Storage),字面意思就是專屬某個線程的存儲空間。變數大體上分為全局變數和局部變數,一個進程中的所有線程共用地址空間,這個地址空間被劃分為幾個固有的區域,比如堆棧區,全局變數區等,全局變數存儲在全局變數區,虛擬地址固定;局部變數存儲在堆棧區,虛... ...
  • private:私有成員,在類的內部才可以訪問。 protected:保護成員,該類內部和繼承類中可以訪問。 public:公共成員,完全公開,沒有訪問限制。 internal:當前程式集內可以訪問。 ...
  • 前言 上一篇【.Net Core微服務入門全紀錄(六)——EventBus-事件匯流排】中使用CAP完成了一個簡單的Eventbus,實現了服務之間的解耦和非同步調用,並且做到數據的最終一致性。這一篇將使用IdentityServer4來搭建一個鑒權中心,來完成授權認證相關的功能。 IdentitySe ...
  • using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System. ...
  • 從今天起,我將製作一個電影推薦項目,在此寫下博客,記錄每天的成果。 其實,從我發佈 C# 爬取貓眼電影數據 這篇博客後, 我就已經開始製作電影推薦項目了,今天寫下這篇博客,也是因為項目進度已經完成50%了,我就想在這一階段停一下,回顧之前學到的知識。 一、主要為手機端 考慮到項目要有實用性,我選擇了 ...
  • 一、實現Runnable介面 public class RunnableDemo implements Runnable { public void run() { try { Thread.sleep(100); } catch (InterruptedException e) { e.print ...