最近在做一个机器人的项目,需要用到TCP通讯这个东西。需要在手机做一个客户端,然后上去网上查了巨久巨多代码,为了避免让有需要的人少走弯路,就做一篇博文来推一下自己的做法,如果各位大大们有什么好的建议,也希望各位可以在评论区写下高见抑或是邮箱到1262706641@qq.com。
由于个人的时间问题,目前这个工程的mian文件加已经上传到github上进行管理,各位大佬可以自取。
传送门:https://github.com/KinFaiLeong/Android-TCP

首先是布局文件的代码:

<?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"android:orientation="vertical"><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentTop="true"><EditTextandroid:id="@+id/ip"android:layout_width="280dp"android:layout_height="50dp"android:background="#7CB342"android:hint="IP:"android:textColor="#ffffff"/><EditTextandroid:id="@+id/port"android:layout_width="match_parent"android:layout_height="50dp"android:hint="端口:"android:background="#C0CA33"android:layout_toRightOf="@id/ip"android:inputType="number"/><Buttonandroid:id="@+id/connect"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@id/port"android:text="连接服务器"/></RelativeLayout><RelativeLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentBottom="true"><TextViewandroid:id="@+id/receive"android:layout_width="match_parent"android:layout_height="100dp"android:background="#00ACC1"android:textColor="#FFFFFF"android:hint="接收区"android:textSize="18sp"android:gravity="center_horizontal"/><EditTextandroid:id="@+id/send"android:layout_width="match_parent"android:layout_height="100dp"android:background="#3949AB"android:hint="发送:"android:textColor="#ffffff"android:layout_below="@id/receive"/><Buttonandroid:id="@+id/btn_1"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="发送"android:layout_below="@+id/send"/></RelativeLayout>
</RelativeLayout>

为了更方便以后的维护和迭代,我将发送模块、连接接收模块放在了不同的线程之中。
接下来先来看看最简单的 发送线程 代码。

    //线程名:Sendpublic class Send extends Thread {private String send;private OutputStream outputStream;private  InputStream inputStream;private String ip;private int port;public Send(String msg,int port,String ip) {this.send = msg;this.ip = ip;this.port = port;}@Overridepublic void run() {try {Socket socket = new Socket(ip,port);send="客户端发来:"+send;inputStream = socket.getInputStream();outputStream = socket.getOutputStream();outputStream.write((send+"\n").getBytes("utf-8"));outputStream.flush();Log.v("AndroidChat","发送成功:"+send);}catch (Exception e){Log.v("AndroidChat","发送失败:"+send+"error"+e.getMessage());e.printStackTrace();}}
 Socket,套接字。利用这个建立和服务器之间的连接,会用就行,想深入了解去看其他大大的详解,这里不做赘述。

(这里插入一些题外话,无论代码有多长,建议各位都应当逐个函数的输入,复制粘贴只会走更多弯路。)

接下来是发送接收线程的代码:

