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
Post a Comment