Приложение вылетает при отправке данных через сокет с использованием Wi-Fi p2p-соединения
Я тестирую простое приложение для чата между HTC_Desire_10 pro (под управлением Android 6.0) и OPPO A83 (под управлением Android 7.1.1).У меня на обоих устройствах работает одно и то же приложение.Приложение сначала включает Wi-Fi, а затем начинает обнаруживать одноранговые узлы по событию клика пользователя.Пользователь может выбрать устройство, к которому он хочет подключиться, из динамически генерируемого списка пиров.Два устройства могут успешно подключиться.Я могу отправить текстовое сообщение с HTC на телефон OPPO, но при попытке отправить сообщение с телефона OPPO происходит сбой приложения.
Этот код определяет, какое устройство будет хостом илиclient
WifiP2pManager.ConnectionInfoListener connectionInfoListener = new WifiP2pManager.ConnectionInfoListener() {
@Override
public void onConnectionInfoAvailable(WifiP2pInfo wifiP2pInfo) {
final InetAddress groupOwnerAddress = wifiP2pInfo.groupOwnerAddress;
if(wifiP2pInfo.groupFormed&&wifiP2pInfo.isGroupOwner) {
ConnectionStatus.setText("Host");
serverClass = new ServerClass();
serverClass.start();
} else if(wifiP2pInfo.groupFormed) {
ConnectionStatus.setText("Client");
clientClass = new ClientClass(groupOwnerAddress);
clientClass.start();
}
}
};
А это код для ServerThread, ClientThread и SendRecieveThread
public class ServerClass extends Thread{
Socket socket;
ServerSocket serverSocket;
@Override
public void run() {
try {
serverSocket = new ServerSocket(8888);
socket = serverSocket.accept();
sendReceive = new SendReceive(socket);
sendReceive.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private class SendReceive extends Thread {
private Socket socket;
private InputStream inputStream;
private OutputStream outputStream;
public SendReceive(Socket skt) {
socket = skt;
try {
inputStream = socket.getInputStream();
outputStream = socket.getOutputStream();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
byte[] buffer = new byte[1024];
int bytes;
while (socket!=null) {
try {
bytes = inputStream.read(buffer);
if(bytes>0) {
handler.obtainMessage(MESSAGE_READ,bytes,-1,buffer).sendToTarget();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void write(byte[] bytes) {
try {
outputStream.write(bytes);
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class ClientClass extends Thread {
Socket socket;
String hostAdd;
public ClientClass(InetAddress hostAddress) {
hostAdd = hostAddress.getHostAddress();
socket = new Socket();
}
@Override
public void run() {
try {
socket.connect(new InetSocketAddress(hostAdd, 8888),1000);
sendReceive = new SendReceive(socket);
sendReceive.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Функция SendRecieve вызывается, когда пользователь нажимает кнопку отправки сообщения.
btnSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String msg = writeMsg.getText().toString();
sendReceive.write(msg.getBytes());
}
});
Я запустил приложение в режиме USB-отладки с помощью android studio и получил отчет о сбое с помощью команды adb logcat:
--------- beginning of crash
03-27 22:16:54.115 6904 6904 E AndroidRuntime: FATAL EXCEPTION: main
03-27 22:16:54.115 6904 6904 E AndroidRuntime: Process: june.androidapps.clatt, PID: 6904
03-27 22:16:54.115 6904 6904 E AndroidRuntime: android.os.NetworkOnMainThreadException
03-27 22:16:54.115 6904 6904 E AndroidRuntime: at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1318)
03-27 22:16:54.115 6904 6904 E AndroidRuntime: at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:111)
03-27 22:16:54.115 6904 6904 E AndroidRuntime: at java.net.SocketOutputStream.write(SocketOutputStream.java:145)
03-27 22:16:54.115 6904 6904 E AndroidRuntime: at june.androidapps.clatt.MainActivity$SendReceive.write(MainActivity.java:264)
03-27 22:16:54.115 6904 6904 E AndroidRuntime: at june.androidapps.clatt.MainActivity$5.onClick(MainActivity.java:135)
03-27 22:16:54.115 6904 6904 E AndroidRuntime: at android.view.View.performClick(View.java:5773)
03-27 22:16:54.115 6904 6904 E AndroidRuntime: at android.view.View$PerformClick.run(View.java:23035)
03-27 22:16:54.115 6904 6904 E AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:836)
03-27 22:16:54.115 6904 6904 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:103)
03-27 22:16:54.115 6904 6904 E AndroidRuntime: at android.os.Looper.loop(Looper.java:232)
03-27 22:16:54.115 6904 6904 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:6802)
03-27 22:16:54.115 6904 6904 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
03-27 22:16:54.115 6904 6904 E AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1103)
03-27 22:16:54.115 6904 6904 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:964)
03-27 22:17:06.089 7393 7393 E AndroidRuntime: FATAL EXCEPTION: main
...
Полный журнал вы можете посмотреть здесь https://drive.google.com/file/d/1CfKU5x2dQgkGBKHTvMywaNfPtMdCNEXG/view
Может кто-нибудь объяснить, почему приложение ведет себя так?Я пролистал все журналы в течение часа и, похоже, не могу найти, что именно происходит в моем коде.Будем благодарны за любую помощь.
.