我希望我的ColdFusion应用程序能够通过管理API记录通过telnet通过星号主机传输的事件。ColdFusion事件网关可以侦听特定端口,但不能启动连接本身,因此我需要一个网关,它可以启动到星号主机(在指定端口上)的telnet连接,并将流事件推送到ColdFusion服务器(在指定端口上)。我真的不想重新发明轮子,所以有什么实用工具可以做到这一点吗?
我的术语可能是不正确的,因为我不是那么技术性,但我希望我已经解释了足够的要求!“实用程序”可以驻留在Linux或windows平台上。
编辑:要连接到星号主机telnet流并进行身份验证,必须发送以下内容:
Action: login<CRLF>
Username: usr<CRLF>
Secret: abc123<CRLF>
<CRLF>
我知道之前发布的一个类似于此的问题(但没有回答),但我很高兴在ColdFusion之外找到一个解决方案
谢谢
发布于 2016-10-14 16:18:33
如果您只需要从星号服务器捕获事件,我建议采用不同的方法。
由于您使用的是星号AMI,请查看星号-Java。据我所读,它是一个java库,它为您处理低级套接字通信和解析,并提供用于与星号服务器交互的更高级别的接口。因此,它能够启动一个连接,捕获事件和更多。
理论上,您可以在应用程序启动时打开连接并注册以接收事件。只要连接保持打开,应用程序就会收到来自星号的事件。当应用程序结束时,只需关闭连接以停止事件。
初始化连接
要简单地捕获事件,首先创建到星号服务器的连接。只需提供适当的主机和凭据:
managerFactory = createObject("java", "org.asteriskjava.manager.ManagerConnectionFactory");
connection = managerFactory.init( hostNameOrIP
, portNum
, userName
, theSecret ).createManagerConnection();
注册事件
要接收事件,必须首先向连接注册一个ManagerEventListener。通常,这需要编写实现正确接口的自定义java类。但是,只要使用一点动态代理魔术,就可以使用标准的CFC。星号中的任何事件都将直接路由到CFC,并可以使用CF代码进行处理。
若要添加侦听器,请使用一个名为onManagerEvent的函数创建CFC。每当星号服务器上发生注册事件时,将调用此函数。
// YourCFCListener.cfc
component {
public void function onManagerEvent(any managerEvent)
{
// For demo purposes, just output a summary of the event to a log file
WriteLog( text=arguments.managerEvent.toString(), file="AsteriskListenerLog" );
}
}
接下来,创建一个代理并将其注册到连接中。
proxyListener = createDynamicProxy("path.YourCFCListener"
, [ "org.asteriskjava.manager.ManagerEventListener"] );
connection.addEventListener( proxyListener );
接收事件:
若要开始接收事件,请登录并连接到服务器。使用掩码指定要接收的事件:"off"
、"on"
或以逗号分隔的特定事件列表(即"system,call,log"
)。
// receive ALL events
connection.login("on");
一旦连接打开,您将看到写入演示日志文件的事件(假设存在服务器活动)。在一次测试中,让页面sleep()
进行几秒钟,以允许某些事件流。然后关闭连接并停止事件:
sleep(4000);
connection.logoff()
在实际应用程序中,您可能会打开连接一次,并将其存储在持久作用域中,就像应用程序一样。然后,只有在应用程序关闭时才关闭它。
从API来看,您可以使用它做更多的事情。但是,上面应该提供一个基本的POC示例,让您开始捕获事件。
发布于 2016-10-09 05:08:26
我开始怀疑我是否理解你的要求。您希望您的应用程序“启动一个监听连接”。CF套接字网关可能不会“启动”一个连接,但它确实“有一个连接可听”。为什么要启动你已经拥有的东西?为什么“启动”这个词这么重要?
无论如何,我将您的要求解释为“使用特定端口启动到主机的telnet连接”,其实质意思是“连接到另一台服务器上的套接字”。你不需要一个完整的网关/重定向机器。您可以在的CFC中这样做。它只需2到3行代码(搜索web中的“读取和写入套接字”)。
因此,在您的最终设计中,您将在两个套接字之间建立连接。一个在你的冷融合服务器上,另一个在主机服务器上。连接中的通信是双向的.然后,任意数量的客户机(例如10000)都可以在CF套接字上侦听来自主机服务器的所有消息。
发布于 2016-10-16 14:56:07
我以通常的方式创建了Cold聚变套接字网关的实例。参见,例如,https://www.bennadel.com/blog/2173-using-socket-gateways-to-communicate-between-coldfusion-and-node-js.htm。
我有以下准备工作:
1)听众CFC (SocketGatewayListener.cfc)的内容:
<cfcomponent>
<cffunction name="onIncomingMessage" returntype="struct" output="false">
<cfargument name="cfevent" >
<cfset var msg = {} >
<cfscript>
/* The code within this cfscript represents the proof of concept. 'xxx.xxx.xxx.xxx' is an IP, 1226 an arbitrary port, so the next line connects to an external socket. Make sure it is listening. */
var socket = createobject("java","java.net.Socket").init('xxx.xxx.xxx.xxx',1226);
var out = createobject("java","java.io.PrintWriter").init(socket.getOutputStream(), true);
var bufferedWriter = createobject("java","java.io.BufferedWriter").init(out);
/*Send data to external socket */
bufferedWriter.write("Authentication data at #now()#");
bufferedWriter.flush();
</cfscript>
<cfset msg["message"] = cfevent.data.message>
<cfreturn msg>
</cffunction>
</cfcomponent>
2)配置文件(socketGateway.cfg)的内容:
# The port the socket server listens on.
port=9093
3)我的系统: Coldfusion 2016 Windows 7终极版
Netcat:您可以使用可执行的nc.exe侦听或向套接字网关发送消息。一旦网关运行,使用DOS命令侦听如下
nc 127.0.0.1 9093
用如下命令发送消息
echo 'my test message' | nc 127.0.0.1 9093
Hercules (en.html):您可以使用Hercules实用程序进行测试。使用它的'TCP客户端‘向您的套接字网关发送消息,并使用它的'TCP’模拟从另一个主机(代码中的IP和端口:xxx.xxx,1226)监听网关的套接字。
不幸的是,AdobeCold聚变的套接字网关无法像您所期望的那样向所有正在监听的套接字广播。您只能让它回复邮件的发件人。显然,这是故意的。这是令人惊讶的。默认情况下,您希望所有侦听套接字都接收消息。我将向冷却小组提出一个特写请求。
我在网络上发现了这两种解决方案,它们似乎提供了广播到所有功能,以及更多的功能:
https://github.com/nmische/cf-websocket-gateway/tree/java-websocket
https://github.com/softwarezman/cf-socketiogateway
然而,当我在2016年寒冷天气中测试它们时,我遇到了很多错误。在接下来的几天里,我将向Cold聚变附带的SocketGateway Java代码添加广播到所有功能。
https://stackoverflow.com/questions/39930914
复制相似问题