AndroidTCP通信,16进制数据传输实例

主要功能为手机与远程服务器进行16进制的数据收发,TCPControl类实现了16进制的数据收发功能,其中发送函数设置为每次发送4字节数据,服务器发来的数据在手机上会以Toast的形式显示出来。

代码:http://download.csdn.net/detail/miaoyunzexiaobao/8151831

PS:附件中包含TCP调试助手,使用时将调试助手设置为TCP服务器,并勾选发送与接收栏中的16进制收发的选择项

应用:

1.用户在IP和PORT编辑框中对应值,点击Set按钮,完成服务器参数设置。

2.单击手机上的SendTest按钮,手机将想服务器发送数据。

系统代码执行流程:

1.MainActivity中定义静态String变量IP和静态int变量PORT

2.设置Handler,该Handler用于将接收到的来自服务器的数据显示在手机上

3.在OnCreate函数中获取btnSet和btnTest控件,分别设置监听器:btnSet用于设置IP和PORT,btnTest用于向服务器发送16进制的测试数据“6666”

4.在OnCreate函数中创建新线程,该线程用于监听来自服务器的数据,每当收到来自服务器的数据时,会向Handler发送消息,Handler收到消息后会在手机界面上显示。之后线程给服务器返回消息0000,循环

TCPControl类解析:

code:

package com.example.tcptest;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;

public class TCPControl {
	static Socket s = null;
	static DataOutputStream dout = null;
	static DataInputStream din = null;
	static String backCMD = null;
	static public int recvCMD() throws Exception {
		if (s == null)
			s = new Socket(MainActivity.IP, MainActivity.PORT);
		if (dout == null)
			dout = new DataOutputStream(s.getOutputStream());
		if (din == null)
			din = new DataInputStream(s.getInputStream());
		Thread.sleep(50, 0);
		for (int i = 0; i < 10; i++) {
			if (din.available() > 0) {
				/*
				  客户端非16进制发送
				byte[] buffer = new byte[din.available()];
				System.out.println(din.available());
				din.read(buffer);
				backCMD = "Msg from peer:" + new String(buffer);
				*/
				int backLength = din.available();
				char[] buffer = new char[backLength];
				for(int j = 0 ; j < backLength ; ++j)
				{
					buffer[j] = (char) din.readByte();
					buffer[j] = (char) (buffer[j] + '0');
				}
				backCMD = new String(buffer);
				return 1;
			} else {
				Thread.sleep(500, 0);
				return 0;
			}
		};
		return 0;
	}

