Ответ 1
Друг закрыл соединение, пока вы писали ему. Это обычно означает, что вы отправили ему то, что он не понял. Возможно, это HTTP-сервер? Или какой-либо другой протокол, который вы не реализовали в своем клиентском коде?
Я пытаюсь установить соединение с сервером с помощью сокета. Соединительная труба сломана, как показано ниже.
01-31 14:47:16.536: W/System.err(27255): java.net.SocketException: sendto failed: EPIPE (Broken pipe)
01-31 14:47:16.550: W/System.err(27255): at libcore.io.IoBridge.maybeThrowAfterSendto(IoBridge.java:496)
01-31 14:47:16.550: W/System.err(27255): at libcore.io.IoBridge.sendto(IoBridge.java:465)
01-31 14:47:16.550: W/System.err(27255): at java.net.PlainSocketImpl.write(PlainSocketImpl.java:507)
01-31 14:47:16.550: W/System.err(27255): at java.net.PlainSocketImpl.access$100(PlainSocketImpl.java:46)
01-31 14:47:16.664: W/NetworkManagementSocketTagger(24437): setKernelCountSet(10021, 1) failed with errno -2
01-31 14:47:16.684: W/System.err(27255): at java.net.PlainSocketImpl$PlainSocketOutputStream.write(PlainSocketImpl.java:269)
01-31 14:47:16.693: W/System.err(27255): at java.io.DataOutputStream.write(DataOutputStream.java:98)
01-31 14:47:16.693: W/System.err(27255): at java.io.OutputStream.write(OutputStream.java:82)
01-31 14:47:16.693: W/System.err(27255): at com.x.x.y.sendRec(y.java:460)
01-31 14:47:16.693: W/System.err(27255): at com.x.x.y.access$0(y.java:384)
01-31 14:47:16.693: W/System.err(27255): at com.x.x.y$2.run(y.java:363)
01-31 14:47:16.693: W/System.err(27255): at java.lang.Thread.run(Thread.java:856)
01-31 14:47:16.693: W/System.err(27255): Caused by: libcore.io.ErrnoException: sendto failed: EPIPE (Broken pipe)
01-31 14:47:16.693: W/System.err(27255): at libcore.io.Posix.sendtoBytes(Native Method)
01-31 14:47:16.693: W/System.err(27255): at libcore.io.Posix.sendto(Posix.java:146)
01-31 14:47:16.693: W/System.err(27255): at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:177)
01-31 14:47:16.693: W/System.err(27255): at libcore.io.IoBridge.sendto(IoBridge.java:463)
вот код и в этой строке outStreamRec.write(bData);
throwing exception.
try {
port = 86;
byterecv = new byte[1040];
clientRec = new Socket();
clientRec.connect(new InetSocketAddress("192.168.1.36", port));
System.out.println("Just connected to " + clientRec.getRemoteSocketAddress());
} catch (IOException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
while (true) {
try {
System.out.println("Connecting to " + ServerUrl.url + " on port " + port);
OutputStream outToServerRec = clientRec.getOutputStream();
DataOutputStream outStreamRec = new DataOutputStream(outToServerRec);
outStreamRec.write(bData);
InputStream inFromServerPlay = clientRec.getInputStream();
DataInputStream inStreamPlay = new DataInputStream(inFromServerPlay);
while ((lstream = inStreamPlay.read(byterecv)) != -1) {
System.out.println("startrec bytearray -- " + byterecv.length);
bos1.write(byterecv, 0, lstream);
}
if (stopcall == true) {
clientRec.close();
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
Примечание. Если я закрываю соединение сокетов, то работает нормально. Но я хочу сохранить соединение живым, но я закрываю соединение сокета вручную. Onclick of stop button Я закрываю соединение.
Я сделал поиск Google, но не нашел способ исправить это. Любые предложения или идеи, как решить эту проблему?
Помощь будет оценена.
Друг закрыл соединение, пока вы писали ему. Это обычно означает, что вы отправили ему то, что он не понял. Возможно, это HTTP-сервер? Или какой-либо другой протокол, который вы не реализовали в своем клиентском коде?
Мои 2 цента, в любом случае это помогает любому: У нас была такая же проблема (BROKEN EPIPE), и, просматривая скрипач (или Charls, или WireShark, или другой прокси-отладчик/слушатель/и т.д.), Мы заметили, что никакой запрос не отправляется вообще.
Причина заключалась в том, что мы добавили заголовок Content-Length с неправильным значением.
НТН!
Я встретил эту проблему на устройстве Samsung Tablet (GT-P5113, Android 4.2.2), приложение хорошо работает на других устройствах (Nexus 4/5/7).
Код в Libcore/io/IoBridge.java выглядит так:
public static int sendto(FileDescriptor fd, byte[] bytes, int byteOffset, int byteCount, int flags, InetAddress inetAddress, int port) throws IOException {
boolean isDatagram = (inetAddress != null);
if (!isDatagram && byteCount <= 0) {
return 0;
}
int result;
try {
result = Libcore.os.sendto(fd, bytes, byteOffset, byteCount, flags, inetAddress, port);
} catch (ErrnoException errnoException) {
result = maybeThrowAfterSendto(isDatagram, errnoException);
}
return result;
}
в то время как Libcore.os.sendto() является родным.
Может быть, попробовать еще раз - хороший кандидат на обходной путь.
Случилось и со мной, и глупой причиной было то, что Интернет на устройстве не работал должным образом.
Проверьте подключение к Интернету, это может быть причиной.