赞
踩
在前几篇的文章中带大家完成了基于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的工程文件。
其他参考链接:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。