2012-01-11 4 views
4

Я сделал несколько поисков, и похоже, что не удалось добиться успеха при установлении соединения сокетов tcp/ip через Coldfusion. Я пытаюсь действовать как простой клиент и отправлять строку и получать ответ. Adobe EventGateway для Adobe требует установки на стороне сервера, к которой я не могу прикасаться, но, похоже, только слушатель (согласно документу Adobe, «Он может отправлять исходящие сообщения существующим клиентам, но не может установить ссылку».).Простая связь со штекером TCP/IP с использованием ColdFusion

Существует еще один пример на 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 Simple Send (минус 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()> 

Я попытался добавить сома e спит здесь и там, а также попробовал отправить, не используя PrintWriter/используя только ObjectOutputStream и writeObject(), но такое же поведение. Любая помощь будет принята с благодарностью. Благодаря!

ответ

2

Это будет очень сложный процесс, чтобы реализовать в ColdFusion, даже если воспользоваться Java, по той простой причине:

Оправа связь в режиме реального времени, в то время как веб-запросы имеют конечную начальную и остановка точек.

Например, когда вы делаете запрос шаблона ColdFusion, все (переменные, общая память, объект-экземпляр объекта и т. Д.) Живет в контексте запроса страницы - и (запрет нескольких оговорок) умирает, когда страница запрос заканчивается. Итак, давайте предположим на тот момент, что у вас был шаблон CFML, который выполнил следующие задачи по запросу:

  1. Открыт разъем.
  2. Установлено соединение с удаленным ip: портом.
  3. Слушали ответы.
  4. Отпечатано ответ в браузере.

Предположим дополнительно, что ваш код работает, проверен и работает. Вы можете открыть сокет, подключиться к удаленному ip и порту (вы действительно видите входящий запрос на удаленном сервере и можете подтвердить это) и для всех целей и задач ... ваше соединение является хорошим.

Затем 10 минут после того, как выполнена страница CFML, удаленный сервер послал строку текста через соединение ...

... нет ничего на вашем конце CFML, что жив и ожидают, что ответ , готов к печати в браузере. Объекты, созданные вами, используемые для открытия сокета и подключения ... все исчезли, когда запрос шаблона CFML закончился.

Именно поэтому (как указано выше), когда вы пытались «прочитать ответ», вы заметили, что страница никогда не загружалась. Что происходит, так это то, что ColdFusion говорят «встать, пожалуйста, мы могли бы, возможно, получить некоторые данные над этим сокетом» ... поэтому он блокирует веб-запрос от завершения и ждет ..., который проявляется пользователю как то, что появляется быть «повесил» веб-страницу.

Характер связи в реальном времени сокета заключается в том, что он подключен и прослушивается, ожидая ответа ... и, к сожалению, работающая веб-страница не может работать (и «ждать») навсегда, это в конечном итоге приведет к таймауту.

Суть в том, что, хотя Java позволит вам открывать/соединять/отправлять/получать/закрывать сырые сокеты, делать это из контекста страницы CFML, возможно, не тот подход, который вы в конечном счете ищете.

+0

Это то, что мне было интересно - если бы не было «чистого», «сделайте, пока вы не отправите/не получите что-то, а затем не уйдете», чтобы рукопожатие, поскольку контент по существу имеет один шанс загрузить. Я надеялся, что мне удастся «заставить время», возможно, сделав одно сообщение на одной странице за раз и поражая эту страницу столько раз, сколько необходимо, в отличие от другого динамического контента. Спасибо за ваш ответ! – user1144336

+0

Если, например, вы создавали веб-страницу ColdFusion, которая запрашивала сервер Quake для старой игровой информации, вы могли бы заставить ее работать с некоторыми модами, тайм-аутами, задержками и т. Д. ... с тех пор запрос (по своей природе) - запрос-ответ, который подходит для Интернета (запрос на сервер, получение информации, отображение на экране, завершение). То, как кажущиеся в реальном времени веб-приложения имитируют это, - это постоянно пинговать сервер, проверка новой информации - и, в конце концов, на самом деле это не так сильно, как обновление веб-страницы снова и снова; не очень эффективно. –

Смежные вопросы