簡體   English   中英

使用ColdFusion的簡單TCP / IP套接字通信

[英]Simple TCP/IP socket communication using ColdFusion

我已經進行了一些搜索,但似乎似乎沒有太多成功通過Coldfusion成功建立tcp / ip套接字連接的方法。 我試圖充當一個簡單的客戶端,並發送一個字符串並獲得響應。 Adobe的EventGateway需要服務器端設置,這是我無法觸及的,但似乎僅是偵聽器(根據Adobe的文檔,“它可以將傳出的消息發送到現有客戶端,但不能自己建立鏈接。”)。

SO / cflib.org上還有另一個示例,它是Web上普遍使用Java對象的帖子,但我沒有成功,而且似乎其他所有人都對此有一定的麻煩。 在我的嘗試中,我可以使用它來初始化/連接套接字,但沒有別的。 如果我嘗試發送字符串,則CF頁可以很好地加載,但是服務器端看似看不到任何東西(但會記錄或記錄連接/斷開連接)。 如果我嘗試讀取響應,則該頁面將永遠不會加載。 如果在嘗試關閉服務器時將其關閉,則在嘗試readLine()時它將顯示連接重置。 我已經使用內部應用程序以及一個簡單的Java套接字偵聽器進行了嘗試,該偵聽器將在connect上發送一條消息,並應回顯所發送的任何內容。

這不是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頁面的上下文中執行此操作可能並不是您最終要尋找的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM