在前几篇的文章中带大家完成了基于TCP的物联网安卓应用开发,教程内容是创建了一个TCP客户端并连接服务器完成数据通信的过程,后不久又发布了一个ESP8266创建TCP 服务器与安卓的客户端进行通信的一个文章,当时在文章中提到“如果大家有需要将ESP8266配置为TCP的客户端,手机APP作为服务器端,可以进入公众号进行私信,有需求的话会再更新一期”。
近期平台就收到好几位小伙伴的私信,今天就带大家完成一个安卓创建TCP 服务器并与客户端通信的功能,最终的APP集成了客户端模式和服务器模式的切换,形成一个简易的TCP调试助手APP,文末免费下载Android Studio工程。
APP功能展示视频:
TCPassistant
一、获取手机接入网络的IP地址
创建服务器与创建客户端不同,创建客户端的IP地址不可随意设置,只能采用设备本机的IP地址,首先先获取本机IP地址:
/**
* @Description 获取设备的接入的wifi或流量网络的IP地址。
*/
String getIPAddress() {
Context context=MainActivity.this;
NetworkInfo info = ((ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
if (info != null && info.isConnected()) {
//流量网络
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网络
else if (info.getType() == ConnectivityManager.TYPE_WIFI)
{
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
//调用方法将int转换为地址字符串
String ipAddress = intIP2StringIP(wifiInfo.getIpAddress());//得到IPV4地址
return ipAddress;
}
} else
{
Toast.makeText(this,"请先连接网络", Toast.LENGTH_SHORT).show();
}
return null;
}
/**
* @Description int类型IP转换为String类型
*/
String intIP2StringIP(int ip) {
return (ip & 0xFF) + "." +
((ip >> 8) & 0xFF) + "." +
((ip >> 16) & 0xFF) + "." +
(ip >> 24 & 0xFF);
}
二、创建TCP服务器
String port=""; //可以通过edit_textview.getText().toString();获取输入框的IP
ServerSocket serverSocket;
serverSocket = new ServerSocket(Integer.parseInt(port));
三、创建子线程等待客户端接入
/**
* 创建子线程等待客户端接入
*/
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();
}
}
}
三、创建子线程接收客户端数据并处理
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();
}
}
}
}
四、向客户端发送数据
new Thread(new Runnable() {
OutputStream os = null;
@Override
public void run() {
try {
os = tcp_client_socket.getOutputStream();
//从输入框中获取输入的数据
String text=String.valueOf(editText_senddata.getText());
if(!(text.isEmpty()))
{
try {
os.write(text.getBytes());
Looper.prepare();//解除Android不允许在子线程中弹出 Toast 提示的限制
Toast.makeText(getApplicationContext(), "已发送", Toast.LENGTH_SHORT).show();
Looper.loop(); //恢复限制
} catch (IOException e) {
e.printStackTrace();
}
}
else
{
Looper.prepare();//解除Android不允许在子线程中弹出 Toast 提示的限制
Toast.makeText(getApplicationContext(), "请先输入要发送的数据", Toast.LENGTH_SHORT).show();
Looper.loop();//恢复限制
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
通过上述部分程序可以完成TCP Server的创建和TCP客户端的通信,结合之前发布的TCP Client部分的文章就可以完成TCP网络调试助手的APP应用开发。
公众号“IOT趣制作”回复关键字“tcpass”或“0532”即可获取Android studio的工程文件。
其他参考链接:
TCP安卓应用开发基础教程(TCP Client-Android Studio开发)
ESP8266的TCP通信基础教程(结合手机APP)
版权说明:如非注明,本站文章均为 扬州驻场服务-网络设备调试-监控维修-南京泽同信息科技有限公司 原创,转载请注明出处和附带本文链接。
请在这里放置你的在线分享代码