java - 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());
}
}
}
解决方案
回答我自己的问题:
使用 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 服务,但至少我终于到了可以尝试发送请求并可能得到回复的地步。
推荐阅读
- node.js - 安装 zsh 和 yvm 后终端完全崩溃并卡住(无法输入,Ctrl C 不起作用)
- javascript - 如何独立于特定的相机轴移动相机?
- java - 如何在不创建新对象的情况下测试私有成员对象
- vue.js - 如何在 Vue.js 中动态延迟加载 SCSS 文件?
- amazon-ses - Nodemailer SES TRANSPORT 错误:“UnexpectedParameter:在参数中找到意外的键 'Destination'”
- vue.js - Vue.js 在构建生产时配置根目录
- jasper-reports - Jasper Report Chart 操作 labelExpression
- javascript - 使用百分比进行 css 转换以动画 dom 转换的替代方法
- python - 如何正确比较ctime?
- c++ - UART流打包;流还是向量?