【问题标题】:Using Winsock "send" function in Java (or similar)在 Java(或类似)中使用 Winsock“发送”功能
【发布时间】:2011-03-31 04:40:15
【问题描述】:

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

我有一个 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 ... 好像它没有从相机中获取任何类型的输入流。我知道我可以继续使用它,但我们不胜感激任何外部建议。

【问题讨论】:

  • 请发布您的java代码进行分析。
  • 1.从字符串文字中删除 \\ 。 2. 直接写new Socket("192.168.81.58", PORT),不用自己构造IP地址。 3. 不要使用 ObjectOutputStream。

标签: java sockets winsock send


【解决方案1】:

一般来说,应该很简单:

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

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

[编辑:将\x0d替换为\r]

【讨论】:

  • 嗯,给我 C++ 相机代码的人还没有文档,所以这肯定会阻碍任何进展。基本上,当以 C++ 代码发送命令时,相机会亮起并返回 ACK。在这里,它似乎正在发送,但什么也没发生。
【解决方案2】:

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

"#TRGON\x0d"

我需要使用

"#TRGON\r"

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

【讨论】:

    【解决方案3】:

    看起来你的 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();
    

    这是我想的最原始的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-24
      • 1970-01-01
      • 1970-01-01
      • 2017-08-10
      • 2010-11-06
      • 1970-01-01
      • 2010-09-14
      相关资源
      最近更新 更多