????????在前幾篇的文章中帶大家完成了基于TCP的物聯(lián)網(wǎng)安卓應(yīng)用開發(fā),教程內(nèi)容是創(chuàng)建了一個(gè)TCP客戶端并連接服務(wù)器完成數(shù)據(jù)通信的過程,后不久又發(fā)布了一個(gè)ESP8266創(chuàng)建TCP 服務(wù)器與安卓的客戶端進(jìn)行通信的一個(gè)文章,當(dāng)時(shí)在文章中提到“如果大家有需要將ESP8266配置為TCP的客戶端,手機(jī)APP作為服務(wù)器端,可以進(jìn)入公眾號(hào)進(jìn)行私信,有需求的話會(huì)再更新一期”。
? ? 近期平臺(tái)就收到好幾位小伙伴的私信,今天就帶大家完成一個(gè)安卓創(chuàng)建TCP 服務(wù)器并與客戶端通信的功能,最終的APP集成了客戶端模式和服務(wù)器模式的切換,形成一個(gè)簡(jiǎn)易的TCP調(diào)試助手APP,文末免費(fèi)下載Android Studio工程。
? ? APP功能展示視頻:
TCPassistant
一、獲取手機(jī)接入網(wǎng)絡(luò)的IP地址
創(chuàng)建服務(wù)器與創(chuàng)建客戶端不同,創(chuàng)建客戶端的IP地址不可隨意設(shè)置,只能采用設(shè)備本機(jī)的IP地址,首先先獲取本機(jī)IP地址:
/**
* @Description 獲取設(shè)備的接入的wifi或流量網(wǎng)絡(luò)的IP地址。
*/
String getIPAddress() {
Context context=MainActivity.this;
NetworkInfo info = ((ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
if (info != null && info.isConnected()) {
//流量網(wǎng)絡(luò)
if (info.getType() == ConnectivityManager.TYPE_MOBILE) {
try {
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); )
{
NetworkInterface intf = en.nextElement();
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); )
{
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) {
return inetAddress.getHostAddress();
}
}
}
} catch (SocketException e) {
e.printStackTrace();
}
}
//wifi網(wǎng)絡(luò)
else if (info.getType() == ConnectivityManager.TYPE_WIFI)
{
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
//調(diào)用方法將int轉(zhuǎn)換為地址字符串
String ipAddress = intIP2StringIP(wifiInfo.getIpAddress());//得到IPV4地址
return ipAddress;
}
} else
{
Toast.makeText(this,"請(qǐng)先連接網(wǎng)絡(luò)", Toast.LENGTH_SHORT).show();
}
return null;
}
/**
* @Description int類型IP轉(zhuǎn)換為String類型
*/
String intIP2StringIP(int ip) {
return (ip & 0xFF) + "." +
((ip >> 8) & 0xFF) + "." +
((ip >> 16) & 0xFF) + "." +
(ip >> 24 & 0xFF);
}
二、創(chuàng)建TCP服務(wù)器
String port=""; //可以通過edit_textview.getText().toString();獲取輸入框的IP
ServerSocket serverSocket;
serverSocket = new ServerSocket(Integer.parseInt(port));
三、創(chuàng)建子線程等待客戶端接入
/**
* 創(chuàng)建子線程等待客戶端接入
*/
class NewThread_wait_tcpclient extends Thread {
OutputStream os;
@Override
public void run() {
while (true) {
System.out.println("–等待客戶端連接–");
try {
tcp_client_socket = serverSocket.accept();
System.out.println("得到客戶端連接:" + socket);
os = tcp_client_socket.getOutputStream();
String client_ip=tcp_client_socket.getInetAddress().toString();
new Thread(){
@Override
public void run() {
handler.post(new Runnable() {
@Override
public void run() {
connected=true;
//完成客戶端連接成功后的一些UI控件更新等
}
});
}
}.start();
String text = "Hello, I am TCP Server";
os.write(text.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
Receive_Thread receive_Thread = new Receive_Thread();
receive_Thread.start();
}
}
}
三、創(chuàng)建子線程接收客戶端數(shù)據(jù)并處理
class Receive_Thread extends Thread {
public void run()
{
if (null != tcp_client_socket) {
try {
while (true) {
final byte[] buffer = new byte[1024];
tcp_inputStream = tcp_client_socket.getInputStream();
final int len = tcp_inputStream.read(buffer);
if (len == -1) {
tcp_client_socket.close();
tcp_client_socket = null;
connected = false;
runOnUiThread(new Runnable()
{
public void run() {
//完成斷開連接后的一些UI控件更新
}
});
return;
}
runOnUiThread(new Runnable()
{
public void run() {
// TODO Auto-generated method stub
String recv_data=new String(buffer, 0, len);
//textView_tip.setText("接收到:"+recv_data);
//SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss");
//Date time_date = new Date(System.currentTimeMillis());
//add_display_recvdata("["+simpleDateFormat.format(time_date)+"]:"+recv_data);
}
});
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
四、向客戶端發(fā)送數(shù)據(jù)
new Thread(new Runnable() {
OutputStream os = null;
@Override
public void run() {
try {
os = tcp_client_socket.getOutputStream();
//從輸入框中獲取輸入的數(shù)據(jù)
String text=String.valueOf(editText_senddata.getText());
if(!(text.isEmpty()))
{
try {
os.write(text.getBytes());
Looper.prepare();//解除Android不允許在子線程中彈出 Toast 提示的限制
Toast.makeText(getApplicationContext(), "已發(fā)送", Toast.LENGTH_SHORT).show();
Looper.loop(); //恢復(fù)限制
} catch (IOException e) {
e.printStackTrace();
}
}
else
{
Looper.prepare();//解除Android不允許在子線程中彈出 Toast 提示的限制
Toast.makeText(getApplicationContext(), "請(qǐng)先輸入要發(fā)送的數(shù)據(jù)", Toast.LENGTH_SHORT).show();
Looper.loop();//恢復(fù)限制
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
通過上述部分程序可以完成TCP Server的創(chuàng)建和TCP客戶端的通信,結(jié)合之前發(fā)布的TCP Client部分的文章就可以完成TCP網(wǎng)絡(luò)調(diào)試助手的APP應(yīng)用開發(fā)。
公眾號(hào)“IOT趣制作”回復(fù)關(guān)鍵字“tcpass”或“0532”即可獲取Android studio的工程文件。
其他參考鏈接:
TCP安卓應(yīng)用開發(fā)基礎(chǔ)教程(TCP Client-Android Studio開發(fā))文章來源:http://www.zghlxwxcb.cn/news/detail-455615.html
ESP8266的TCP通信基礎(chǔ)教程(結(jié)合手機(jī)APP)文章來源地址http://www.zghlxwxcb.cn/news/detail-455615.html
到了這里,關(guān)于Android studio TCP網(wǎng)絡(luò)調(diào)試助手應(yīng)用開發(fā)(支持TCP Server與Client切換)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!