Android 开发:通信篇-TCP客户端
这节教给大家用Android写一个TCP客户端程序
官方文档
Socket - Android SDK | Android Developers
页面
编写连接程序
1.获取控件
EditText editTextIPAddress,editTextPort;//输入IP地址,端口号Button buttonConnect;//连接按钮@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);buttonConnect = findViewById(R.id.buttonConnect);editTextIPAddress = findViewById(R.id.editTextIPAddress);editTextPort = findViewById(R.id.editTextPort);}
2.添加网络权限
<uses-permission android:name="android.permission.INTERNET" />
3.定义一个socket
Socket socket;
4.编写按钮点击连接/断开程序
MyHandler myHandler;//使用Handler更新控件myHandler = new MyHandler();
buttonConnect.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {if (buttonConnect.getText()=="连接"){new Thread(new Runnable() {@Overridepublic void run() {Message msg = myHandler.obtainMessage();//从消息队列拉取个消息变量try{socket = new Socket(editTextIPAddress.getText().toString(),Integer.valueOf(editTextPort.getText().toString()));if(socket.isConnected()){msg.what = 1;//设置消息变量的 what 变量值 为1}}catch (Exception e){msg.what = 0;//设置消息变量的 what 变量值 为0}myHandler.sendMessage(msg);//插入消息队列}}).start();}else{try{ socket.close(); }catch (Exception e){} //关闭连接buttonConnect.setText("连接");//按钮显示连接}}});
//Handlerclass MyHandler extends Handler {public void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what){case 0:Toast.makeText(MainActivity.this,"连接出错",Toast.LENGTH_SHORT).show();break;case 1:buttonConnect.setText("断开");//按钮显示断开break;default: break;}}}
提示:获取IP地址和端口号,执行连接
socket = new Socket(editTextIPAddress.getText().toString(),Integer.valueOf(editTextPort.getText().toString()));
当前程序
EditText editTextIPAddress,editTextPort;//输入IP地址,端口号Button buttonConnect;//连接按钮Socket socket;MyHandler myHandler;//使用Handler更新控件@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);myHandler = new MyHandler();buttonConnect = findViewById(R.id.buttonConnect);buttonConnect.setText("连接");editTextIPAddress = findViewById(R.id.editTextIPAddress);editTextPort = findViewById(R.id.editTextPort);buttonConnect.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {if (buttonConnect.getText()=="连接"){new Thread(new Runnable() {@Overridepublic void run() {Message msg = myHandler.obtainMessage();//从消息队列拉取个消息变量try{socket = new Socket(editTextIPAddress.getText().toString(),Integer.valueOf(editTextPort.getText().toString()));if(socket.isConnected()){msg.what = 1;//设置消息变量的 what 变量值 为1}}catch (Exception e){msg.what = 0;//设置消息变量的 what 变量值 为0}myHandler.sendMessage(msg);//插入消息队列}}).start();}else{try{ socket.close(); }catch (Exception e){} //关闭连接buttonConnect.setText("连接");//按钮显示连接}}});}//Handlerclass MyHandler extends Handler {public void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what){case 0:Toast.makeText(MainActivity.this,"连接出错",Toast.LENGTH_SHORT).show();break;case 1:buttonConnect.setText("断开");//按钮显示断开break;default: break;}}}
接收数据
1.定义 InputStream 用于获取数据输入流,定义一个数组用于缓存数据
InputStream inputStream;//获取输入流
byte[] RevBuff = new byte[1460];//缓存数据
2.定义一个函数,里面放一个任务,用于不停的接收数据
public void Recv(){new Thread(new Runnable() {@Overridepublic void run() {while (socket!= null && socket.isConnected()){try{int Len = inputStream.read(RevBuff);//获取数据if(Len!=-1){Message msg = myHandler.obtainMessage();//从消息队列拉取个消息变量msg.what = 3;//设置消息变量的 what 变量值 为3msg.arg1 = Len;//接收的数据个数msg.obj = RevBuff;//传递数据myHandler.sendMessage(msg);//插入消息队列}else{//连接异常断开Message msg = myHandler.obtainMessage();//从消息队列拉取个消息变量msg.what = 0;//设置消息变量的 what 变量值 为0myHandler.sendMessage(msg);//插入消息队列break;}}catch (Exception e){//连接异常断开Message msg = myHandler.obtainMessage();//从消息队列拉取个消息变量msg.what = 0;//设置消息变量的 what 变量值 为0myHandler.sendMessage(msg);//插入消息队列break;}}}}).start();}
3.调用接收函数
4.在Handle中处理数据,把数据显示在页面
4.1.获取控件
4.2.把接收的消息追加到Textview显示
测试
1.电脑端开启TCP服务器
2.保证手机和电脑在一个局域网内
查看自己的电脑IP
3.手机连接
接收显示16进制数据
1.关于16进制显示和前面的串口上位机显示16进制数据是一样的道理
C#开发: 通信篇-串口调试助手 - 杨奉武 - 博客园
2.JAVA和C#提供的函数不一样,java的转换程序如下:
/*** 16进制byte转16进制String--用空格隔开* @param bytes* @return*/public static String byteToHexStr(byte[] bytes){ String str_msg = "";for (int i = 0; i < bytes.length; i++){ str_msg = str_msg + String.format("%02X",bytes[i])+" ";} return str_msg; }
3.获取16进制选择控件
4.编写处理函数
测试
清除接收
发送数据
1.获取控件,定义输出流变量
2.获取输出流
3.点击发送按钮发送发送文本框里面的数据
4.测试
发送16进制数据
1.文本框里面输入的是字符串
假设输入的是 55FD
那么获取的是 "55FD"
需要转换为 0x55 0xFD
获取第一个字符 5 hexString.charAt(0)
转换为 16进制形式 Character.digit(hexString.charAt(0), 16)
获取第二个字符5 hexString.charAt(1)
转换为 16进制形式 Character.digit(hexString.charAt(1), 16)
然后组合成一个16进制
byte data = (byte) ((Character.digit(hexString.charAt(0), 16) << 4) + Character.digit(hexString.charAt(1), 16))
2.完整的程序如下
/****"2B44EFD9" --> byte[]{0x2B, 0x44, 0xEF,0xD9}* @param hexString* @return*/public static byte[] hexStringToByteArray(String hexString) {StringBuilder sb = null;hexString = hexString.replaceAll(" ", "");if ((hexString.length()%2)!=0) {//数据不是偶数sb = new StringBuilder(hexString);//构造一个StringBuilder对象sb.insert(hexString.length()-1, "0");//插入指定的字符串hexString = sb.toString();}int len = hexString.length();byte[] bytes = new byte[len / 2];for (int i = 0; i < len; i += 2) {if (((hexString.charAt(i)>='0' && hexString.charAt(i)<='9') ||(hexString.charAt(i)>='A' && hexString.charAt(i)<='F') ||(hexString.charAt(i)>='a' && hexString.charAt(i)<='f'))&&(hexString.charAt(i+1)>='0' && hexString.charAt(i+1)<='9') ||(hexString.charAt(i+1)>='A' && hexString.charAt(i+1)<='F') ||(hexString.charAt(i+1)>='a' && hexString.charAt(i+1)<='f')){// 两位一组,表示一个字节,把这样表示的16进制字符串,还原成一个字节bytes[i / 2] = (byte) ((Character.digit(hexString.charAt(i), 16) << 4) + Character.digit(hexString.charAt(i+1), 16));}else return null;}return bytes;}
3.获取控件
4.编写处理程序
5.测试
补充
让输入的内容默认显示在左上角
android:gravity="top"
转载于:Android 开发: 通信篇-TCP客户端 - 杨奉武 - 博客园
Android 开发:通信篇-TCP客户端相关推荐
- android开发我的新浪微博客户端-用户授权页面UI篇(3.1)
看上面的图,其实这个页面的UI实现不复杂,首先是背景部分的实现这个参考 android开发我的新浪微博客户端-载入页面UI篇(1.1),重点来讲讲这个半透明的弹出对话框窗口是如何实现的,首先新建名为A ...
- android开发我的新浪微博客户端-用户授权页面功能篇(3.2)
==> 在上一篇实现了用户授权页面的UI,如上图,接下来要做的就是在这个基础上完成功能部分真正实现用户的授权认证,这一篇是android开发我的新浪微博客户端-OAuth篇(2.1)的具体应 ...
- android开发我的新浪微博客户端系列教程
android开发我的新浪微博客户端-载入页面UI篇(1.1)http://www.1000phone.net/thread-7750-1-1.html android开发我的新浪微博客户端-载入页面 ...
- android 除了webview 浏览器控件,android开发我的新浪微博客户端-OAuth认证过程中用WebView代替原来的系统自带浏览器...
前面的文章的OAuth认证过程在获取oauth_verifier码是是通过调用android系统带的浏览器进行用户授权认证的, 具体见:android开发我的新浪微博客户端-用户授权页面功能篇(3.2 ...
- android开发我的新浪微博客户端-OAuth篇(2.1)
本篇说说关于OAuth授权认证的事情,新浪开放api都必须在这个基础上才能调用,所以有必要专门来讲讲,前面的文章中已经提到过关于新浪微博提供了OAuth和Base OAuth两种认证方式,并且本项目采 ...
- android开发我的新浪微博客户端-登录页面功能篇(4.2)
上一篇中完成了如上图的UI部分的实现,现在继续来讲功能的实现,用户登录操作主要就是账号列表显示和选择账号登录两个功能其他的都是些简单的辅助功能,首先是点击id为iconSelectBtn的ImageB ...
- android开发我的新浪微博客户端-登录页面UI篇(4.1)
首先回顾一下功能流程当用户开启软件显示载入页面时程序首先去sqlite库查询是否已经保存有用户的新浪微博的UserID号.Access Token.Access Secret的记录如果没有一条记录那么 ...
- android开发我的新浪微博客户端-登录页面功能篇
首先是从数据库中获取所有的账户记录然后设置默认选中的用户账号代码如下: private void initUser(){//获取账号列表dbHelper=new DataHelper(this);us ...
- iOS知识梳理之移动开发网络篇TCP/IP
1.OSI七层 TCP/IP五层 1.1 OSI七层参考模型 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 对于OSI七层参考模型,我想说只有这七个词条.任何与实际生产脱钩的东西都需要硬 ...
最新文章
- 更新项目经常使用的Linux命令
- nth-child和蝉原则实现的奇妙随机效果(译)
- python爬取微博热搜并存入表格_python爬虫进阶之爬取微博热搜存入Mysql
- matlab怎么求imf图,MATLAB中提取EMD分解后的每个IMF图像,并导出每个IMF数据
- 基于android4的第三方系统,神速!第三方开发者放出小米3/4原生Android Oreo刷机包...
- 基于非递归算法的汉诺塔游戏之Python实现
- 实现Exchange2003安全全集(下)
- HDU-1172 猜数字 广搜
- 解决webstorm out of memory内存不足问题
- RS485通讯与RS232通讯的区别
- 中科院SCI分区和JCR分区
- boss网人脸识别认证_在手机上怎样进行社保人脸识别认证
- 嵌入式开发:调试嵌入式软件的技巧
- webpack3:html-webpack-plugin 实现自动修改引入文件名
- 魔众刮刮卡抽奖系统 v2.0.0 支付抽奖,更好用的刮刮卡系统
- 浙大计算机系学霸,浙大学霸将脑电波控制变现实
- SpringCloud学习一
- No module named ‘quantopian‘
- Cased by: java.lang.ClassNotFoundException: com.google.common.util.concurrent.SettableFuture
- 把泛型传给泛型方法。