使用 ColdFusion 进行简单的 TCP/IP 套接字通信

2023-12-23

我做了一些搜索,似乎没有太多成功的方法可以通过 Coldfusion 成功建立 tcp/ip 套接字连接。我试图充当一个简单的客户端并发送一个字符串并获得响应。 Adobe 的 EventGateway 需要服务器端设置,我无法触及,但它似乎只是一个侦听器(根据 Adob​​e 的文档,“它可以将传出消息发送到现有客户端,但无法自行建立链接。”)。

SO/cflib.org 上还有另一个例子,这是网络上调用 Java 对象的流行帖子,但我没有成功,而且似乎其他人都遇到了某种程度的麻烦。在我的尝试中,我可以让它初始化/连接套接字,但除此之外什么都没有。如果我尝试发送一个字符串,CF 页面加载正常,但服务器端似乎从未看到任何内容(但会记录或记录连接/断开连接)。如果我尝试读取响应,该页面将永远不会加载。如果我在尝试时关闭服务器,它将在尝试 readLine() 时显示连接重置。我已经使用内部应用程序以及简单的 Java 套接字侦听器尝试过此操作,该侦听器将在连接时发送消息并应回显发送的任何内容。

这不是CF的工作吗?如果没有,来自 jQuery/Ajax 领域的任何其他简单建议/示例?

Java监听器应用程序:

package blah;

import java.awt.Color;
import java.awt.BorderLayout;
import java.awt.event.*;
import javax.swing.*;

import java.io.*;
import java.net.*;

class SocketServer extends JFrame
    implements ActionListener {

/**
 * 
 */
private static final long serialVersionUID = 1L;
JButton button;
   JLabel label = new JLabel("Text received over socket:");
   JPanel panel;
   JTextArea textArea = new JTextArea();
   ServerSocket server = null;
   Socket client = null;
   BufferedReader in = null;
   PrintWriter out = null;
   String line;

   SocketServer(){ //Begin Constructor
     button = new JButton("Click Me");
     button.addActionListener(this);

     panel = new JPanel();
     panel.setLayout(new BorderLayout());
     panel.setBackground(Color.white);
     getContentPane().add(panel);
     panel.add("North", label);
     panel.add("Center", textArea);
     panel.add("South", button);

   } //End Constructor

  public void actionPerformed(ActionEvent event) {
     Object source = event.getSource();

     if(source == button){
         textArea.setText(line);
     }
  }

  public void listenSocket(){

    try{
      server = new ServerSocket(4444); 
    } catch (IOException e) {
     System.out.println("Could not listen on port 4444");
      System.exit(-1);
    }

    try{
      client = server.accept();
 //Show connection status in text box, and send back to client
      line = " Connected ";
      out.println(line);
      textArea.setText(line);
    } catch (IOException e) {
      System.out.println("Accept failed: 4444");
      System.exit(-1);
    }

    try{
      in = new BufferedReader(new InputStreamReader(client.getInputStream()));
      out = new PrintWriter(client.getOutputStream(), true);
    } catch (IOException e) {
      System.out.println("Accept failed: 4444");
      System.exit(-1);
    }

    while(true){
      try{
//Try to concatenate to see if line is being changed and we're just not seeing it, show in textbox
        line = line + " " + in.readLine();
        textArea.setText(line);
//Send data back to client
        out.println(line);
      } catch (IOException e) {
        System.out.println("Read failed");
        System.exit(-1);
      }
    }
  }

  protected void finalize(){
//Clean up 
     try{
        in.close();
        out.close();
        server.close();
    } catch (IOException e) {
        System.out.println("Could not close.");
        System.exit(-1);
    }
  }

  public static void main(String[] args){
        SocketServer frame = new SocketServer();
    frame.setTitle("Server Program");
        WindowListener l = new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                        System.exit(0);
                }
        };
        frame.addWindowListener(l);
        frame.pack();
        frame.setVisible(true);
    frame.listenSocket();
  }
}

CF 简单发送(减去 HTML 页眉/页脚、硬编码的 IP、简单侦听器上的端口 = 4444):

<cfset sock = createObject( "java", "java.net.Socket" )>
<cfset sock.init( "ip.ip.ip.ip", 4444)>

<cfset streamOut = sock.getOutputStream()>