package com.example.tcptext;import android.util.Log;import java.io.IOException;
import java.io.OutputStream;
import java.io.InputStream;
import java.net.Socket;//线程名:ConnectThread
public class ConnectThread extends Thread {//Socket msg = null;//定义socketprivate OutputStream out_ip=null;//定义输出流(ip)OutputStream outputStream=null;private InputStream inputStream;private StringBuffer stringBuffer;private String ip;private int port;private Receive receive;private String string;private boolean isRun = true;private  MainActivity.Receive re;public ConnectThread(String ip, int port, MainActivity.Receive re) {this.ip = ip;this.port = port;this.re = re;}@Overridepublic void run(){Socket so = null;try {so = new Socket(ip, port);} catch (IOException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + ": Hello");try {inputStream = so.getInputStream();out_ip = so.getOutputStream();Log.v("AndroidChat","开始连接服务器:"+ip+"/"+port);sleep(1000);}catch (IOException | InterruptedException e) {Log.v("AndroidChat","连接服务器失败"+e.getMessage());e.printStackTrace();return;}Log.v("AndroidChat","成功连接上服务器");/*下面是接收模块,你可以尝试探究如何将这个模块放在接收线程中。*/try {inputStream = so.getInputStream();final byte[] buffer = new byte[1024];final int len = inputStream.read(buffer);System.out.println(new String(buffer,0,len));Log.v("AndroidChat","接收成功:"+new String(buffer,0,len));string = new String(buffer,0,len);re.setString(string);//上下两行会和MainActivity关联,是回调在显示屏的关键步骤。MainActivity.callback();System.out.println(new String(buffer,0,len));} catch (IOException e) {e.printStackTrace();}}}

最后是核心模块(MainActivity)

package com.example.tcptext;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;public class MainActivity extends AppCompatActivity {private Button mBtn_send;private Button mBtn_connect;private EditText mEt_send;private static TextView mTv_recv;private String ip;private int port;private String msg;private ConnectThread ct;private Send send;private Handler handler;static Receive re = new Receive();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mTv_recv = findViewById(R.id.receive);mBtn_connect = findViewById(R.id.connect);mBtn_send = findViewById(R.id.btn_1);final EditText mEt_ip = this.findViewById(R.id.ip);final EditText mEt_port = this.findViewById(R.id.port);final EditText mEt_send = this.findViewById(R.id.send);/*
设置一个点击事件用以连接线程
*/mBtn_connect.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {ip = mEt_ip.getText().toString();//获取输入的ipport = Integer.parseInt(mEt_port.getText().toString());//获取输入的端口号ct = new ConnectThread(ip, port, re);//创建一个线程来处理消息的收发ct.start();}});
/*
设计一个点击事件用以发送消息
*/mBtn_send.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {msg = mEt_send.getText().toString();send = new Send(msg, port, ip);send.start();}}); }
/*
这里是和连接接收线程中的 re.setString(string) 联动的,自己理解一下怎么走在脑子里面走一次就差不多了。
*/
static class Receive{private  String string;public String getString(){return string;}public void setString(String s){this.string = s;}
}
/*
下面的callback和连接接收线程中的 MainActivity.callback() 关联,线程运行到那一步后结束回到MainActivity中。
*/
public static void callback(){System.out.println("连接线程执行结束");mTv_recv.setText(re.getString());//这里是将接收到的文字显示在接收框内。
}
}
注意:1.这里的点击按钮必须要输入好IP和端口号否则会闪退,我也不知道是什么原因,有哪位大大知道的,麻烦说一下。2.每次连接接收完信息后都要点击一次连接服务器或者发送一条消息。各位可以一起探讨一下如何重新开启线程,反正我又百年不用Java,这个问题就留给各位了,哈哈哈。

最后,我分享一下我做这个程序的具体思路。零基础的朋友可以参照一下思路来遨游博海:
1.找到两个标准的TCP应用。这很关键,你必须得有标准的应用来测试才知道这是好的还是坏的。
2.善于利用 System.out.println(“哔哩吧啦”); 这个东西能很好的帮助你检查代码运行到什么地方。
3.将整个应用开发分成三个模块:连接服务器模块,发送信息模块,接收信息模块。每个模块还能再细分步骤:1.固定信息的传递(如连接模块就是固定IP和端口号);2.随机信息的传递。
4.优化你的界面,优化代码,做成自己理想的样子。

PS:1.我这里的函数回调是参照网上的一些博文做出的这里放一下链接:

https://blog.csdn.net/weixin_43475124/article/details/83930436?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159499807219195265934921%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=159499807219195265934921&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v3~pc_rank_v3-2-83930436.pc_ecpm_v3_pc_rank_v3&utm_term=Java+%E5%88%A9%E7%94%A8%E5%9B%9E%E8%B0%83%E5%87%BD%E6%95%B0%E7%BA%BF%E7%A8%8B%E6%95%B0%E6%8D%AE%E4%BC%A0%E9%80%92

2.之后我会创一个Github账号将源码放出来,以便和大家一起学习交流。

3.这里用到的两个标准软件:PC端:TCPCOM android端:TCP连接

最后希望大家一起加油!用心攻破每个难题!

