2

我觉得我的问题有点奇怪,但是这里......

我有一个 C++ 程序(来自另一个组织),它与使用套接字通过以太网连接到硬件的相机进行交互。从表面上看,向套接字发送消息的初始函数是这样的:

char* cmd = "#TRGON\x0d";
m_pClient->Socket_Write( (BYTE*)cmd, strlen( cmd ));

在查看了代码之后,我发现了实际发送数据的最低级别的函数:

// Try to send what's in the buffer
int nFlags = 0;
int nSent = ::send( m_hSocket, (char*)m_pSendBuffer, m_nSendBufLen, nFlags );
...checking for errors, etc.

现在,我正在处理的程序需要向相机发送类似的命令,但它是用 Java 编写的。我整天都在玩 Java 套接字,除了连接到适当的地址(用于触发 LED 灯亮的命令)之外,无法让相机做很多事情。

我在网上环顾四周,发现这个“发送”命令来自 C++ 程序封装的 Winsock 库。在 Java 中有没有类似的方法可以做到这一点?还是我只是没有在 Java 中使用正确的 DataOutputStreams、套接字等组合?我是否缺少一些“进口winsock”(谷歌搜索似乎说没有这样的事情)?

非常感谢您的帮助。

编辑:

我真的不知道是否有任何代码会有所帮助!在这一点上,我只是在做一些基本的事情:连接并尝试写入它。我似乎尝试了每一种组合、转换等。这只是一些测试代码(显然不健壮或不合适,如 catch 块):

InetAddress addr = null;
Socket sock = null;
ObjectInputStream in = null;
ObjectOutputStream out = null;

String msg = "#TRGON\\x0d";

try {
    addr = InetAddress.getByAddress(new byte[] { (byte) 192, (byte) 168,
        (byte) 81, (byte) 58 });

    sock = new Socket(addr, PORT);

    out = new ObjectOutputStream(sock.getOutputStream());

    out.writeBytes(msg);

    in = new ObjectInputStream(sock.getInputStream());

} catch (IOException e) {
    e.printStackTrace();
}

它挂在那里的最后一行, in = new ... 好像它没有从相机中获取任何类型的输入流。我知道我可以继续玩它,但任何外部建议都值得赞赏。

4

3 回答 3

3

一般来说,它应该很简单:

Socket s = new Socket("hostname", port);
OutputStream os = s.getOutputStream();
os.write("#TRGON\r".getBytes());
os.flush();

那么你的问题到底是什么?当然,如果连接看起来是基于字符的,则不应使用 aDataOutputStream而是向其写入简单的 ASCII 字符串。

[编辑:替换\x0d\r]

于 2010-08-17T20:06:27.043 回答
2

看起来你 C++ 接受纯字节。所以你应该对 Java 做同样的事情:

InetAddress addr = InetAddress.getByName("192.168.81.58");
Socket s = new Socket(addr, PORT);
OutputStream out = s.getOutputStream();
out.write("#TRGON\\x0d".getBytes());
s.close();

这是我想的最原始的。

于 2010-08-17T20:08:19.297 回答
1

原来发送的命令字符串需要不同的格式。代替

"#TRGON\x0d"

我需要使用

"#TRGON\r"

不需要十六进制说明符。感谢您的回复!

于 2010-08-18T18:50:02.563 回答