<cfset output = createObject("java", "java.io.PrintWriter").init(streamOut)>
<cfset streamOut.flush()>

<cfset output.println("Test Me")>
<cfset output.println()>

<cfset streamOut.flush()>

<cfset sock.shutdownOutput()>
<cfset sock.close()>

简单的 CF 读取(同样,减去页眉/页脚模板、要硬编码的服务器 IP、端口 4444)

<cfset sock = createObject( "java", "java.net.Socket" )>
<cfset sock.init( "ip.ip.ip.ip", 4444)>

<cfset streamInput = sock.getInputStream()>
<cfset inputStreamReader= createObject( "java", "java.io.InputStreamReader").init(streamInput)>

<cfset input = createObject( "java", "java.io.BufferedReader").init(InputStreamReader)>

<cfset result = input.readLine()>

<cfset sock.shutdownInput()>
<cfset sock.close()>

我尝试在这里和那里添加一些睡眠,也尝试不使用 PrintWriter/仅使用 ObjectOutputStream 和 writeObject() 进行发送,但行为相同。任何帮助将不胜感激。谢谢!


即使利用 Java,在 ColdFusion 中实现这也将是一个非常具有挑战性的过程,原因很简单:

套接字通信是实时的,而 Web 请求具有有限的起始点和终止点。

例如,当您发出 ColdFusion 模板请求时,所有内容(变量、共享内存、对象实例化等)都存在于页面请求的上下文中,并且(除了一些注意事项)在页面请求结束时消失。因此,我们暂时假设您有一个 CFML 模板,可以根据请求执行以下任务:

  1. 打开一个套接字。
  2. 已建立到远程 ip:port 的连接。
  3. 聆听回应。
  4. 将该响应打印到浏览器。

让我们进一步假设您的代码正在运行、经过测试并且可以工作。您可以打开套接字,连接到远程 IP 和端口(您实际上在远程服务器上看到传入请求,并且可以确认这一点)并且出于所有意图和目的......您的连接良好。

然后,在执行 CFML 页面 10 分钟后,远程服务器通过连接发送了一串文本......

...您的 CFML 端没有任何活动正在等待响应,准备将其打印到浏览器。当 CFML 模板请求结束时,您实例化的用于打开套接字和连接的对象...全部消失。

这就是为什么(如上所述)当您尝试“读取响应”时,您发现页面从未加载。发生的情况是,ColdFusion 被告知“请稍候,我们实际上可能会通过此套接字获取一些数据”...因此它会阻止 Web 请求结束并等待...这向用户显示为成为“挂起”的网页。

实时套接字通信的本质是它已连接并正在侦听,等待响应......不幸的是,正在运行的网页无法永远运行(和“等待”),它最终会超时。

最重要的是,虽然 Java 允许您打开/连接/发送/接收/关闭原始套接字,但在 CFML 页面的上下文中执行此操作可能不是您最终寻找的方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 ColdFusion 进行简单的 TCP/IP 套接字通信 的相关文章

随机推荐

  • Mongoose 版本控制:什么时候禁用它是安全的?

    来自docs http mongoosejs com docs guide html versionKey versionKey 是每个文档首次创建时设置的属性 由猫鼬 该键值包含的内部修订 文档 该文档属性的名称是可配置的 这 默认为 v
  • 随机自定义视图选择器[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我创建了一个视图控制器 其中包含一个滚动视图 在滚动视图上我水平添加 5 个不同的自定义 UIView 我希望自定义 UIView 应根据自
  • 在执行快照的进程遍历后,如何获取所有进程的完整命令行?

    所以 我的目标是获取所有当前正在运行的进程的完整命令行 为此 我所做的就是使用CreateToolhelp32SnapshotAPI 然后执行一个流程来存储PROCESSENTRY32在名为的数组中键入进程process list BOOL
  • iOS 7.1 UITextView 在新行后仍然无法滚动到光标/插入符

    从 iOS 7 开始 UITextView当用户键入流到新行的文本时 不会自动滚动到光标 这个问题在 SO 和其他地方都有详细记录 对我来说 这个问题在 iOS 7 1 中仍然存在 我究竟做错了什么 我安装了 Xcode 5 1 目标是 i
  • HttpUtility.HtmlAttributeEncode 的缺点

    我必须对一个字段进行编码 以确保脚本注入的安全 我知道我可以使用 HttpUtility HtmlEncode 和 Decode 但是这种用于 HI ASCII 字符的方法超出了数据库中字段大小的范围 并且我不想更改数据字段列的大小 相反
  • Oracle 12c XML 从响应中获取值

    我是 PL SQL 新手 我需要使用 SOAP Web 服务 我无法从此响应中提取 p 地址值 response xml
  • 跨域限制和子域

    子域有跨域策略限制吗 如果我有一个申请paint xxxx com这是操纵图像image xxxx com 有跨域问题吗 我问这些问题是因为我正在考虑在子域上放置代理 是的 跨域限制适用于子域 解决方案是把 document domain
  • IntelliJ IDEA 可以在完成后自动格式化代码块吗?

    一些 IDE 提供在完成一行或代码块后自动格式化它的功能 例如通过写结束花或分号 我很难相信 IDEA 不提供这种功能 或者确实如此 如果您知道如何打开它 或者如果我可能需要一些插件 请让我和全世界知道 If it s a single l
  • Emacs 中的代码折叠[重复]

    这个问题在这里已经有答案了 可能的重复 emacs中如何实现代码折叠效果 https stackoverflow com questions 1085170 how to achieve code folding effects in em
  • 无法将 String 用作 Spring Data 的 @Id

    我想使用此类在数据库上创建新表 Entity Table name currency rate public class CurrencyRate Id private String id Column name source curren
  • PHPDoc 的冗长是否带来的麻烦大于它的价值? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我今天第一次尝试使用 PHPDoc 很快就遇到了问题 每 1 行变量声明 我至少有 5 行注释 例子 Holds path the remote
  • 存在无默认值的参数时 do.call() 的行为

    这个问题是一个后续问题之前的回答 https stackoverflow com a 18108234 636656这就提出了一个难题 之前答案中的可重现示例 Models lt list lm runif 10 rnorm 10 lm r
  • `atob` 抛出“要解码的字符串未正确编码”

    我遇到了问题atob抛出异常 要解码的字符串未正确编码 堆栈溢出上已经存在一些类似的问题 但它们涉及 复杂 问题 文件和 或 URL 编码 我的代码要简单得多 atob MC4wNTgxMzA0OTg5OCAwLjA1NTU0MTg5OTA
  • 如何在 Optuna 中优化多个指标

    如何同时优化多个指标objectiveOptuna 的功能 例如 我正在训练 LGBM 分类器 希望为所有常见分类指标 如 F1 精度 召回率 准确度 AUC 等 找到最佳超参数集 def objective trial Train gbm
  • 在张量流中找到两个边界框的交集?

    系统的坐标是 boundary coordinates x min y min x max y max 我想找到两个框 set1 和 set2 的交集 set1 gt n1 4 set2 gt n2 4 example set 1 gt t
  • 如何将 Web 服务中的“null”值表示为真正的 null 或空字符串,而不是“null”字符串

    在我的应用程序中 我使用 JSF 和 Java Web 服务 当我的任何网络服务函数返回nullvalue 它总是表示为 null 字符串 因此 我无法使用 EL 表达式 例如 empty object 测试null值或空字符串 我想问一下
  • ggplot 无法使用facet_wrap 和群体美学绘制平滑的gam

    我正在尝试使用具有群体美学的 ggplot 绘制多面板和多线图facet wrap 但是 那geom smooth当一组数据点太少时 分面图中的所有线都会失败 plot1 lt ggplot data df1 aes x Year y Me
  • Groovy MOP 调用方法

    我试图了解 invokeMethod 如何拦截 Groovy 中的方法调用 不过 我似乎无法让最基本的示例发挥作用 class Person implements GroovyInterceptable def invokeMethod S
  • 如何在 Url.Action 中发送多个参数?

    如何在一个文件中发送多个参数Url Action 我有一个带有操作的控制器 我想要 2 个参数 但没有收到第二个参数 我的代码是 Url Action Products Jquery new categoryid 1 Productid 2
  • 使用 ColdFusion 进行简单的 TCP/IP 套接字通信

    我做了一些搜索 似乎没有太多成功的方法可以通过 Coldfusion 成功建立 tcp ip 套接字连接 我试图充当一个简单的客户端并发送一个字符串并获得响应 Adobe 的 EventGateway 需要服务器端设置 我无法触及 但它似乎