我最近遇到的Socket programming
遇到了这个奇怪的问题。我知道Socket可以用于client
与host
进行通信。该项目也需要ISO8583
。我已经有了一个正常工作的代码,我正在修改我自己的测试主机。
一切都很好,我的代码实际上有效,但我遇到的一个问题是我根本没有响应。从我的计算机发送到主机的请求有效。主机显示正确的消息并将响应发送回我的计算机。但我不知道为什么在那时,我的应用程序将挂在那里。即使在调试模式下,它也会连续执行该行(我将向其显示其执行的行),而不返回任何值。这是我的代码。这是非常混乱,我正在尝试许多尝试获得响应值的方法。
byte dataSmall[] = {0x00, 0x43, 0x60, 0x00, 0x02, 0x00, 0x00, 0x08, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00, (byte) 0xC0,
0x00, 0x00, 99, 0x00, 0x00, 0x00, 0x02, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31,
0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31};
try {
Socket echoSocket = new Socket("IP Address", port number);
ObjectOutputStream os = new ObjectOutputStream(echoSocket.getOutputStream());
String responseLine;
Client client = new Client(echoSocket);
Thread reader = new Thread(client, "j8583-client");
PrintWriter pw = new PrintWriter(os, true);
reader.start();
os.writeObject(dataSmall);
os.flush();
ObjectInputStream ois = new ObjectInputStream(echoSocket.getInputStream());
//convert ObjectInputStream object to String
String message = (String) ois.readObject(); // this is the continuous execution
System.out.println(message);
System.out.println("waiting for response");
BufferedReader in = new BufferedReader(new InputStreamReader(
echoSocket.getInputStream()));
responseLine = in.readLine().toCharArray().toString();
System.out.println("still waiting for response");
System.out.println(responseLine);
os.close();
in.close();
echoSocket.close();
client.stop();
reader.interrupt();
我已经尝试 .readObject()和 .readLine()希望获得响应输出并且都执行相同的问题。执行无止境。不幸的是,我不知道如何处理这个问题。我从测试主机获得响应非常重要。所以我感谢你们给予的任何帮助。提前谢谢。
答案 0 :(得分:1)
如果您正在与之交谈的服务器不是用Java编写的,或者不使用对象序列化,则此代码可能无法正常工作。我没有看到任何理由使用对象流。尝试使用实际的套接字流。
答案 1 :(得分:1)
ISO8583消息传递通常在异步模式下完成,读取/写入ISO消息的方法是先将消息的长度放入,编码为16位无符号整数。
首先,您需要将ISO消息放入字节缓冲区,测量它,然后写入该长度,然后消息(并刷新流)。
要读取响应,首先要读取2个字节,将它们解释为16位无符号整数,然后创建该大小的缓冲区并读取其余的消息。您需要一个专用线程来连续读取响应并将其传递给其他工作人员进行解析和处理。
答案 2 :(得分:-2)
如果相同的代码在不同的主机上运行而不在您的主机上运行,那么您可能需要查找端口争用。无论何时创建客户端连接,都会在服务器上打开一个与客户端通信的任意端口。您的防火墙/防病毒软件可能会阻止它,因此您无法发回响应。