​ 看了几天的Android WiFi通讯,总结一下,并附相关Demo(也是仿网上做的),建议收藏

​ 两台设备(手机与手机,手机与硬件都一样)在同一WiFi下通讯,用的是TCP/IP协议,那我们应如何使用?其实很简单:

服务端:用ServerSocket开启一个端口(port),等待客户端连接,连接成功后可得到一个Socket,再用这个Socket就可以拿到服务端输入流(InputStream)和输出流(OutputStream);

客户端:通过服务端的IP(在局域网下的IP)和Port(ServerSocket开启的端口号),用Socket进行连接,连接成功后当然就用这个Socket就可以拿到客户端输入流(InputStream)和输出流(OutputStream)啦;

​ 然后,服务端或客户端向输出流里写东西,另一端再从自己的输入流里读就完成了!~~

​ 下面来看看具体实现

WiFi通讯需要申请的权限

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>

在同一局域网下通讯

1.服务端

(1)启用一个服务端口

启用一个服务端口,并获得一个ServerSocket

mServerSocket = new ServerSocket(5000);//port:5000

(2)等待连接

定义一个用于等待客户端连接的线程

/*** 连接线程* 得到Socket*/
class SocketAcceptThread extends Thread{@Overridepublic void run() {try {//等待客户端进行连接,此时accept会阻塞,直到建立连接mSocket = mServerSocket.accept();} catch (IOException e) {e.printStackTrace();return;//accept error}//连接成功后,启动消息接收线程startReader(mSocket);}
}
//启动服务线程
SocketAcceptThread socketAcceptThread = new SocketAcceptThread();
socketAcceptThread.start();

(3)接收消息

定义一个线程来接收客户端发来的消息

private void startReader(final Socket socket) {new Thread() {@Overridepublic void run() {DataInputStream reader;try {// 获取读取流reader = new DataInputStream(socket.getInputStream());while (true) {// 读取数据String msg = reader.readUTF();Log.d(TAG, "客户端的信息:" + msg);//告知客户端消息收到DataOutputStream writer = new DataOutputStream(mSocket.getOutputStream());writer.writeUTF("收到:" + msg); // 写一个UTF-8的信息//向主线程发消息更新UIMessage message = new Message();message.what = 1;message.obj=msg;handler.sendMessage(message);}} catch (IOException e) {e.printStackTrace();}}}.start();
}

(4)关闭Socket

 if (mServerSocket != null) {try {mServerSocket.close();} catch (IOException e) {e.printStackTrace();}}if(mSocket!=null){try {mSocket.close();} catch (IOException e) {e.printStackTrace();}}

(5)获取服务端ip地址

public class NetWorkUtils {/*** 检查网络是否可用** @param paramContext* @return*/public static boolean checkEnable(Context paramContext) {boolean i = false;NetworkInfo localNetworkInfo = ((ConnectivityManager) paramContext.getSystemService("connectivity")).getActiveNetworkInfo();if ((localNetworkInfo != null) && (localNetworkInfo.isAvailable()))return true;return false;}/*** 将ip的整数形式转换成ip形式** @param ipInt* @return*/public static String int2ip(int ipInt) {StringBuilder sb = new StringBuilder();sb.append(ipInt & 0xFF).append(".");sb.append((ipInt >> 8) & 0xFF).append(".");sb.append((ipInt >> 16) & 0xFF).append(".");sb.append((ipInt >> 24) & 0xFF);return sb.toString();}/*** 获取当前ip地址** @param context* @return*/public static String getLocalIpAddress(Context context) {try {WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);WifiInfo wifiInfo = wifiManager.getConnectionInfo();int i = wifiInfo.getIpAddress();return int2ip(i);} catch (Exception ex) {return " 获取IP出错鸟!!!!请保证是WIFI,或者请重新打开网络!\n" + ex.getMessage();}// return null;}
}

2.客户端

(1)进行连接

 /*** 连接线程*/class SocketConnectThread extends Thread{public void run(){try {//指定ip地址和端口号mSocket = new Socket(ipET.getText().toString(), 1989);//获取输出流、输入流
//                mOutStream = mSocket.getOutputStream();
//                mInStream = mSocket.getInputStream();} catch (Exception e) {e.printStackTrace();return;}startReader(mSocket);}}
socketConnectThread = new SocketConnectThread();
socketConnectThread.start();

(2)发送消息

/*** 发送消息* @param msg*/
public void sendMessage(final String msg) {if (msg.length() == 0){return;}new Thread() {@Overridepublic void run() {try {DataOutputStream writer = new DataOutputStream(mSocket.getOutputStream());writer.writeUTF(msg); // 写一个UTF-8的信息} catch (IOException e) {e.printStackTrace();}}}.start();
}

(3)接收消息

/*** 接收消息*/
private void startReader(final Socket socket) {new Thread(){@Overridepublic void run() {DataInputStream reader;try {// 获取读取流reader = new DataInputStream(socket.getInputStream());while (true) {// 读取数据String msg = reader.readUTF();Message message = new Message();message.what = 1;message.obj=msg;handler.sendMessage(message);}} catch (IOException e) {e.printStackTrace();}}}.start();
}

(4)关闭Socket

if(mSocket!=null){try {mSocket.close();} catch (IOException e) {e.printStackTrace();}
}

WiFiDemo地址

KWJYES/WiFiDemo (github.com)

Android:在同一WiFi下通讯(局域网下服务端和客户端通讯)相关推荐

  1. ubuntu linux 下建立 纯L2TP 服务端和客户端

    以下是从网上摘下,并亲测可行的方法. 一.服务端 使用环境: System: Ubuntu 10.04 Desktop Package:xl2tpd 1. 安装所需软件包. apt-get insta ...

  2. CAS服务下单点登录(服务端与客户端)

    转自:http://www.open-open.com/lib/view/open1359286846414.html 此文的目的是为了加深自己的理解,做一个备份与分享 过程全为自己的实际操作步骤 第 ...

  3. 服务端和客户端证书各种组合下对访问者(浏览器/中间人)的影响

    今天本来想研究下nginx下如果获取SSL指纹,但是环境没有装成功 就尝试了下如果不用nginx直接在服务端拿到SSL指纹, 没想到从创建自签名证书到如何开启证书, 以及服务端证书和客户端证书各种组合 ...

  4. 非零基础自学Golang 第18章 HTTP编程(下) 18.2 HTTP服务端 18.2.2 启动HTTP服务器 18.2.3 启动HTTPS服务器

    非零基础自学Golang 文章目录 非零基础自学Golang 第18章 HTTP编程(下) 18.2 HTTP服务端 18.2.2 启动HTTP服务器 18.2.3 启动HTTPS服务器 第18章 H ...

  5. Linux下yum安装SVN服务端

    Linux下yum安装SVN服务端 1.查看yum是否安装 2.安装svn 3.创建目录并配置 4.用户密码passwd配置 5.权限控制authz配置 6.服务svnserve.conf配置 7.启 ...

  6. windows环境下MySQL服务端和客户端安装,超详细

    windows环境下MySQL服务端和客户端安装,超详细 MySQL简介 MySQL的安装步骤 服务端安装 客户端安装 MySQL简介 MySQL是关系型数据库,由n张互相关联的表组成.一般是c或c+ ...

  7. Esp8266学习之旅⑧ 你要找的8266作为UDP、TCP客户端或服务端的角色通讯,都在这了。(带Demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 序号 SDK版本 内容 链接 1 nonos2.0 搭建 ...

  8. Netty实战 IM即时通讯系统(八)服务端和客户端通信协议编解码

    Netty实战 IM即时通讯系统(八)服务端和客户端通信协议编解码 零. 目录 IM系统简介 Netty 简介 Netty 环境配置 服务端启动流程 客户端启动流程 实战: 客户端和服务端双向通信 数 ...

  9. android 仿微信demo————注册功能实现(服务端)

    android 仿微信demo----微信启动界面实现 android 仿微信demo----注册功能实现(移动端) android 仿微信demo----注册功能实现(服务端) android 仿微 ...

最新文章

  1. win10系统优化计算机,全面优化win10电脑系统详细教程 | 专业网吧维护
  2. 26.使用ajaxSetup()方法设置全局Ajax默认选项
  3. 左侧固定右侧自动填充_办公小技巧:解决Excel公式自动填充问题
  4. 黑马程序员-4 String类和StringBuffer类
  5. [MATLAB粒子模拟]Energy Vx(X) Vy(X) Vz(X)
  6. 使用pssh进行并行批量操作
  7. [蓝桥杯2017初赛]九宫幻方-数论+next_permutation枚举
  8. aws lambda_适用于无服务器Java开发人员的AWS Lambda:它为您提供了什么?
  9. (35)VHDL实现JK触发器
  10. 三句话教你买对房子!买到好房子的都祝福哥三年内赚两个亿!
  11. 【Cadence16.6】安装教程
  12. 2、金字塔原理:思考的逻辑(6-7)-阅读笔记
  13. 谷歌学术首页url爬取
  14. js 百度、高德、谷歌、火星、wgs84(2000)地图坐标相互转换的JS实现
  15. 基金经理学量化(Python+AI)
  16. linux下.txt文件名乱码,Linux下打开txt文件乱码问题解决方案
  17. 笔记本电脑数据怎么恢复?笔记本电脑数据恢复用什么工具?
  18. Android如何让Fragment加载到Activity中
  19. 系统管理员设置了系统策略,禁止进行此安装。解决方案
  20. 【ava数据集可视化】ava数据集ID可视化 A Video Dataset of Spatio-temporally Localized Atomic Visual Actions

热门文章

  1. 中国的教育缺少什么?
  2. docker实现quagga_docker中安装quagga详细介绍
  3. 【c语言作业-二维数组】编写程序,求一个给定的n阶方阵的鞍点。
  4. 获取网站的浏览器上的icon图标
  5. 温湿度传感器原理介绍
  6. Mockito 框架用于单元测试
  7. 超实用的自动化测试平台推荐
  8. 阅读软件汇-EPUB专版
  9. 网站访问速度诊断工具汇总
  10. vue 网页生成二维码,微信扫一扫在手机打开页面