Android Studio TCP客户端实现相关推荐

  1. android studio TCP客户端通讯

    1.创建TCPserver类(该类要创建为service类型,如下图) 其中代码如下 package com.zhongjian.zjqr;import android.app.Service; im ...

  2. android 之TCP客户端编程(转自杨奉武博客)

    android 之TCP客户端编程 补充,由于这篇文章是自己入门的时候写的,随着Android系统的升级可能有发送需要在任务中进行, 如有问题请百度 thread或者看下面链接的文章 https:// ...

  3. Android studio TCP网络调试助手应用开发(支持TCP Server与Client切换)

    在前几篇的文章中带大家完成了基于TCP的物联网安卓应用开发,教程内容是创建了一个TCP客户端并连接服务器完成数据通信的过程,后不久又发布了一个ESP8266创建TCP 服务器与安卓的客户端进行通信的一 ...

  4. android 之TCP客户端编程

    每一台电脑都有自己的ip地址,每台电脑上的网络应用程序都有自己的通信端口,张三的电脑(ip:192.168.1.104)上有一个网络应用程序A(通信端口8000),李四的电脑(ip:192.168.1 ...

  5. Android Studio Socket客户端 与电脑服务器收发消息

    安卓手机与电脑进行socket通讯,安卓是客户端,电脑是服务器.public static void main(String[] args) throws IOException { int port ...

  6. android之TCP客户端框架

    一.程序框架 1.1 创建方法 onCreate 1.1.1 创建连接按键线程,并使能线程(触发原因:可按键.其他操作,并进行状态判断): Connect_Thread connect_Thread ...

  7. Android Studio设计APP实现与51单片机通过WIFI模块(ESP8266-01S)通讯控制LED灯亮灭的设计源码【详解】

    目录 一.前言 二.效果展示 1.APP界面展示 2.C51硬件展示 三.Android Studio APP源代码 1.AndroidManifest.xml 1.请求联网: 2.开放明文传输: 2 ...

  8. Android的SocketTCP客户端发送信息

    通过Android Studio建立SocketTCP客户端发送字符串 上回书说到,STM32通过Socket建立TCP服务器之后可以通过TCP客户端来给它发出指令,但是电脑发指令就比较麻烦,所以花了 ...

  9. Android Studio --- [学习笔记]TCP(第2弹)、GridView、ScrollView

    说明 这篇主要接上一篇Android Studio - > [学习笔记]RadioButton.CheckBox.ImageView.ListView.TCP的三次握手 对上面回答的细解,并用J ...

最新文章

  1. 1.6 Java项目实战:计算平均成绩
  2. 奇绩创坛 2021年秋季创业营 反馈:再接再厉
  3. [云炬python3玩转机器学习]sklearn中的Scaler
  4. 秒后面的单位是什么_比光年还大的长度单位,你知道几个?
  5. Flex与.NET互操作(七):了解FluorineFx的环境配置(远程对象、网关、通道、目的地)...
  6. C# 生成验证码 方法一
  7. RocketMQ Message hasn‘t been sent. Caused by No route info of this topic, Pr
  8. androidpn的学习研究(八)androidpn 中业务类XmppIoHandler实现分析
  9. 中国人使用计算机互联网,发明计算机的核心专家,被美国隐瞒35年,只因是一名中国人...
  10. 赶个项目,博客稍后更新
  11. EEGLAB在MATLAB中的下载、安装教程
  12. graphpad prism图标设置_科研绘图软件-Graphpad prism使用教程(六)
  13. oracle 除数不能为0
  14. 曙光服务器如何重新设置u盘启动_u盘装曙光服务器 曙光服务器进bios设置u盘启动...
  15. 直播源 直播地址 测试地址 http rtsp rtmp hls 短视频测试地址
  16. html5 footer header,W3C HTML5标准阅读笔记 – header、footer、main、address
  17. Android 蓝牙手柄 延迟,安卓免设置,0.15s低延迟,飞智银狐蓝牙耳机体验
  18. 10 个用于收集硬件信息的 Linux 命令
  19. WPF的打印原理 实现打印页眉页脚和打印预览
  20. 乐山持点科技:抖音极速版电商入驻指南

热门文章

  1. leetcode122-买卖股票的最佳时机 II
  2. 产品经理 - 原型图设计软件
  3. python编程语言符号大全_Python基础学习篇章三分析
  4. 2022年十一届认证杯D题
  5. 分布式通信:远程调用
  6. 如何通过 C# 有效的读取 INI 文件?
  7. ㉕AW-A33 Linux驱动开发之audio子系统驱动程序
  8. vscode开发wdk
  9. android 获取手机中应用运行的时长和次数
  10. 【已安装成功】记部署yzmcms的一些重点