ソケットを使用してサーバーに接続しようとしています。以下の例外に示すように、接続パイプが壊れています。
_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);
例外をスローしています。
_ 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サーバーですか?または、クライアントコードに実装していない他のプロトコルですか?
私の2セント:同じ問題(BROKEN EPIPE)があり、Fiddler(または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()はネイティブコールです。
多分もう一度試すことは回避策の良い候補です。