我觉得我的问题有点奇怪,但这里有......
我有一个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 ......好像它没有从相机中拾取任何类型的输入流。我知道我可以继续玩它,但任何外界的建议都表示赞赏。
答案 0 :(得分:3)
一般来说,它应该像以下一样简单:
Socket s = new Socket("hostname", port);
OutputStream os = s.getOutputStream();
os.write("#TRGON\r".getBytes());
os.flush();
那么究竟是什么问题?当然,如果连接看起来基于字符,则不应使用DataOutputStream
,而应将简单的ASCII字符串写入其中。
[编辑:将\x0d
替换为\r
]
答案 1 :(得分: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();
我认为那是原始的。
答案 2 :(得分:1)
结果发送命令要发送的字符串需要不同的格式。而不是
"#TRGON\x0d"
我需要使用
"#TRGON\r"
不需要十六进制说明符。谢谢你的回复!