java - LocalSocket write and flush ends in broken pipe error -


i'm trying communicate chrome's developer tools using socket's protocol inside android. usb debugging option in chrome enabled, , if adb forward computer, able interact socket. need access programatically inside phone.

here's code:

package something;  import java.lang.stringbuilder; import java.io.ioexception; import java.io.inputstream; import java.io.outputstream;  import android.os.bundle; import android.os.handler; import android.util.log; import android.net.localserversocket; import android.net.localsocket; import android.net.localsocketaddress; import android.app.service; import android.content.intent; import android.os.ibinder; import android.util.log; import java.io.bufferedoutputstream; import java.io.bufferedinputstream;  public class someservice extends service {     private final string tag = someservice.class.tostring();     private int cnt = 0;     public static string socket_address = "chrome_devtools_remote";     private string message = "/json";      @override     public ibinder onbind(intent intent) {         return null;     }      @override     public int onstartcommand(intent intent, int flags, int startid) {         log.d(tag, "service started");         thread t = new thread(new runnable() {              public void run()              {                 try {                     localsocket receiver = new localsocket(localsocket.socket_stream);                     receiver.connect(new localsocketaddress(socket_address, localsocketaddress.namespace.abstract));                     stringbuilder request = new stringbuilder().append("get /json http/1.0\r\n");                     bufferedoutputstream outbuf = new bufferedoutputstream(receiver.getoutputstream());                     bufferedinputstream inbuf = new bufferedinputstream(receiver.getinputstream());                     byte[] buffer = request.tostring().getbytes("utf-8");                         log.d(tag, "outbuf size " + integer.tostring(receiver.getsendbuffersize()));                     while (true) {                         log.d(tag, "sending " + request.tostring());                         outbuf.write(buffer, 0, buffer.length);                         outbuf.flush();                         log.d(tag, "sent!");                         byte[] output = new byte[1000];                         int read = inbuf.read();                         int size = 0;                         int capacity = 0;                         byte[] bytes = new byte[capacity];                          // reading                         while (read != -1) {                             log.d(tag, "recieving");                             capacity = (capacity * 3)/2 + 1;                             byte[] copy = new byte[capacity];                             system.arraycopy(bytes, 0, copy, 0, bytes.length);                             bytes = copy;                             bytes[size++] = (byte)read;                              // read next byte                             read = inbuf.read();                         }                         log.d(tag, new string(bytes));                         try {                             thread.sleep(3000);                             } catch(exception e) {                          }                      }                                   } catch (ioexception e) {                     log.e(getclass().getname(), e.getmessage(),e);                 }             }         });         t.start();         return service.start_sticky;     } } 

this results in error:

starting service: intent { cmp=something/.myservice (has extras) } d/class something.myservice(18717): service started d/class something.myservice(18717): outbuf size 163840 d/class something.myservice(18717): sending /json http/1.0 e/something.myservice$1(18717): broken pipe e/something.myservice$1(18717): java.io.ioexception: broken pipe e/something.myservice$1(18717):  @ android.net.localsocketimpl.writeba_native(native method) e/something.myservice$1(18717):  @ android.net.localsocketimpl.access$600(localsocketimpl.java:33) e/something.myservice$1(18717):  @ android.net.localsocketimpl$socketoutputstream.write(localsocketimpl.java:134) e/something.myservice$1(18717):  @ java.io.bufferedoutputstream.flushinternal(bufferedoutputstream.java:185) e/something.myservice$1(18717):  @ java.io.bufferedoutputstream.flush(bufferedoutputstream.java:85) e/something.myservice$1(18717):  @ something.myservice$1.run(rtcservice.java:49) e/something.myservice$1(18717):  @ java.lang.thread.run(thread.java:841) 

the socket open, checking using isconnected() method of socket object. ideas doing wrong?

i having similar issue, seems you're not calling setsendbuffersize/setreceivebuffersize on receiver object, after doing got further problem, though not yet entire solution me.

i trying send own native abstract socket , far seems write being done 1 byte @ time, , since calling recv once on "server" side, pipe broken after 1st byte.

in other words, expecting send("hello"), java stream implementation seems doing send("h"),send("e"),send("l"),send("l"),send("o").


Comments