繁体   English   中英

如何从Java EE应用程序提供套接字?

[英]How to serve a socket from a Java EE application?

我们希望在Java EE应用服务器(JBoss 4.2.3)中提供一些客户端请求。 我读到Java EE规范不允许从企业bean打开套接字 但该规范表明没有其他选择。

具体来说,企业bean不应该:

  • 监听,接受网络套接字上的连接或多播

所以问题是:我可以做什么来从应用服务器中提供一些基于二进制 tcp的协议(而不是http)?

这里有人建议实现资源适配器 这是你必须去的方式还是其他(更容易)的解决方案?

您是对的,因为您可以为Java EE中的每个事物声明事务,所以必须从您要连接的所有组件支持它们。 文件(如果有)应存储在数据库中。 一切都应该由容器控制,因为它是使用Java EE实现扩展应用程序的唯一方法。

一些选择:

你也不应该访问文件:(

这是在规范中,因为EJB必须是:

  • distributable(您事先不知道将部署EJB的服务器/实例)
  • 容器是能够管理“一切”所以你不能产生自己的线程

记住,没有什么会阻止你在你的应用程序中启动服务器套接字(最好的位置可能是在servlet中)但你应该注意当你的应用程序关闭时serversocket如何关闭...

现在我实现了一个解决方法:

alt text http://yuml.me/7f82bd5c

我使用一个独立的java应用程序,它接受来自客户端的tcp调用,并将它们作为JNDI调用转发给应用程序服务器。

根据我在Spring MVC中的需要,我使用了一些类似的解决方案。 可能这可以帮助这里的人。

在服务器启动时启动套接字端口。 我使用了@scheduler注释,你也可以使用基于监听器的解决方案。 您还可以实现ApplicationContextAware侦听器,并可以从中访问其他应用程序bean。

 @Scheduled(fixedDelay = 1000 * 60 * 60 * 24 * 365) public void startListenerPort() { ServerSocket socket = new ServerSocket(9999); // do some stuff here } 

只需确保您已在分配给套接字的端口(防火墙设置)上允许TCP流量。

通过这种方式,您可以在端口9999上拥有TCP流量,因为您的应用服务器将继续在不同的端口上正常运行。

虽然不是严格意义上的纯TCP连接,但您可以通过@ServerEndpoint注释来实现所需,从Java EE7规范创建WebSocket。

虽然这个DOES使用HTTP,但当你的@OnMessage方法和ByteBuffer (或byte[] )作为参数时,它的功能有点像二进制接口。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM