当前位置: 首页 > 面试题库 >

使用JNI / C ++代码中的Java套接字

班安平
2023-03-14
问题内容

我有一个Java应用程序,它创建一个套接字来与服务器进程进行通信,例如,新的java.net.Socket(String host,int
port)。该应用程序包括一堆旧的c
++代码,这些代码需要从该服务器中吸取大量数据并对其进行处理。当前,这是通过使本机代码创建自己的套接字并连接到服务器来实现的,例如:

sock = socket(AF_INET, SOCK_STREAM, 0);
struct hostent* hp = gethostbyname(host);
if (!hp)
{
  unsigned long addr = inet_addr(host);
  hp = gethostbyaddr((char *)&addr, sizeof(addr), AF_INET);
}

struct sockaddr_in name;
name.sin_family = AF_INET;
memcpy(&name.sin_addr, hp->h_addr, hp->h_length);
name.sin_port = htons(port);

connect(sock, (sockaddr*)&name, sizeof(name));

在具有多个NIC(例如,有线和wifi或vpn连接)的Windows vista /
7计算机上,这两个插槽可以以不同的本地地址结尾。Java代码似乎选择了“更好”的接口(有线Gb enet
=更高的MTU?),本机(天真?)代码获得了“默认”接口(粘贴在USB wifi设备中,它成为您的默认设置-讨厌) 。

这给我带来了一些问题,我认为细节不重要。两个问题:

  1. 对我来说,可以重用JNI代码中的java套接字(是否可以使用Sun JDK)。这样可以完全避免问题,但是到目前为止,我还没有看到任何与JNI /本地代码中的java.net.Socket交互的方法。

  2. 由于第一个问题的答案可能是“否”,因此java如何创建该套接字(选择接口)?欢迎使用代码段。我到处都是openjdk的东西,却没有找到我想要的东西。

谢谢克里斯


问题答案:

要回答您的第一个问题:如果可以在本机代码中重用Java的套接字,可以,但是我不建议这样做(您将自己绑定到特定实现/版本的内部);但是,如果您确实必须这样做:使用反射访问java.net.SocketImpl上的java.io.FileDescriptor,然后使用sun.misc。JavaIOFileDescriptorAccess的get方法获取本机套接字描述符。签出DualStackPlainSocketImpl.java)

回答您的第二个问题:在Windows上查找默认接口的Javahtml" target="_blank">算法是什么?在net_util_md.c中检出getDefaultIPv6Interface方法(不要让v6欺骗您-
我相信它也用于v4)。

我建议您从C(JNI)代码或Java代码(最好是从Java代码)打开并使用套接字,因为您会发现最好在管理套接字的代码中处理清理和错误处理。在Java中打开套接字并从C(JNI)传递字节缓冲区的想法是完全明智的,并且在合理的缓冲区大小和JNI代码中的正确释放方面,您不会发现堆有任何问题。

想想Java应用程序服务器可以毫不费力地处理大量数据。



 类似资料:
  • 问题内容: 虽然我可以使用Java代码的Eclipse JDT调试器和C代码的GDB调试应用程序,但我还是希望使用单个工具进行所有调试。我找到了几个在Eclipse中启用“混合模式”调试的项目,其中包括对Java和本机代码之间的单步执行的支持。 英特尔针对Java / JNI环境的集成调试器 Mariot Chauvin的“代码之夏”项目:支持JDT和CDT之间的无缝调试 不幸的是,其中一个声称是

  • 问题内容: 我有一个C程序,它使用JNI在Java存储中存储一些对象。(在有人问之前,这里需要使用Java存储,而我必须用C编写一个客户端,该客户端才能从该存储中添加和检索对象)。 我制作了程序,并尝试添加100000个大小为1KB的对象。但是在仅添加50000个对象之后,我得到了“内存不足”消息(请注意,每当我无法使用NewStringUTF和NewByteArray函数分配新的字符串或字节数组

  • 问题内容: 我需要使用套接字从C ++客户端到Java服务器接收包含浮点数的数组或类。但是InputStreamReader没正确。任何原因。任何更简单的建议将不胜感激。谢谢。 Java服务器代码 我将那些浮点数存储在名为“值”的类中。但是我得到的价值是垃圾。我在发送前检查C ++代码中的值,它们看起来不错。不知道哪里出了问题。请帮忙…!! 问题答案: 我建议你试试

  • 我正在制作一个库应用程序,该应用程序使用谷歌断路器检测android中的本机崩溃。每当我的主端发生本机崩溃时,断路器都会调用以下回调。从这个回调中,我需要使用JNI在java类中调用一个静态val方法。 这是我的java方法: 在Android5.0之前,这一功能一直运行良好。但在Lollipop中,我无法调用我的java方法,因为我无法在Logcat控制台上看到“内部句柄异常”日志。 以下是我在

  • 问题内容: 我最近一直在将SSL套接字用于消息传递系统。 我终于开始使用CA颁发的证书。我将其导入到密钥库中,设置了密钥库属性,并启动了客户端,但是当我尝试发送数据时,我一直收到握手异常。 我启用了调试模式,发现这是由于造成的。有什么想法吗? 如果有帮助,它还说它忽略了TLSV1和TLSV1.1中的大约10个密码套件。 我还安装了无限强度加密策略。 客户代码 服务器代码 编辑: 我刚刚添加了密码,

  • 我尝试用Java套接字API制作基本的Java聊天应用程序。但是当客户端终止时,它会引发以下异常, socketException:套接字关闭 我认为即使套接字已经关闭,BufferedReader流仍然尝试读取行消息。 但我不知道当客户端终止时,何时以及如何关闭BufferedReader流和套接字连接。 我完全被这部分卡住了。有什么想法吗?