背景:手机连接到其他Ap设备热点后,与之通过Socket通信
WiFi连接
Android 10+ Wifi连接(一) 上篇文章有详细步骤,本节从已连接到设备热点开始
大坑
通过 WifiNetworkSpecifier连接wifi后,不能直接做Socket连接,需要先bind socket;network.bindSocket(socket); 否则Socket永远连接不上
mNetworkCallback = new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(@NonNull Network network) {
super.onAvailable(network);
try {
socket = new Socket();
network.bindSocket(socket);
} catch (IOException e) {
e.printStackTrace();
}
ServerThread thread=new ServerThread();
thread.start();
}
Socket连接
class ServerThread extends Thread {
public void run() {
try {
//连接
socket.connect(new InetSocketAddress(ip, 端口));
String socketAddress = socket.getRemoteSocketAddress().toString();
//接收服务端返回信息
while (true) {
byte[] b = new byte[1024 * 1024];
InputStream in = socket.getInputStream();
int len = in.read(b);
String s = new String(b, 0, len);
Log.e("返回:",s);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
给服务端发送消息
new Thread(new Runnable() {
@Override
public void run() {
try {
if (socket == null) return;
OutputStream om = socket.getOutputStream();
om.write(Constant.SERVER_TEXT.getBytes());
om.write(“这是发送的消息”.getBytes());
om.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();