Android Studio 代码实现手机连接 WiFi 热点并进行 TCP 通信
Android Studio 代码实现手机连接 WiFi 热点并进行 TCP 通信
本代码示例使用 Android Studio 实现手机连接 WiFi 热点并进行 TCP 通信,按下按钮向 WiFi 热点发送 'a',并展示连接、通信和数据发送的具体流程。
1. 添加权限
由于涉及到连接 WiFi 和 TCP 通信,需要在 AndroidManifest.xml 文件中添加以下权限:
<uses-permission android:name='android.permission.ACCESS_WIFI_STATE' />
<uses-permission android:name='android.permission.CHANGE_WIFI_STATE' />
<uses-permission android:name='android.permission.INTERNET' />
2. 代码实现
在 MainActivity.java 文件中添加以下代码:
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class MainActivity extends AppCompatActivity {
private WifiManager wifiManager;
private ConnectivityManager connectivityManager;
private Button sendButton;
private String ssid = 'WiFi热点名称';
private String password = 'WiFi热点密码';
private String ipAddress = 'WiFi热点IP地址';
private int port = 8888;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
sendButton = findViewById(R.id.send_button);
sendButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isConnectedToWifi()) {
new SendDataTask().execute('a');
} else {
Toast.makeText(MainActivity.this, '请连接WiFi热点', Toast.LENGTH_SHORT).show();
}
}
});
}
private boolean isConnectedToWifi() {
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
return true;
}
return false;
}
private boolean connectToWifi() {
WifiConfiguration wifiConfiguration = new WifiConfiguration();
wifiConfiguration.SSID = ''' + ssid + ''';
wifiConfiguration.preSharedKey = ''' + password + ''';
int netId = wifiManager.addNetwork(wifiConfiguration);
wifiManager.disconnect();
wifiManager.enableNetwork(netId, true);
wifiManager.reconnect();
int tryCount = 0;
while (!isConnectedToWifi()) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
tryCount++;
if (tryCount > 10) {
return false;
}
}
return true;
}
private class SendDataTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
try {
if (!isConnectedToWifi()) {
if (!connectToWifi()) {
return null;
}
}
Socket socket = new Socket(ipAddress, port);
PrintWriter out = new PrintWriter(socket.getOutputStream());
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out.write(params[0]);
out.flush();
String result = in.readLine();
out.close();
in.close();
socket.close();
return result;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {
if (result != null) {
Toast.makeText(MainActivity.this, '成功发送:' + result, Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, '发送失败', Toast.LENGTH_SHORT).show();
}
}
}
}
代码说明:
connectToWifi()方法用于连接 WiFi 热点。isConnectedToWifi()方法用于判断是否已连接到 WiFi 热点。SendDataTask是一个异步任务,用于在后台线程中发送数据并接收响应。- 在按钮点击事件中,先判断是否已连接到 WiFi 热点,如果未连接则尝试连接,然后执行
SendDataTask任务发送数据。 - 在异步任务的
doInBackground()方法中,先判断是否已连接到 WiFi 热点,如果未连接则返回null,否则建立 socket 连接并发送数据。发送完成后关闭连接,然后在onPostExecute()方法中根据响应结果显示 Toast 提示。
注意:
- 请将代码中的
WiFi热点名称、WiFi热点密码和WiFi热点IP地址替换为实际的热点信息。 - 确保手机已开启 WiFi 并处于可连接状态。
- 本代码示例仅供参考,实际使用中可能需要根据具体需求进行修改。
原文地址: https://www.cveoy.top/t/topic/nKUf 著作权归作者所有。请勿转载和采集!