我做了一些搜索,似乎没有太多成功的方法可以通过 Coldfusion 成功建立 tcp/ip 套接字连接。我试图充当一个简单的客户端并发送一个字符串并获得响应。 Adobe 的 EventGateway 需要服务器端设置,我无法触及,但它似乎只是一个侦听器(根据 Adobe 的文档,“它可以将传出消息发送到现有客户端,但无法自行建立链接。”)。
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() 进行发送,但行为相同。任何帮助将不胜感激。谢谢!