基于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端页面

2、客户端,需知道服务器端的IP地址与端口号,然后才能依据server端的IP和端口号与server端建立连接,得到Socket,建立连接后,数据的接收与发送同样依赖于这一Socket。
client端主程序
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

客户端页面


server端与client端页面效果
注意事项:
由于使用到了网络,故需要添加相应的权限,若缺少可能会出现如下错误
10-12 20:09:03.680 23977-24056/aw.com.wifi_connect_server W/System.err: java.net.SocketException: Permission denied
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)
在server与client的AndroidManifest.xml中添加相应权限
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />

Android设备间通信(wifi连接)相关推荐

  1. Android Studio 使用 WIFI 连接手机

    Android Studio 使用 WIFI 连接手机 手机连线经常接触不良, 连上又断又连上又断的时候, 只要确保有一点时间让你连上 adb wifi, 就不用再听到那烦人的声音. 注意手机跟电脑必 ...

  2. Android 源码 Wi-Fi 连接流程分析

    Wi-Fi 连接过程可以从 Settings App 中点击任意 Wi-Fi 条目连接说起.点击条目以后会弹出一个对话框,根据不同的 Wi-Fi 类型需要填入必要的信息,再点击连接按钮,发起连接过程. ...

  3. Android手机用wifi连接adb调试的方法

    https://www.jianshu.com/p/dc6898380e38 0x0 前言 Android开发肯定要连接pc的adb进行调试,传统的方法是用usb与pc进行连接,操作简单即插即用,缺点 ...

  4. Android无线调试 Wifi连接ADB不用数据线

    为什么用Wifi连接ADB不用数据线?因为我的数据线不见了. 前提:你的手机ROOT过,做Android开发的,别跟人说你的手机不是ROOT的. 步骤:    1.在手机上把ADB服务进程的TCP端口 ...

  5. Android 系统,Wifi连接后,显示wifi已连接但无法访问网络。

    7.1系统8.0系统,Wifi连接后,显示wifi已连接但无法访问网络. 原因: 连接wifi后,会访问google服务器,由于国内访问不了,所以会显示"wifi已连接,但无法访问网络&qu ...

  6. android studio 通过wifi连接手机调试

    <div id="article_content" class="article_content clearfix csdn-tracking-statistics ...

  7. Android 9.0 Wifi连接AP过程

    本文分析的是首次连接AP(没有保存参数的AP)的过程. 一.简易流程图 二.代码执行流程 2.1 Settings应用 2.2 WifiManager.java 通过异步通道AsyncChannel来 ...

  8. ADB命令指令控制Android系统的WIFI连接开启/关闭状态

    Android系统的usb调试已开启,连接电脑(有ADB环境) 1.在cmd中,进入shell指令模式 adb shell 2.进入ROOT指令模式 su 3. 打开WIFI指令 svc wifi e ...

  9. Android客户端与PC服务器实现Socket通信(wifi)

    转载自:http://www.cnblogs.com/dwayne/archive/2012/05/22/Android_pc_wifi_socket.html 本文介绍Android终端持续扫描AP ...

最新文章

  1. java 条件匹配_java语言实现满足多条件匹配简单过滤输出问题
  2. MySQL 删除数据的最好的方式
  3. CentOS7 Mysql5.7.22 源码安装
  4. android java 指针异常处理,Android自定义抛出异常的方法详解
  5. apt apt-get 区别_apt 和 aptget 之间的区别
  6. 从俄罗斯方块到星际2,全都用得上:DeepMind无监督分割大法,为游戏而生
  7. [转载] 使用hexo+github搭建免费个人博客详细教程
  8. PC电脑桌面监控:Xbox Game Bar
  9. Ubuntu22.04安装Arduino IDE及Arduino UNO(使用CH341驱动)调试方法
  10. 波束形成matlab程序,mVDR波束形成matlab程序
  11. atmega 128 单片机 智能风扇控制器 PWM 串口 DS18B20 PROTEUS 仿真
  12. MSP430FR5994LannchPad开发笔记之三:MSP430的IO复用以及如何去获取IO复用功能
  13. android仿微信浮窗的自动贴边可展开悬浮按钮
  14. Mac怎么创建加密文件夹
  15. Class-incremental Learning via Deep Model Consolidation 翻译
  16. vivo x60pro刷机鸿蒙,vivoX60Pro+玩机技巧-有哪些黑科技
  17. php sybase存储过,SYBASE存储过程详解
  18. 计算机休眠会断电吗,电脑「睡眠」和「休眠」原来有这么大区别,下次别用错了。...
  19. DGP链游公会丨一文概览什么是GameFi链游
  20. Zookeeper 在Windows下的安装过程及测试

热门文章

  1. python爬取网页停止_Python爬虫之爬取静态网页
  2. SimpleDateFormat 格式化日期
  3. npm install失败的解决方法
  4. Log4j2 - java.lang.NoSuchMethodError: com.lmax.disruptor.dsl.Disruptor
  5. 在嵌入式设计中使用MicroBlaze(Vivado版本)
  6. 不要版面费的期刊名称
  7. android context继承关系,Android - 认识Context
  8. Python之turtle画小狗、狮子头和小黄人
  9. Linux/Android之perf追内存泄漏工具(api级别)
  10. Webrtc半小时搭建视频通话 视频会议