首页 > 解决方案 > Dart VM 服务客户端

问题描述

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

我已经尝试过使用和不使用connect().

我的另一个问题是“启动”VM 服务以便它监听请求的最佳 Dart 命令是什么?如果需要,可能会给出要使用的主机和端口。

类似--observe--enable-vm-service用于天文台的命令,我不需要。

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

dart --pause_isolates_on_start bicycle.dart

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

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

或者它似乎发送了请求,但它只是返回“ -1”。

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

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

更新:

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

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

谢谢!!

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());
}
}
}

标签: javadart

解决方案


回答我自己的问题:

使用 WebSockets 是主要的,尝试使用“常规”Socket TCP 连接到 VM 服务/天文台是行不通的。

然后下一个障碍来了,当​​ WebSocket 服务器握手失败时,它将返回“200 OK”而不是“101”到“升级”。

然后我查看了 intelliJ 插件代码,看看它们是如何连接的,他们使用了“ws://localhost:8181/ws”,我试图使用“ws://localhost:8181”,一旦我使用那个,握手通过了!!

当它起作用时,我正在使用:

飞镖 --enable-vm-service --pause_isolates_on_start 自行车.dart

我不确定我实际连接到谁,天文台或 VM 服务,但至少我终于到了可以尝试发送请求并可能得到回复的地步。


推荐阅读