	static public void sendCMD(final String cmd) {
		try {
			if (s == null)
				s = new Socket(MainActivity.IP, MainActivity.PORT);
			if (dout == null)
				dout = new DataOutputStream(s.getOutputStream());
			if (din == null)
				din = new DataInputStream(s.getInputStream());
			Thread.sleep(50, 0); // 实际中刚连上后发数据需要一定延时 确保双方链接初始化完成

			char[] temp = new char[4];
			for (int i = 0; i < cmd.length(); ++i) {
				temp[i] = (char) (cmd.charAt(i) - '0');
			}
			String strTemp = new String(temp);
			dout.writeBytes(strTemp);

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

TCPControl类包含发送和接收两个函数

发送:

用户向服务器发送消息时调用该函数,该函数功能为首先判断套接字是否为空,若为空则根据用户设置的IP和PORT新建一个套接字,之后利用该套接字建立数据收发流,在将要发送的消息cmd转为16进制后利用发送流的writeBytes函数将消息发送至服务器

接收:

首先判断套接字是否为空,若为空则根据用户设置的IP和PORT新建一个套接字,之后利用该套接字建立数据收发流,判断接收流是否收到数据,若收到则将数据转为16进制并返回1,MainActivity中的检测线程若发现接收函数返回值为1,则调用Handler将消息显示出来。若为接收到消息,则会返回0。在该过程中MainActivity的线程会一直调用接收函数,查询服务器是否有消息发送至手机。

时间: 2024-10-16 16:01:13

AndroidTCP通信,16进制数据传输实例的相关文章

16进制格式数据传输的服务框架——xxl-hex

github:https://github.com/xuxueli/xxl-hex git.osc:http://git.oschina.net/xuxueli0323/xxl-hex 博客地址(内附使用教程):http://www.cnblogs.com/xuxueli/p/5003305.html Tips:这篇基于hex的通讯方案,和网上其他的,或者你目前了解的完全不是同一个玩意儿,疑惑看代码: 简介:xxl-hex是一个轻量级的remoting onhttp工具,使用简单的方法提供了rp

QT 串口通信 数据16进制发送

在QT中进行串口通信时,很多情况要用到发送16进制的数据.从网上找来了一段代码测试能用: static QByteArray QString2Hex(QString str) { QByteArray senddata; int hexdata,lowhexdata; int hexdatalen = 0; int len = str.length(); senddata.resize(len/2); char lstr,hstr; for(int i=0; i<len; ) { hstr=st

C# 中2,10,16进制及其ASCII码之间转化

C# 中2,10,16进制及其ASCII码之间转化             --------//C#中各种字符类型的转化,使用于串口通信------------ //字符长度的理解            string s = "我是一个2兵";            int len = s.Length;//6个字符              byte[] sarr = System.Text.Encoding.Default.GetBytes(s);            len =

串口调试助手-发送数据,按字符或16进制显示接收数据的C#程序

一. 新手上路,一般几种方法来学习VS2010的C#编程: 1.查阅各种书籍和技术文档,传统而耗时: 2.借助视频教程快速上手,省事有效却无法掌握一些小细节,写起程序来,各种调试不通过,还是浪费时间: 3.直接采用网络大神的程序,在运行成功的前提下,再仔细消化各种精髓,方法虽然高效,但也是建立在作者编写文档友好的情况下. 对于以上的第一种适合那种不着急项目进度,只管自己开心满足自己兴趣的新手,第二种适合那种需要赶进度.不需要太注意小细节的项目,第三种属于技术渣,为了像我这种技术渣的新手们上路更轻

Nginx将utf8编码的url解码成\x的16进制格式导致无法匹配静态文件的问题处理

例如请求/touch/article/北京/full.html,到达nginx后变成/ /touch/article/%E5%8C%97%E4%BA%AC/full.html, Nginx静态文件配置: location ~* ^/touch/article/.*\.html$ { expires -1; root /home/htmlfile; charset UTF-8; if ( !-f $request_filename ){ proxy_pass http://client.api.c

16进制ascii码转化为对应的字符,付ipmitool查询硬件信息

最近工作需要在用ipmitool查询服务器硬件信息.ipmitool查询硬件信息 比如电源,使用命令: 获取PSU0信息:Ipmitool raw 0x3a 0x71 0x00: 获取PSU1信息:Ipmitool raw 0x3a 0x71 0x01: 但是得到的信息是这样的: 完全没有可读性,这些数字是16进制的ascii,平时我们看到的ascii都是10进制的,0—255,这里转化成16进制了. 想要知道对应的信息,刚开始想着要先把16进制转化为10进制,在转化成对应的ascii字符,网上

16进制字符和图片之间相互转换

图片和字符转换一版用在socket进行通信之间.现在我就把我写的和测试整理出来和大家分享下 1:图片转换成16进制字符 1 FileStream fs = new FileStream(lbl_show.Text, FileMode.Open, FileAccess.Read); 2 BinaryReader br = new BinaryReader(fs); 3 StreamWriter sw = new StreamWriter(tb_position.Text); 4 int lengt

C#串口通讯中常用的16进制的字节转换

1.对于通讯协议的十六进制数值进行简单转换 //二进制转十进制Console.WriteLine("二进制 111101 的十进制表示: "+Convert.ToInt32("111101", 2));//八进制转十进制Console.WriteLine("八进制 44 的十进制表示: "+Convert.ToInt32("44", 8));//十六进制转十进制Console.WriteLine("十六进制 CC的十

C#把汉字转换成16进制(HEX)并向串口发送数据

报警器实例:(有发送,无返回获取) 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.IO.Ports; 6 using System.Text.RegularExpressions; 7 using System.Windows.Forms; 8 9 namespace ZKJFJK 10 { 11 /*** 12 报警器语音输