AndroidTCP通信,16進制數據傳輸實例

主要功能為手機與遠程服務器進行16進制的數據收發,TCPControl類實現瞭16進制的數據收發功能,其中發送函數設置為每次發送4字節數據,服務器發來的數據在手機上會以Toast的形式顯示出來。

 

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的線程會一直調用接收函數,查詢服務器是否有消息發送至手機。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *