Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Telnet套接字网关到Coldfusion事件网关以连接到星号AMI_Linux_Sockets_Coldfusion_Asterisk_Gateway - Fatal编程技术网

Linux Telnet套接字网关到Coldfusion事件网关以连接到星号AMI

Linux Telnet套接字网关到Coldfusion事件网关以连接到星号AMI,linux,sockets,coldfusion,asterisk,gateway,Linux,Sockets,Coldfusion,Asterisk,Gateway,我希望我的ColdFusion应用程序能够记录通过telnet从星号主机通过网络传输的事件。ColdFusion事件网关可以侦听特定端口,但无法启动连接本身,因此我需要一个网关,它可以启动到Asterisk主机(在指定端口上)的telnet连接,并将流式事件推送到ColdFusion服务器(在指定端口上)。我真的不想重新发明轮子,那么有什么实用程序可以做到这一点吗 我的术语可能不正确,因为我没有那么专业,但我希望我已经解释了足够的要求!“实用程序”可以驻留在Linux或windows平台上 编辑

我希望我的ColdFusion应用程序能够记录通过telnet从星号主机通过网络传输的事件。ColdFusion事件网关可以侦听特定端口,但无法启动连接本身,因此我需要一个网关,它可以启动到Asterisk主机(在指定端口上)的telnet连接,并将流式事件推送到ColdFusion服务器(在指定端口上)。我真的不想重新发明轮子,那么有什么实用程序可以做到这一点吗

我的术语可能不正确,因为我没有那么专业,但我希望我已经解释了足够的要求!“实用程序”可以驻留在Linux或windows平台上

编辑: 要连接到星号主机telnet流并由其进行身份验证,必须发送以下内容:

Action: login<CRLF>
Username: usr<CRLF>
Secret: abc123<CRLF>
<CRLF>
操作:登录
用户名:usr
秘密:abc123
我知道之前的一个问题与此类似(但没有回答),但我很高兴在ColdFusion之外有一个解决方案


感谢使用Coldfusion的套接字网关。它是内置的,是Coldfusion中使用基于TCP/IP的协议(如Telnet)发送和响应消息的实际功能。我开始怀疑我是否理解您的要求。您希望应用程序“启动要侦听的连接”。CF套接字网关可能不会“启动”连接,但它确实“有一个要侦听的连接”。为什么要开始你已经拥有的东西?为什么“启动”这个词如此重要

在任何情况下,我将您的需求“使用特定端口启动到主机的telnet连接”理解为“连接到另一台服务器上的套接字”。您不需要整个网关/重定向器机制。您可以在Coldfusion Socket Gateway的CFC中执行此操作。它只需要2到3行代码(在web上搜索“读取和写入套接字”)


因此,在最终设计中,您将在两个插座之间建立连接。一个在Coldfusion服务器上,另一个在主机服务器上。连接中的通信是双向的。任何数量的客户端(比如10000个)都可以在CF套接字上侦听来自主机服务器的所有消息。

如果您只需要从Asterisk服务器捕获事件,我建议使用不同的方法

由于您似乎正在使用星号AMI,请看一看。据我所知,它是一个java库,为您处理低级套接字通信和解析,并提供与Asterisk服务器交互的高级接口。因此,它能够启动连接、捕获事件等

理论上,当应用程序启动时,您可以打开连接并注册以接收事件。只要连接保持打开状态,应用程序就会收到来自Asterisk的事件。当应用程序结束时,只需关闭连接即可停止事件

初始化连接

要简单地捕获事件,首先创建到Asterisk服务器的连接。只需提供适当的主机和凭据:

managerFactory = createObject("java", "org.asteriskjava.manager.ManagerConnectionFactory");
connection = managerFactory.init( hostNameOrIP
                                 , portNum
                                 , userName
                                 , theSecret ).createManagerConnection();
注册活动

要接收事件,必须首先向连接注册。通常,这需要编写一个自定义java类来实现适当的。然而,有了一点,你可以用一个标准的氟氯化碳代替。来自星号的任何事件将直接发送到CFC,并可使用CF代码进行处理

要添加侦听器,请使用名为的单个函数创建一个CFC。每当Asterisk服务器上发生注册事件时,将调用此函数

// 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”

连接打开后,您将看到写入演示日志文件的事件(假设存在服务器活动)。对于一次性测试,让页面
sleep()
保持几秒钟,以允许一些事件流动。然后关闭连接并停止事件:

sleep(4000);
connection.logoff()
在实际应用程序中,您可能会打开连接一次,并将其存储在持久作用域中,如应用程序。然后仅在应用程序关闭时关闭它


看看API,您可以用它做更多的事情。但是,上面应该提供一个基本的POC示例,让您开始捕获事件。

我以通常的方式创建了一个Coldfusion套接字网关实例。例如,请参见

我得到了以下工作设置:

1) 侦听器CFC的内容(SocketGatewayListener.CFC):

3) 我的系统: Coldfusion 2016 Windows7终极版

网络猫: 您可以使用可执行文件nc.exe来侦听或向套接字网关发送消息。网关运行后,使用DOS命令进行监听,如

nc 127.0.0.1 9093
echo 'my test message' | nc 127.0.0.1 9093
使用如下命令发送消息

nc 127.0.0.1 9093
echo 'my test message' | nc 127.0.0.1 9093
赫拉克勒斯(): 您可以使用Hercules GUI实用程序进行测试。使用其“TCP客户端”向您的套接字网关发送消息,并使用其“TCP服务器”模拟从不同主机侦听网关的套接字(代码中的IP和端口:xxx.xxx.xxx,1226)

不幸的是,AdobeColdFusion的套接字网关未能像您所期望的那样向所有正在侦听的套接字广播。您只能让它回复邮件的发件人。显然,这是有意的。这是令人惊讶的。默认情况下,您希望所有侦听套接字都接收消息。我将向Coldfusion团队提出功能请求

我在web上发现了这两种解决方案,它们似乎提供了广播的所有功能以及更多功能:

然而,当我在Coldfusion 2016上测试它们时,我遇到了很多错误。在
echo 'my test message' | nc 127.0.0.1 9093