Android实现TCP客户端支持读写操作

所属分类: 软件编程 / Android 阅读数: 55
收藏 0 赞 0 分享

本篇我们便来学习如何通过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;
  }
}

以上所述是小编给大家介绍的Android实现TCP客户端支持读写操作,希望对大家有所帮助!

更多精彩内容其他人还在看

Android 自定义球型水波纹带圆弧进度效果(实例代码)

最近小编接到一个这样的需求,需要实现一个圆形水波纹,带进度,两层水波纹需要渐变显示,且外围有一个圆弧进度。今天小编给大家分享实例代码,感兴趣的朋友一起看看吧
收藏 0 赞 0 分享

Flutter 实现下拉刷新上拉加载的示例代码

这篇文章主要介绍了Flutter 实现下拉刷新上拉加载的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Windows实现Flutter环境搭建及配置这一篇就够了

这篇文章主要介绍了Windows实现Flutter环境搭建及配置这一篇就够了,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Android利用碎片fragment实现底部标题栏(Github模板开源)

Fragment可以作为Activity的组成部分,一个Activity可以有多个Fragment,这篇文章主要介绍了Android利用碎片fragment实现底部标题栏(Github模板开源),需要的朋友可以参考下
收藏 0 赞 0 分享

android studio 的下拉菜单Spinner使用详解

这篇文章主要介绍了android studio 的下拉菜单Spinner使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

解析Android 8.1平台SystemUI 导航栏加载流程

这篇文章主要介绍了Android 8.1平台SystemUI 导航栏加载流程,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Android仿微信录音功能

这篇文章主要为大家详细介绍了Android仿微信录音功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android仿微信键盘切换效果

这篇文章主要为大家详细介绍了Android仿微信键盘切换效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android超清晰6.0权限申请AndPermission

这篇文章主要介绍了Android超清晰6.0权限申请AndPermission,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android仿微信录制语音功能

这篇文章主要介绍了Android仿微信录制语音功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享
查看更多