Второе подключение к серверному сотлу отказалось в android

У меня есть программа для сокета-клиента / сервера для android, работающая через Direct WIFI-соединение. Она включает в себя несколько запросов и ответов между клиентским и серверным телефонами. Мой код работает отлично в первый раз, но во второй раз клиент получает сообщение «Соединение отказано» и сообщение об ошибке «сокет закрыт». В третий раз он работает снова и в четвертый раз поднимает эти ошибки и … Может ли кто-нибудь мне помочь? Эта проблема? Это код сервера:

new Thread(){ public void run(){ ServerSocket welcomeSocket = null; try { //Create a socket and listen to that try { if(welcomeSocket == null) welcomeSocket = new ServerSocket(COMMUNICATION_PORT); }catch(Exception qwe){ Log.d("Info", "qwe:" + qwe.getMessage()); } int i = 0; while (i == 0) { try { //Waiting for client connection socket = welcomeSocket.accept(); }catch(Exception qwe2){ Log.d("Info", "qwe2:" + qwe2.getMessage()); } //i++; new Thread(){ public void run(){ try { InputStream is; DataInputStream dIn; OutputStream os; DataOutputStream dOut; //socket.setSoTimeout(SOCKET_TIMEOUT); log("Connection accepted"); //Create an input stream for receiving data from server is = socket.getInputStream(); dIn = new DataInputStream(is); //Get an output stream for sending data to server phone os = socket.getOutputStream(); dOut = new DataOutputStream(os); boolean done = false; byte messageType; String message; int serverReplyType = 0; String serverReply = "NOP"; while (!done) { messageType = dIn.readByte(); message = dIn.readUTF(); Log.d("Info", "Received: " + messageType); Log.d("Info", "Received: " + message); switch (messageType) { //---------------------------------------- //Comparing Job ID and Location ID of client phone and server phone case JOB_ID_CHECK_REQ: String[] tokens = message.split("#"); serverReplyType = JOB_ID_CHECK_RESP; if (Integer.parseInt(tokens[0]) == currentJob.getJobId() && Integer.parseInt(tokens[1]) == currentJob.getJobLocationId()) { serverReply = "ACCEPTED"; log("Syncing data verified"); } else { serverReply = "ID MISMATCH"; done = true; log("It is not possible to sync none equal Jobs."); log("Please select same Job in both phone."); } break; //---------------------------------------- //Generating JSON string including Racks data case RACK_LIST_REQ: log("Sending Racks' data"); serverReplyType = RACK_LIST_RESP; serverReply = racks.size() > 0 ? (new Gson()).toJson(racks) : "NOP"; break; //---------------------------------------- //Inserting new Racks to local Db case NEW_RACK_FOR_INSERT: log("Receiving new Racks' data for insert"); if (!message.equals("NOP")) { List<Rack> diffRacks = new Gson().fromJson(message, new TypeToken<List<Rack>>() { }.getType()); rackDataSource rds = new rackDataSource(CrossPhoneSync.this); rds.open(); rds.crossPhoneSync_InsertDiff(diffRacks); rds.close(); } serverReplyType = DONE; serverReply = "NOP"; done = true; break; //---------------------------------------- case DONE: done = true; log("Done"); break; } Log.d("Info", "Send: " + serverReplyType); Log.d("Info", "Send: " + serverReply); dOut.writeByte(serverReplyType); dOut.writeUTF(serverReply); dOut.flush(); } log("Operation completed!"); } catch (Exception e) { log("Error: " + e.getMessage()); Log.d("Info", "ServerPhoneError:" + e.getMessage()); e.printStackTrace(); } finally { //Close stream and socket //closeSocket(true); Disconnect(null); } log("Done!"); } }.start(); } }catch(Exception qw){ Log.d("Info", "Eq1:" + qw.getMessage()); }finally { try { if (welcomeSocket != null) { welcomeSocket.close(); } }catch (Exception e) { Log.d("Info", "Close_ServerSocket@: " + e.getMessage()); } } } }.start(); 

И клиентский код:

 Socket socket2 = null; try { InputStream is; DataInputStream dIn; OutputStream os; DataOutputStream dOut; //Create a socket for connecting to server phone socket2 = new Socket(host, COMMUNICATION_PORT); //socket.setSoTimeout(SOCKET_TIMEOUT); //Get an output stream for sending data to server phone os = socket2.getOutputStream(); dOut = new DataOutputStream(os); //Create an input stream for receiving data from server is = socket2.getInputStream(); dIn = new DataInputStream(is); //Send first message log("Sending verification data..."); int clientMessageType = JOB_ID_CHECK_REQ; String clientMessageToSend = currentJob.getJobId() + "#" + currentJob.getJobLocationId(); dOut.writeByte(clientMessageType); dOut.writeUTF(clientMessageToSend); dOut.flush(); byte messageType; String message; boolean done = false; while(!done) { messageType = dIn.readByte(); message = dIn.readUTF(); Log.d("Info", "" + messageType); Log.d("Info", message); switch(messageType) { //---------------------------------------- //Sending current Job ID and Location ID to server phone for equality checking case JOB_ID_CHECK_RESP: if(message.equals("ACCEPTED")){ log("Data verified"); clientMessageType = RACK_LIST_REQ; clientMessageToSend = "NOP"; log("Requesting for other phone's Racks data"); }else{ done = true; log("It is not possible to sync none equal Jobs."); log("Please select same Job in both phone."); } break; //---------------------------------------- //Comparing... case RACK_LIST_RESP: log("Comparing Racks' data of two phones"); List<Rack> serverPhoneRacks; if(!message.equals("NOP")) serverPhoneRacks = new Gson().fromJson(message, new TypeToken<List<Rack>>() { }.getType()); else serverPhoneRacks = new ArrayList<>(); rackDataSource rds = new rackDataSource(CrossPhoneSync.this); rds.open(); List<Rack> diffRacks = rds.crossPhoneSync_Compare(racks,serverPhoneRacks); rds.close(); clientMessageType = NEW_RACK_FOR_INSERT; clientMessageToSend = diffRacks == null ? "NOP" : (new Gson()).toJson(diffRacks); log("Sending new Racks' data for inserting on the other phone"); break; //---------------------------------------- case DONE: done = true; log("Done!"); break; } if(!done) { dOut.writeByte(clientMessageType); dOut.writeUTF(clientMessageToSend); dOut.flush(); } } log("Operation completed!"); }catch (Exception e) { log("Error:" + e.getMessage()); e.printStackTrace(); Log.d("Info", " ClientPhoneError:" + e.getMessage()); }finally { //Close stream and socket //closeSocket(false); try { if (socket2 != null) { //socket.shutdownInput(); //socket.shutdownOutput(); socket2.close(); } }catch (Exception e) { Log.d("Info", "Close_Socket_Error5: " + e.getMessage()); } } log("Finished!"); 

Intereting Posts
Как разобраться с dumpsys SurfaceFlinger Необычное исключение: нельзя использовать String для Boolean при использовании getBoolean Ориентировочная точка установки Android для анимации масштаба Выполнение не выполнено для задачи ': app: shrinkReleaseMultiDexComponents' Как использовать два разных размера шрифта для текста кнопки в Android? Когда андроид сначала выполняет макет? Android: IllegalStateException («Вы не можете установить Dialog OnCancelListener или OnDismissListener») Гарантированы ли Roboto и Roboto Bold на 4.0+? Как заставить значение метаданных ввести строку? Использовать аннотации Android в пользовательском диалоговом классе Не удалось создать com.google.android.youtube.player.YouTubePlayerView GoogleApiClient: не запускается onConnected или onConnectionFailed Как отменить уведомление о неожиданном / принудительном завершении приложения Indic-text-renderer с использованием harfbuzz и freetype Android: навигационный ящик SubMenu: как собирать навигационные элементы