在Java(或类似)中使用Winsock“send”函数

时间:2010-08-17 19:39:18

标签: java sockets winsock send

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

我有一个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 ......好像它没有从相机中拾取任何类型的输入流。我知道我可以继续玩它,但任何外界的建议都表示赞赏。

3 个答案:

答案 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"

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