Android设备间通信(wifi连接)
基于TCP/IP协议实现:
1、首先在服务端新建ServerSocket类,指定端口号,利用其获取连接信息,得到Socket,之后的数据接收与发送,就可以通过这个Socket来进行实现。
server端主程序
package aw.com.wifi_connect_server;
import android.app.Activity;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class MainActivity extends AppCompatActivity {
private TextView server_ip_port;
private TextView client_ip_port;
private TextView sendData;
private String msg_send;
private EditText message;
private ServerSocket serverSocket = null;
StringBuffer stringBuffer = new StringBuffer();
private InputStream inputStream;
private String IP=null;
private int Port=0;
private String clientIp;
private int clientPort;
private Socket socket = null;
public Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
//super.handleMessage(msg);
switch (msg.what){
case 1:
server_ip_port.setText(msg.obj.toString());
break;
case 2:
message.setText(msg.obj.toString());
stringBuffer.setLength(0);
break;
case 3:
client_ip_port.setText(msg.obj.toString());
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
server_ip_port = (TextView) findViewById(R.id.server);
client_ip_port = (TextView) findViewById(R.id.client);
message = (EditText) findViewById(R.id.message_get);
sendData = (EditText) findViewById(R.id.send_data);
receiveData();
}
/*
服务器端接收数据
需要注意以下一点:
服务器端应该是多线程的,因为一个服务器可能会有多个客户端连接在服务器上;
*/
private void receiveData() {
Thread thread = new Thread(){
@Override
public void run() {
super.run();
/*指明服务器端的端口号*/
try {
serverSocket = new ServerSocket(8091);
} catch (IOException e) {
e.printStackTrace();
}
if (serverSocket!=null && !serverSocket.isClosed()){
Port = serverSocket.getLocalPort();
}
WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
int state = wifiManager.getWifiState();
if (state == 3) {
WifiInfo info = wifiManager.getConnectionInfo();
IP = intIP2StringIP(info.getIpAddress());
Message message_1 = handler.obtainMessage();
message_1.what = 1;
message_1.obj = "IP:" + IP + " PORT: " + Port;
handler.sendMessage(message_1);
while (true) {
try {
if (serverSocket != null && !serverSocket.isClosed()) {
socket = serverSocket.accept();
clientIp = socket.getInetAddress().toString();
clientIp = clientIp.substring(1,clientIp.length());
clientPort = socket.getPort();
Message message_3 = handler.obtainMessage();
message_3.what = 3;
message_3.obj = "IP:" + clientIp + " PORT:" + clientPort;
handler.sendMessage(message_3);
inputStream = socket.getInputStream();
new ServerThread(socket, inputStream).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
};
thread.start();
}
private String intIP2StringIP(int ip) {
return (ip & 0xFF) + "." + ((ip >> 8) & 0xFF) + "." + ((ip >> 16) & 0xFF) + "." + ((ip >> 24) & 0xFF);
}
public void send(View view){
msg_send = sendData.getText().toString();
if (msg_send.isEmpty()){
Toast.makeText(MainActivity.this, "Please input Sending data", Toast.LENGTH_SHORT).show();
}
msg_send = msg_send + "\0";
Thread thread = new Thread() {
@Override
public void run() {
super.run();
try {
OutputStream outputStream = socket.getOutputStream();
outputStream.write(msg_send.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
};
thread.start();
}
class ServerThread extends Thread{
private Socket socket;
private InputStream inputStream;
private StringBuffer stringBuffer = MainActivity.this.stringBuffer;
public ServerThread(Socket socket,InputStream inputStream){
this.socket = socket;
this.inputStream = inputStream;
}
@Override
public void run() {
int len;
byte[] bytes = new byte[20];
boolean isString = false;
try {
//在这里需要明白一下什么时候其会等于 -1,其在输入流关闭时才会等于 -1,
//并不是数据读完了,再去读才会等于-1,数据读完了,最结果也就是读不到数据为0而已;
while ((len = inputStream.read(bytes)) != -1) {
for(int i=0; i
server端页面
package aw.com.wifi_connect_client;
import android.content.Context;
import android.net.wifi.WifiManager;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
public class MainActivity extends AppCompatActivity {
private EditText et_IP, et_data;
private TextView local_ip_port;
private String localIP;
private int localPort;
private OutputStream outputStream = null;
private Socket socket = null;
private String IP;
private String data;
private boolean socketStatus = false;
private EditText message;
private StringBuffer stringBuffer = new StringBuffer();
private InputStream inputStream;
public Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
//super.handleMessage(msg);
switch (msg.what) {
case 1:
local_ip_port.setText(msg.obj.toString());
break;
case 2:
message.setText(msg.obj.toString());
stringBuffer.setLength(0);
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_IP = (EditText) findViewById(R.id.et_ip);
et_data = (EditText) findViewById(R.id.et_data);
local_ip_port = (TextView) findViewById(R.id.local_ip_port);
message = (EditText) findViewById(R.id.message_get);
}
public void connect(View view) {
IP = et_IP.getText().toString();
if (IP.isEmpty()) {
Toast.makeText(MainActivity.this, "Please input Server IP", Toast.LENGTH_SHORT).show();
}
Thread thread = new Thread() {
@Override
public void run() {
super.run();
WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
int state = wifiManager.getWifiState();
if (!socketStatus && state == 3) {
try {
socket = new Socket(IP, 8091);
if (socket != null && !socket.isClosed()) {
localIP = socket.getLocalAddress().toString();
localIP = localIP.substring(1, localIP.length());
localPort = socket.getLocalPort();
Message message_1 = handler.obtainMessage();
message_1.what = 1;
message_1.obj = "IP:" + localIP + " PORT:" + localPort;
handler.sendMessage(message_1);
socketStatus = true;
outputStream = socket.getOutputStream();
receiveData(); //建立连接后,才可进行数据发送与数据接收
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
};
thread.start();
}
public void send(View view) {
data = et_data.getText().toString();
if (data.isEmpty()) {
Toast.makeText(MainActivity.this, "Please input Sending Data", Toast.LENGTH_SHORT).show();
}
data = data + "\0";
Thread thread = new Thread() {
@Override
public void run() {
super.run();
if (socketStatus) {
try {
outputStream.write(data.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
}
};
thread.start();
}
/**
* 接收数据
*/
private void receiveData() {
Thread thread = new Thread() {
@Override
public void run() {
super.run();
try {
inputStream = socket.getInputStream();
new ServerThread(socket, inputStream).start();
} catch (IOException e) {
e.printStackTrace();
}
}
};
thread.start();
}
class ServerThread extends Thread{
private Socket socket;
private InputStream inputStream;
private StringBuffer stringBuffer = MainActivity.this.stringBuffer;
public ServerThread(Socket socket, InputStream inputStream) {
this.socket = socket;
this.inputStream = inputStream;
}
@Override
public void run() {
int len;
byte[] bytes = new byte[20];
boolean isString = false;
try {
//在这里需要明白一下什么时候其会等于 -1,其在输入流关闭时才会等于 -1,
//并不是数据读完了,再去读才会等于-1,数据读完了,最结果也就是读不到数据为0而已;
while ((len = inputStream.read(bytes)) != -1) {
for(int i=0; i
客户端页面
10-12 20:09:03.681 23977-24056/aw.com.wifi_connect_server W/System.err: at java.net.ServerSocket.createImpl(ServerSocket.java:309)
10-12 20:09:03.681 23977-24056/aw.com.wifi_connect_server W/System.err: at java.net.ServerSocket.getImpl(ServerSocket.java:258)
10-12 20:09:03.681 23977-24056/aw.com.wifi_connect_server W/System.err: at java.net.ServerSocket.bind(ServerSocket.java:377)
10-12 20:09:03.681 23977-24056/aw.com.wifi_connect_server W/System.err: at java.net.ServerSocket.<init>(ServerSocket.java:237)
10-12 20:09:03.681 23977-24056/aw.com.wifi_connect_server W/System.err: at java.net.ServerSocket.<init>(ServerSocket.java:128)
10-12 20:09:03.681 23977-24056/aw.com.wifi_connect_server W/System.err: at aw.com.wifi_connect_server.MainActivity$2.run(MainActivity.java:71)
<uses-permission android:name="android.permission.INTERNET" />
Android设备间通信(wifi连接)相关推荐
- Android Studio 使用 WIFI 连接手机
Android Studio 使用 WIFI 连接手机 手机连线经常接触不良, 连上又断又连上又断的时候, 只要确保有一点时间让你连上 adb wifi, 就不用再听到那烦人的声音. 注意手机跟电脑必 ...
- Android 源码 Wi-Fi 连接流程分析
Wi-Fi 连接过程可以从 Settings App 中点击任意 Wi-Fi 条目连接说起.点击条目以后会弹出一个对话框,根据不同的 Wi-Fi 类型需要填入必要的信息,再点击连接按钮,发起连接过程. ...
- Android手机用wifi连接adb调试的方法
https://www.jianshu.com/p/dc6898380e38 0x0 前言 Android开发肯定要连接pc的adb进行调试,传统的方法是用usb与pc进行连接,操作简单即插即用,缺点 ...
- Android无线调试 Wifi连接ADB不用数据线
为什么用Wifi连接ADB不用数据线?因为我的数据线不见了. 前提:你的手机ROOT过,做Android开发的,别跟人说你的手机不是ROOT的. 步骤: 1.在手机上把ADB服务进程的TCP端口 ...
- Android 系统,Wifi连接后,显示wifi已连接但无法访问网络。
7.1系统8.0系统,Wifi连接后,显示wifi已连接但无法访问网络. 原因: 连接wifi后,会访问google服务器,由于国内访问不了,所以会显示"wifi已连接,但无法访问网络&qu ...
- android studio 通过wifi连接手机调试
<div id="article_content" class="article_content clearfix csdn-tracking-statistics ...
- Android 9.0 Wifi连接AP过程
本文分析的是首次连接AP(没有保存参数的AP)的过程. 一.简易流程图 二.代码执行流程 2.1 Settings应用 2.2 WifiManager.java 通过异步通道AsyncChannel来 ...
- ADB命令指令控制Android系统的WIFI连接开启/关闭状态
Android系统的usb调试已开启,连接电脑(有ADB环境) 1.在cmd中,进入shell指令模式 adb shell 2.进入ROOT指令模式 su 3. 打开WIFI指令 svc wifi e ...
- Android客户端与PC服务器实现Socket通信(wifi)
转载自:http://www.cnblogs.com/dwayne/archive/2012/05/22/Android_pc_wifi_socket.html 本文介绍Android终端持续扫描AP ...
最新文章
- java 条件匹配_java语言实现满足多条件匹配简单过滤输出问题
- MySQL 删除数据的最好的方式
- CentOS7 Mysql5.7.22 源码安装
- android java 指针异常处理,Android自定义抛出异常的方法详解
- apt apt-get 区别_apt 和 aptget 之间的区别
- 从俄罗斯方块到星际2,全都用得上:DeepMind无监督分割大法,为游戏而生
- [转载] 使用hexo+github搭建免费个人博客详细教程
- PC电脑桌面监控:Xbox Game Bar
- Ubuntu22.04安装Arduino IDE及Arduino UNO(使用CH341驱动)调试方法
- 波束形成matlab程序,mVDR波束形成matlab程序
- atmega 128 单片机 智能风扇控制器 PWM 串口 DS18B20 PROTEUS 仿真
- MSP430FR5994LannchPad开发笔记之三:MSP430的IO复用以及如何去获取IO复用功能
- android仿微信浮窗的自动贴边可展开悬浮按钮
- Mac怎么创建加密文件夹
- Class-incremental Learning via Deep Model Consolidation 翻译
- vivo x60pro刷机鸿蒙,vivoX60Pro+玩机技巧-有哪些黑科技
- php sybase存储过,SYBASE存储过程详解
- 计算机休眠会断电吗,电脑「睡眠」和「休眠」原来有这么大区别,下次别用错了。...
- DGP链游公会丨一文概览什么是GameFi链游
- Zookeeper 在Windows下的安装过程及测试
热门文章
- python爬取网页停止_Python爬虫之爬取静态网页
- SimpleDateFormat 格式化日期
- npm install失败的解决方法
- Log4j2 - java.lang.NoSuchMethodError: com.lmax.disruptor.dsl.Disruptor
- 在嵌入式设计中使用MicroBlaze(Vivado版本)
- 不要版面费的期刊名称
- android context继承关系,Android - 认识Context
- Python之turtle画小狗、狮子头和小黄人
- Linux/Android之perf追内存泄漏工具(api级别)
- Webrtc半小时搭建视频通话 视频会议