Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:Socket-java.net.SocketException:sendto失败:eppe(管道破裂)_Java_Android_Sockets_Socketexception - Fatal编程技术网

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中的一个缺陷。事实并非如此。这是一个应用程序协议错误。应用程序代码在两次重试之间不会改变。但从技术上讲,他是对的。不管是谁否决了这一点,总有一天会犯这样愚蠢的错误。