Вызов close()
для DataOutputStream
закрывает связанный с ним OutputStream
, а закрытие сокета OutputStream
закрывает сокет.Это задокументированное поведение.
Но это должно быть в порядке, потому что ваш код получателя ожидает только одну строку в любом случае.Вы звоните dis.readUTF()
только один раз за TCP-соединение.
Если вы хотите отправить несколько строк в одном соединении, НЕ звоните dos.close()
на стороне отправителя (по крайней мере, до тех пор, пока не будут выполнены все строкии DO вызовет dis.readUTF()
в цикле на принимающей стороне, пока все строки не будут получены.
dos = new DataOutputStream(s.getOutputStream());
for(int i = 0; i < logList.length; ++i){
String backupPayload = invertLogStringToJson(logList[i]);
dos.writeUTF(backupPayload);
}
dos.flush();
dos.close();
@Override
public void run() {
try {
while (true) {
mySocket = ss.accept();
dis = new DataInputStream(mySocket.getInputStream());
try {
while (true) {
message = dis.readUTF();
handler.post(() -> {
bufferIntentSendCode.putExtra("data", message);
ctx.sendBroadcast(bufferIntentSendCode);
});
}
} catch (IOException e) {
}
dis.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
В качестве альтернативы, передайте длину списка перед отправкой фактических строк, изатем прочитайте длину, прежде чем читать строки:
dos = new DataOutputStream(s.getOutputStream());
// maybe other things first...
dos.writeInt(logList.length);
for(int i = 0; i < logList.length; ++i){
String backupPayload = invertLogStringToJson(logList[i]);
dos.writeUTF(backupPayload);
}
dos.flush();
// maybe other things next...
dos.close();
@Override
public void run() {
try {
while (true) {
mySocket = ss.accept();
dis = new DataInputStream(mySocket.getInputStream());
try {
// maybe other things first...
int length = dis.readInt();
for (int i = 0; i < length; ++i) {
message = dis.readUTF();
handler.post(() -> {
bufferIntentSendCode.putExtra("data", message);
ctx.sendBroadcast(bufferIntentSendCode);
});
}
// maybe other things next...
} catch (IOException e) {
}
dis.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}