我正在尝试使一个简单的TCP客户端可以运行 连接到Dart VM服务,发送请求并获得响应。
我尝试过使用connect()
和不使用--observe
的情况。
我的另一个问题是最好的Dart命令是什么 “启动” VM服务,以便其侦听请求? 如果需要,可以提供要使用的主机和端口。
--enable-vm-service
或dart --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();
}
});
答案 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服务,但至少我终于明白了这一点 在这里我可以尝试发送请求,并可能得到答复。