Android设备之间通过Wifi通信的示例代码

之前写过PC与Android之间通过WIFI通信(通过Socket,可以在博客里面搜索),PC作为主机,Android作为客户机,现在手头有一台仪器通过wifi传输数据,如果仪器作为主机发射WIFI热点信号,Android需要连接到该热点才能进一步进行通信,但是由于主机并没有连接到网络,所以在该种情况下Android设备无法使用网络实现相关的网络服务(比如关键数据的上传,网络数据的获取等等),所以仪器在开始设计的时候将其作为客户端,Android设备作为主机(网上的相关资料大多是将Android设备作为客户端),当Android设备开启热点后,仪器会主动尝试连接固定的热点信息,其中网络SSID和密码已经写死了,所以需要手机端手动修改热点名称:

在开启热点之后,此时手机相当于一个路由器,这个路由器的IP地址是固定的(本人测试过3台Android设备,其默认的路由器地址:192.168.43.1,iPhone的默认路由器地址:172.20.10.1),这个Demo主要实现的目标是Android设备客户端发送信息,服务端接受到信息后再发送信息给客户端。那么Android设备创建的SocketServer代码如下:

只有一个按钮,实现在线程中启动相对应的服务,所以在这里就不上图了,直接放代码:

package com.example.socketserver;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import com.koushikdutta.async.callback.CompletedCallback;
import com.koushikdutta.async.http.WebSocket;
import com.koushikdutta.async.http.WebSocket.StringCallback;
import com.koushikdutta.async.http.libcore.RequestHeaders;
import com.koushikdutta.async.http.server.AsyncHttpServer;
import com.koushikdutta.async.http.server.AsyncHttpServer.WebSocketRequestCallback;
import com.koushikdutta.async.http.server.AsyncHttpServerRequest;
import com.koushikdutta.async.http.server.AsyncHttpServerResponse;
import com.koushikdutta.async.http.server.HttpServerRequestCallback;
public class MainActivity extends Activity {
  private Button btnStart;
  private ServerSocket serverSocket;
  private BufferedReader in;
  private PrintWriter out;
  private Handler hander = new Handler(){

    @Override
    public void handleMessage(Message msg) {
      // TODO Auto-generated method stub
      super.handleMessage(msg);
      String s = (String)msg.obj;
      Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();
    }

  };
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    btnStart = (Button)findViewById(R.id.button1);
    btnStart.setOnClickListener(new View.OnClickListener() {

      @Override
      public void onClick(View v) {
        // TODO Auto-generated method stub
        new ServerThread().start();//在新线程中启动SocketServer...
      }
    });
  }

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
  }

  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
      return true;
    }
    return super.onOptionsItemSelected(item);
  }
  @Override
  protected void onStop() {
    // TODO Auto-generated method stub
    super.onStop();
  }
  private class ServerThread extends Thread{

    @Override
    public void run() {
      // TODO Auto-generated method stub
      super.run();
      try {
//        serverSocket = new ServerSocket(50005);//默认的路由器地址为Address: 192.168.43.1
        serverSocket = new ServerSocket(5000);
        while (true) {
          Socket clientSocket = serverSocket.accept();//阻塞等待处理...
           String remoteIP = clientSocket.getInetAddress().getHostAddress();
            int remotePort = clientSocket.getLocalPort();
            System.out.println("A client connected. IP:" + remoteIP+ ", Port: " + remotePort);
          System.out.println("server: receiving.............");
          // 获得 client 端的输入输出流,为进行交互做准备
          in = new BufferedReader(new InputStreamReader(
              clientSocket.getInputStream()));
          out = new PrintWriter(clientSocket.getOutputStream(), false);
          // 获得 client 端发送的数据
          String tmp = in.readLine();
          // String content = new String(tmp.getBytes("utf-8"));
          System.out.println("Client message is: " + tmp);
          // 向 client 端发送响应数据
          out.println("Your message has been received successfully!.");
          // 关闭各个流
          out.close();
          in.close();
           Message message = hander.obtainMessage();
           message.obj=tmp;
           hander.sendMessage(message);
           try {
            Thread.sleep(100);
          } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
          }
        }
      } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
  }
}

