我最近拿起的Socket programming
有这个奇怪的问题。我理解插座可以用于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 ()希望得到响应输出,两者都执行相同的问题。没完没了地执行。不幸的是,我不知道该如何处理这个问题。得到测试主机的回复是非常重要的。所以我很感谢你们的帮助。
如果与您通信的服务器不是用Java编写的,或者没有使用对象序列化,则此代码不可能工作。我看不出有任何理由在这里使用对象流。
ISO8583消息传递通常以异步模式完成,读/写ISO消息的方式是将消息的长度放在第一位,编码为16位无符号整数。
因此,首先您需要将ISO消息放入字节缓冲区,测量它,然后写入该长度,然后写入消息(并刷新流)。
要读取响应,首先读取2字节,将其解释为16位无符号整数,然后创建该大小的缓冲区并读取消息的其余部分。您需要一个专用线程来连续读取响应,并将它们传递给其他工作线程进行解析和处理。
如果相同的代码在不同的主机上工作,而不是在您的主机上,那么您可能需要查找端口争用。每当创建客户端连接时,就会在服务器上打开一个任意端口,以便与客户端通信。您的防火墙/防病毒可能阻止了它,因此您无法发送响应。