В моем приложении я использую подключение сокета TCP для подключения устройства Android к серверу. Socket работает нормально на каждом устройстве, кроме устройств с Android 7+, где я получаю сообщение «Socket is closed». Проблемы с розеткой происходят на Nexus 6P и Samsung s7!TCP-сокет, не работающий на устройствах с Android 7+
Я использую сокет Runnable в службе, инициализирует сокет с:
public class ClientThread implements Runnable {
public void run() {
while (true) {
try {
DataHandler.indicator.set(false);
mRun = true;
if (DataHandler.DOMAIN_IP.contains(":")) {
serverAddr = Inet4Address.getByName(DataHandler.DOMAIN_IP.split(":")[0]);
} else
serverAddr = Inet4Address.getByName(DataHandler.DOMAIN_IP.replace(":3030", ""));
Log.i("Socket", "Connecting");
socket = new Socket(serverAddr, SERVERPORT);
socket.setKeepAlive(true);
socket.setSoLinger(true, 1);
socket.setSoTimeout(30000);
DataHandler.IP_ADDRESS = socket.getLocalAddress().toString().split("/")[1];
DataInputStream dis = new DataInputStream(socket.getInputStream());
connectionDelay = MIN_WAIT;
Log.i("Socket", "Connected");
String serverMessage = "";
byte[] array = new byte[1024];
while (mRun) {
int firstbye = dis.read();
int arraylength = dis.available();
array = new byte[arraylength];
dis.read(array, 0, array.length);
String str = new String(new byte[]{(byte) firstbye});
serverMessage += str + EncodingUtils.getString(array, "UTF-8");
DataHandler.indicator.set(true);
if (firstbye != -1) {
String mstString = new String(serverMessage);
serverMessage = "";
onReceive(NotificationService.this, mstString);
} else { // if (serverMessage.equalsIgnoreCase("")) {
try {
socket.close();
Log.e("Socket", "Disconnect");
socket = null;
stopClient();
} catch (Exception e) {
e.getMessage();
}
serverMessage = null;
DataHandler.indicator.set(false);
continue;
}
}
} catch (UnknownHostException e) {
isNeedtoWrite = true;
} catch (IOException e1) {
isNeedtoWrite = true;
DataHandler.indicator.set(false);
} finally {
try {
socket.close();
DataHandler.indicator.set(false);
Log.e("Socket", "Disconnect");
socket = null;
stopClient();
} catch (Exception e) {
e.getMessage();
}
}
try {
connectionDelay = Math.min(MAX_WAIT, RandomUtils.nextInt(MIN_WAIT, (int) (connectionDelay * BACKOFF_RATE)));
Log.i("SocketSleep", String.valueOf(connectionDelay));
Thread.sleep(connectionDelay);
DataHandler.indicator.set(false);
} catch (InterruptedException e) {
e.getMessage();
}
}
}
}
Перед кодом достигает setSoTimeout он получает исключение.
Я пробовал другое приложение, которое использует ту же логику Socket, и при запуске он работал нормально, а затем он просто неожиданно упал, и он больше не работает. Я проверил на Wireshark, и это происходит:
Кто-нибудь есть какие-либо понятия, что может быть проблема?
Какое исключение вы получаете, может быть networkOnMainThread? –
Я получаю «java.net.SocketException: Socket is closed» на catch (IOException e1) { – Tomek
В android api 24+ они исправили ошибку, которая позволяет использовать OutputStreamWriter в основном потоке, который является сетевой операцией, и его нужно запустить в отдельном потоке, если вы можете сделать что-то подобное. –