客户端实现的代码与网上相关的资料相差无几,比较简单:

package com.example.serverclient;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity {
  private Button sendBtn,sendMessageBtn;
  private Socket socket;
  private PrintStream output;
  private BufferedInputStream bufferedInputStream;
  private ReadThread readThread;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    sendBtn = (Button) findViewById(R.id.button1);
    sendMessageBtn = (Button) findViewById(R.id.button2);
    sendBtn.setOnClickListener(new View.OnClickListener() {

      @Override
      public void onClick(View v) {
        // TODO Auto-generated method stub
        new Thread(runnable).start();//开启线程
      }
    });
    sendMessageBtn.setOnClickListener(new View.OnClickListener() {

      @Override
      public void onClick(View v) {
        // TODO Auto-generated method stub
         sendMessage("hello,i am from client message");
      }
    });
  }
  Runnable runnable = new Runnable() {

    @Override
    public void run() {
      // TODO Auto-generated method stub
      initClientSocket();
      readThread = new ReadThread();
      readThread.start();
    }
  };

  public void initClientSocket() {
    try {
      socket = new Socket("192.168.43.1", 5000);
      output = new PrintStream(socket.getOutputStream(), true, "gbk");

    } catch (UnknownHostException e) {
      // TODO Auto-generated catch block
      System.out.println("请检查端口号是否为服务器IP");
      e.printStackTrace();
    } catch (IOException e) {
      // TODO Auto-generated catch block
      System.out.println("服务器未开启");
      e.printStackTrace();
    }
    output.println("this is the message from client");
  }
  public byte[] receiveData() {
    if (socket == null || socket.isClosed()) {
      try {
        socket = new Socket("192.168.43.1", 5000);
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
    byte[] data = null;
    if (socket.isConnected()) {
      try {
        bufferedInputStream = new BufferedInputStream(socket.getInputStream());
        data = new byte[bufferedInputStream.available()];
        bufferedInputStream.read(data);
      } catch (IOException e) {
        e.printStackTrace();
      }
    } else {
      data = new byte[1];
    }
    return data;
  }
  private void sendMessage(String str) {
    output.println(str);
  }

  public void closeSocket() {
    try {
      output.close();
      socket.close();
    } catch (IOException e) {
      System.out.println("error"+e);
    }
  }
  private class ReadThread extends Thread{

    @Override
    public void run() {
      // TODO Auto-generated method stub
      super.run();
      while (true) {
        byte[] data = receiveData();
        if (data.length > 1) {
          System.out.println(new String(data));
        }
      }
    }

  }

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
  }

  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
      return true;
    }
    return super.onOptionsItemSelected(item);
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 建立在Tablestore的Wifi设备监管系统架构实现

    Wifi设备监管 公司通过监管系统维护Wifi设备属性.采集Wifi设备监控数据.当需要Wifi设备上.下线时,通过监管系统操作完成设备的添加.下线,同时可通过系统修改.增加设备属性信息,如:设备mac地址.设备型号.设备地理位置等.设备上线后,会定期向系统推送监控数据,从而完成设备监控数据的采集.采集数据包含:cpu.内存.连接数.Wan口流量与流速.2.4G与5G模块的信道数据等. 通过分析监控数据指标.分析设备运行状态,动态将问题设备的运行状态修改为:预警.报警.借助系统,网络部门可以快速

  • 初识NoSQL NoSql数据库入门 NoSql数据库基础知识

    做了一年的大一年度项目了,对于关系型数据库结构还是有些了解了,有的时候还是觉得这种二维表不是很顺手.在看过一篇文章之后,对NoSQL有了初步的了解,(https://keen.io/blog/53958349217/analytics-for-hackers-how-to-think-about-event-data).这篇文章写的很好,确实写出来了在实际情况下NoSQL的"用武之地",而且用了MineCraft作分析,但是也许不够全面.比如文章中只是提到了,entity数据用关系型怎

  • 大数据时代的数据库选择:SQL还是NoSQL?

    一.专家简介VoltDB公司首席技术官Ryan Betts表示,SQL已经赢得了大型企业的广泛部署,大数据是它可以支持的另一个领域.Couchbase公司首席执行官Bob Wiederhold表示,NoSQL是可行的选择,并且从很多方面来看,它是大数据的最佳选择,特别是涉及到可扩展性时.二.SQL经历时间的考验,并仍然在蓬勃发展结构化查询语言(SQL)是经过时间考验的胜利者,它已经主宰了几十年,目前大数据公司和组织(例如谷歌.Facebook.Cloudera和Apache)正在积极投资于SQL

  • Linux系统安装NoSQL(MongoDB和Redis)步骤及问题解决办法(总结篇)

    如下是我工作中的记录,介绍的是linux系统下NoSQL:MongoDB和Redis的安装过程和遇到的问题以及解决办法: 需要的朋友可以按照如下步骤进行安装,可以快速安装MongoDB和Redis,希望可以帮助大家:)! 一.MongoDB 1.MongoDB安装 (1)将安装包mongodb-linux-i686-3.0.2.tgz拷贝到要安装的服务器中 这里我用的rz命令,如果不支持需要安装yum -y install lrzsz (2)解压安装程序 tar xzvf mongodb-lin

  • Android设备之间通过Wifi通信的示例代码

    之前写过PC与Android之间通过WIFI通信(通过Socket,可以在博客里面搜索),PC作为主机,Android作为客户机,现在手头有一台仪器通过wifi传输数据,如果仪器作为主机发射WIFI热点信号,Android需要连接到该热点才能进一步进行通信,但是由于主机并没有连接到网络,所以在该种情况下Android设备无法使用网络实现相关的网络服务(比如关键数据的上传,网络数据的获取等等),所以仪器在开始设计的时候将其作为客户端,Android设备作为主机(网上的相关资料大多是将Android

  • Android AIDL实现跨进程通信的示例代码

    AIDL是Android接口定义语言,它可以用于让某个Service与多个应用程序组件之间进行跨进程通信,从而可以实现多个应用程序共享同一个Service的功能. 实现步骤 例:用 A程序去访问 B程序的MyService.java服务 在B中建立AIDL文件MyAidlService.AIDL,在AIDL文件里写我们的接口方法 在MyService中写AIDL文件定义的方法的具体服务逻辑 在B的manifest文件中,为Service添加action "com.xyb.servicetest.

  • Android 实现无网络传输文件的示例代码

    最近的项目需要实现一个 Android 手机之间无网络传输文件的功能,就发现了 Wifi P2P(Wifi点对点)这么一个功能,最后也实现了通过 Wifi 隔空传输文件 的功能,这里我也来整理下代码,分享给大家. Wifi P2P 是在 Android 4.0 以及更高版本系统中加入的功能,通过 Wifi P2P 可以在不连接网络的情况下,直接与配对的设备进行数据交换.相对于蓝牙,Wifi P2P 的搜索速度和传输速度更快,传输距离更远 实现的效果如下所示: 客户端.png 服务器端.png 一

  • React Native JSI实现RN与原生通信的示例代码

    目录 什么是JSI JSI有什么不同 在iOS中使用JSI iOS端配置 RN端配置 js调用带参数的原生方法 原生调用JS 原生调用带参数的JS方法 在原生端调用js的函数参数 总结 问题 参考资料 什么是JSI React Native JSI (JavaScript Interface) 可以使 JavaScript 和 原生模块 更快.更简单的通信.它也是React Native 新的架构体系中Fabric UI层 和 Turbo 模块的核心部分. JSI有什么不同 JSI 移除了原生代

  • Android利用Flutter path绘制粽子的示例代码

    目录 前言 绘制 基本轮廓 粽叶 嘴巴 眼睛 腮红 手&脚 头巾 咸甜是一家 发声 动画控制嘴巴开合 用到的技术点 总结 前言 大家好,端午将至,首先提前祝小伙伴端午安康,端午作为中华民族的非常重要的传统节日,粽子那是必不可少的,但是你真的知道粽子的历史吗? 今天跟随本篇文章用Flutter path画一个会科普节日的的粽子吧- 绘制 基本轮廓 首先我们需要将粽子的基本轮廓绘制出来,通过图片可以看到粽子的轮廓是一个圆圆的三角形状, 本篇文章所有的图形都是用纯Path路径制作,这里我们可以将粽子的

  • Android PC投屏功能实现的示例代码

    本文介绍了Android PC投屏功能实现的示例代码,分享给大家,具体如下: 代码地址 :https://github.com/deepsadness/MediaProjectionDemo 效果预览 投屏效果预览 简单说明: 使用Android MediaProjection Api来完成视频的截图 通过WebSocket进行链接.将图片传递给网页 想法来源 看到vysor,觉得特别好玩,于是就想着自己能不能试着做一个类似的功能出来.搜索了相关实现.发现网上已经有网友针对vysor做了分析.于

  • python实现socket简单通信的示例代码

    首先先来简单介绍下socket: (具体更详细介绍的可以在网上找找,都讲得非常详细),这里主要是我自己的一些理解. socket是在应用层与传输层之间的一个抽象层,它的本质是编程接口,通过socket,才能实现TCP/IP协议. 它就是一个底层套件,用来处理最底层消息的接受和发送. socket翻译为套接字,可以把TCP/IP复杂的操作抽象为简单的几个接口来供应用层调用来实现进程在网络中的通信.socket起源于Unix,而Unix的基本要素之一就是"一切都为文件",即可以通过打开--

  • QT5实现UDP通信的示例代码

    目录 前言 一.UDP通信概述 二.UDP单播模式 1.接收数据 2.发送数据 总结 代码h文件 代码c文件 前言 该例程经过实际验证可以正常使用,只简单的使用UDP中的单播模式(一对一),其余模式将在后期逐步说明...... 所用测试系统在同一局域网,其中: QT版本:5.12 PC端UDP模式:单播 UDP通信目标:基于STM32F4+LWIP协议的以太网接口 一.UDP通信概述 UDP是轻量的.不可靠的.面向数据报.无连接的协议,它可以用于对可靠性要求不高的场合,和TCP通信不同,两个程序

  • Android实现字母导航控件的示例代码

    目录 自定义属性 Measure测量 坐标计算 绘制 Touch事件处理 数据组装 显示效果 今天分享一个以前实现的通讯录字母导航控件,下面自定义一个类似通讯录的字母导航 View,可以知道需要自定义的几个要素,如绘制字母指示器.绘制文字.触摸监听.坐标计算等,自定义完成之后能够达到的功能如下: 完成列表数据与字母之间的相互联动; 支持布局文件属性配置; 在布局文件中能够配置相关属性,如字母颜色.字母字体大小.字母指示器颜色等属性. 主要内容如下: 自定义属性 Measure测量 坐标计算 绘制

  • Android 实现无网络页面切换的示例代码

    本文介绍了Android 实现无网络页面切换的示例代码,分享给大家,具体如下: 实现思路 需求是在无网络的时候显示特定的页面,想到要替换页面的地方,大多都是recyclerview或者第三方recyclerview这种需要显示数据的地方,因此决定替换掉页面中所有的recyclerview为无网络页面 实现过程 1 在BaseActivity中,当加载布局成功以后,通过id找到要替换的view,通过indexOfChild()方法,找到要替换的view的位置,再通过remove和add view来

随机推荐