Android:在同一WiFi下通讯(局域网下服务端和客户端通讯)
看了几天的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下通讯(局域网下服务端和客户端通讯)相关推荐
- ubuntu linux 下建立 纯L2TP 服务端和客户端
以下是从网上摘下,并亲测可行的方法. 一.服务端 使用环境: System: Ubuntu 10.04 Desktop Package:xl2tpd 1. 安装所需软件包. apt-get insta ...
- CAS服务下单点登录(服务端与客户端)
转自:http://www.open-open.com/lib/view/open1359286846414.html 此文的目的是为了加深自己的理解,做一个备份与分享 过程全为自己的实际操作步骤 第 ...
- 服务端和客户端证书各种组合下对访问者(浏览器/中间人)的影响
今天本来想研究下nginx下如果获取SSL指纹,但是环境没有装成功 就尝试了下如果不用nginx直接在服务端拿到SSL指纹, 没想到从创建自签名证书到如何开启证书, 以及服务端证书和客户端证书各种组合 ...
- 非零基础自学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 ...
- Linux下yum安装SVN服务端
Linux下yum安装SVN服务端 1.查看yum是否安装 2.安装svn 3.创建目录并配置 4.用户密码passwd配置 5.权限控制authz配置 6.服务svnserve.conf配置 7.启 ...
- windows环境下MySQL服务端和客户端安装,超详细
windows环境下MySQL服务端和客户端安装,超详细 MySQL简介 MySQL的安装步骤 服务端安装 客户端安装 MySQL简介 MySQL是关系型数据库,由n张互相关联的表组成.一般是c或c+ ...
- Esp8266学习之旅⑧ 你要找的8266作为UDP、TCP客户端或服务端的角色通讯,都在这了。(带Demo)
本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 序号 SDK版本 内容 链接 1 nonos2.0 搭建 ...
- Netty实战 IM即时通讯系统(八)服务端和客户端通信协议编解码
Netty实战 IM即时通讯系统(八)服务端和客户端通信协议编解码 零. 目录 IM系统简介 Netty 简介 Netty 环境配置 服务端启动流程 客户端启动流程 实战: 客户端和服务端双向通信 数 ...
- android 仿微信demo————注册功能实现(服务端)
android 仿微信demo----微信启动界面实现 android 仿微信demo----注册功能实现(移动端) android 仿微信demo----注册功能实现(服务端) android 仿微 ...
最新文章
- win10系统优化计算机,全面优化win10电脑系统详细教程 | 专业网吧维护
- 26.使用ajaxSetup()方法设置全局Ajax默认选项
- 左侧固定右侧自动填充_办公小技巧:解决Excel公式自动填充问题
- 黑马程序员-4 String类和StringBuffer类
- [MATLAB粒子模拟]Energy Vx(X) Vy(X) Vz(X)
- 使用pssh进行并行批量操作
- [蓝桥杯2017初赛]九宫幻方-数论+next_permutation枚举
- aws lambda_适用于无服务器Java开发人员的AWS Lambda:它为您提供了什么?
- (35)VHDL实现JK触发器
- 三句话教你买对房子!买到好房子的都祝福哥三年内赚两个亿!
- 【Cadence16.6】安装教程
- 2、金字塔原理:思考的逻辑(6-7)-阅读笔记
- 谷歌学术首页url爬取
- js 百度、高德、谷歌、火星、wgs84(2000)地图坐标相互转换的JS实现
- 基金经理学量化(Python+AI)
- linux下.txt文件名乱码,Linux下打开txt文件乱码问题解决方案
- 笔记本电脑数据怎么恢复?笔记本电脑数据恢复用什么工具?
- Android如何让Fragment加载到Activity中
- 系统管理员设置了系统策略,禁止进行此安装。解决方案
- 【ava数据集可视化】ava数据集ID可视化 A Video Dataset of Spatio-temporally Localized Atomic Visual Actions