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的线程会一直调用接收函数,查询服务器是否有消息发送至手机。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。