Android:Socket-java.net.SocketException:sendto失败:eppe(管道破裂)
我正在尝试使用套接字与服务器建立连接。连接管断裂,如下所示Android:Socket-java.net.SocketException:sendto失败:eppe(管道破裂),java,android,sockets,socketexception,Java,Android,Sockets,Socketexception,我正在尝试使用套接字与服务器建立连接。连接管断裂,如下所示 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:4
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.writebData;正在引发异常
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();
}
}
注意:如果我关闭插座连接,立即工作正常。但是我想让连接保持活动状态,我手动关闭套接字连接。单击停止按钮后,我将关闭连接
我搜索了网络,但没有找到解决方法。当您向其写入内容时,对等方关闭了连接。这通常意味着你发送了一些它不理解的东西。它可能是HTTP服务器吗?或者其他一些您在客户端代码中没有实现的协议?我的两分钱:我们在EPIPE中遇到了相同的问题,通过Fiddler或Charls、WireShark或其他代理调试器/侦听器等查看,我们注意到根本没有发出任何请求
原因是我们使用错误的值添加了内容长度标题 我在三星TabletGT-P5113安卓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是本机调用
也许再试一次是解决问题的好办法 我也是如此,愚蠢的原因是设备上的互联网无法正常工作
检查您的internet连接,这可能是原因。这是否在主UI线程上?否。。它不在主UI线程上,但我可以做些什么来纠正它?这是这里的一个重要问题。@SreekanthKarumanaghat在对等方关闭连接后不向其写入数据!表示您的应用程序协议错误。要么是对等方在不应该关闭的时候关闭了,要么是你在不应该的时候发送了。通过说对等方关闭了连接。。。你是说服务器关闭了连接…?@Eido95不,我没有。我说的是真的。我是说同龄人。一旦建立了TCP连接,继续考虑服务器和客户端是毫无意义的。他们都是同龄人。如果这一端是客户机,那么谈论服务器,或者如果这一端是服务器,那么谈论客户机,答案的大小只会增加三倍。这一点都不重要。重要的是关闭的是同行,而不是本地端。您可能根本不应该添加它。可能是图书馆帮你做的。HttpURLConnection当然可以。我与编写它的开发人员进行了验证,他说如果他没记错的话,问题是在使用setChunkedStreamingModex时没有添加头,因为它是被禁止的,请参阅,但是所使用的服务器的MS-WCF绑定需要它,即使在分块流媒体开启的情况下,这也是MS-WCF中的一个缺陷。事实并非如此。这是一个应用程序协议错误。应用程序代码在两次重试之间不会改变。但从技术上讲,他是对的。不管是谁否决了这一点,总有一天会犯这样愚蠢的错误。