Dart VM服务客户端

时间:2018-12-16 17:39:26

标签: java dart

我正在尝试使一个简单的TCP客户端可以运行 连接到Dart VM服务,发送请求并获得响应。

我尝试过使用connect()和不使用--observe的情况。

我的另一个问题是最好的Dart命令是什么 “启动” VM服务,以便其侦听请求? 如果需要,可以提供要使用的主机和端口。

--enable-vm-servicedart --pause_isolates_on_start bicycle.dart 之类的命令是给天文台的,我不需要。

我一直在用这个 但我不确定它默认使用的主机和端口。

Exception: java.net.ConnectException: Connection refused: connect

到目前为止,在我运行Dart命令并运行客户端之后, 我得到:

-1

或者它似乎发送了请求,但是它只返回了“ import java.net.Socket; import java.io.InputStream; import java.io.OutputStream; import java.net.SocketAddress; import java.net.InetAddress; import java.net.InetSocketAddress; public class DartTest { public static void main(String[] args) { Socket socket = null; InetAddress inetAddress = null; InetSocketAddress inetSocketAddress = null; OutputStream os = null; InputStream is = null; byte[] outBuf; byte[] inBuf; byte[] zeroDzeroAspaces = {(byte)0x0d, (byte)0x0a, (byte)0x20, (byte)0x20}; String sZeroDzeroAspaces = new String(zeroDzeroAspaces); byte[] zeroDzeroA = {(byte)0x0d, (byte)0x0a}; String sZeroDzeroA = new String(zeroDzeroA); int iAvail; int iByte; int iReadBytes; StringBuffer readSb = new StringBuffer(); String sHost = "127.0.0.1"; int iPort = 8181; try { //inetSocketAddress = new InetSocketAddress(sHost, iPort); socket = new Socket(sHost, iPort); //socket = new Socket(); //socket.connect((SocketAddress)inetSocketAddress); os = socket.getOutputStream(); is = socket.getInputStream(); StringBuffer outSb = new StringBuffer(); outSb.append("{"); outSb.append(sZeroDzeroAspaces); outSb.append((char)0x22); outSb.append("jsonrpc"); outSb.append((char)0x22); outSb.append(": "); outSb.append((char)0x22); outSb.append("2.0"); outSb.append((char)0x22); outSb.append(","); outSb.append(sZeroDzeroAspaces); outSb.append((char)0x22); outSb.append("method"); outSb.append((char)0x22); outSb.append(": "); outSb.append((char)0x22); outSb.append("getVersion"); outSb.append((char)0x22); outSb.append(","); outSb.append(sZeroDzeroAspaces); outSb.append((char)0x22); outSb.append("params"); outSb.append((char)0x22); outSb.append(": {},"); outSb.append(sZeroDzeroAspaces); outSb.append((char)0x22); outSb.append("id"); outSb.append((char)0x22); outSb.append(": "); outSb.append((char)0x22); outSb.append("1"); outSb.append((char)0x22); outSb.append(sZeroDzeroA); outSb.append("}"); //System.out.println("outSb: '"+outSb.toString()+"'"); outBuf = outSb.toString().getBytes(); os.write(outBuf); os.flush(); while ( true ) { iByte = is.read(); System.out.println("iByte: "+iByte); if ( iByte == -1 ) break; readSb.append((char)iByte); } System.out.println("readSb: '"+readSb.toString()+"'"); if ( socket != null ) socket.close(); } catch (Exception e) { System.out.println("Exception: "+e.toString()); } } } ”。

那么我应该使用什么Dart命令以及我需要做哪些更改 能够从VM服务获得响应?

我需要能够用Java而不是Dart来做客户端。

更新:

问题是Dart VM服务正在使用WebSockets并且 与Java Socket I / O不兼容?

看起来确实需要通过WebSocket连接,所以我 正在尝试将其构建并进行尝试。

谢谢!

   AlertDialog.Builder alert = new AlertDialog.Builder(EventDetails.this);
                                                alert.setMessage("Issue deleted!")
                                                        .setTitle(R.string.app_name)
                                                        .setIcon(R.drawable.logo)
                                                        .setPositiveButton("OK",
                                                                new DialogInterface.OnClickListener() {
                                                                    public void onClick(DialogInterface dialog, int which) {
                                                                        Intent intent = new Intent(EventDetails.this, MyIssues.class);
                                                                        startActivity(intent);
                                                                        finish();
                                                                    }
                                                                });

1 个答案:

答案 0 :(得分:0)

回答我自己的问题:

最主要的是使用WebSockets,尝试连接到 使用“常规”套接字TCP的VM服务/天文台 没用。

然后,当WebSocket服务器握手时,下一个障碍便出现了 在返回“ 200 OK”而不是“ 101”到“ Upgrade”时失败。

然后,我正在查看intelliJ插件代码,以了解它们如何连接,并且他们使用了“ ws:// localhost:8181 / ws”,因此我尝试使用 “ ws:// localhost:8181”,一旦我使用它,握手就完成了!!

工作正常时,我正在使用:

dart --enable-vm-service --pause_isolates_on_start bicycle.dart

我不确定我实际上与谁相连,天文台, 或VM服务,但至少我终于明白了这一点 在这里我可以尝试发送请求,并可能得到答复。