我一直在尝试使用Java中的JPOS库发送ISO8583消息。 我所做的是编写一个简单的套接字连接代码来发送消息。 我能够成功发送消息,但问题是服务器按时发送响应,但客户端套接字无法读取消息。 它仅在我强行关闭连接(手动断开套接字)后才读取数据。
我需要通过同一个连接发送超过100条消息并接收响应。我可以做些什么来使这个工作,并让客户端在服务器发送它时立即读取每条消息?
以下是我发送的示例代码:
logISOMsg(isoMsg);
byte[] send_PackedRequestData = isoMsg.pack();
BufferedOutputStream outStream=null;
BufferedReader receiveStream=null;
Socket connection = new Socket("127.0.0.1", 5874);
if (connection.isConnected()) {
outStream = new BufferedOutputStream(connection.getOutputStream());
outStream.write(send_PackedRequestData);
outStream.flush();
}
并阅读:
if (connection.isConnected()) {
receiveStream = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String isoMessage = receiveStream.readLine();
ISOMsg isoMsg1 = new ISOMsg();
isoMsg1.setPackager(packager);
byte[] bIsoMessage = new byte[isoMessage.length()];
for (int i = 0; i < bIsoMessage.length; i++) {
bIsoMessage[i] = (byte) (int) isoMessage.charAt(i);
}
isoMsg1.unpack(bIsoMessage);
System.out.println("MTI='"+isoMsg1.getMTI()+"'");
for (int i=1; i<=isoMsg1.getMaxField(); i++) {
if (isoMsg1.hasField(i))
System.out.println("DE : "+ i + " = " + isoMsg1.getString(i) + "");
}
}
答案 0 :(得分:2)
接收方需要知道何时停止从套接字读取并返回消息。这基本上可以通过三种方式完成:要么具有固定长度的消息,要么为每条消息添加其长度前缀,或者您有一些结束每条消息的终止符号。
在发送方,您只需发送消息,而无需进一步指示接收方如何知道其长度。由于我不知道ISO8583标准,我无法判断这种格式的消息是否具有上述功能之一。
但是,在接收方,您使用BufferedReader.readLine()
,它使用第三个选项并等待换行符。显然你的消息没有以换行符结束,因此读者无限地等待换行。
由于消息是在字节数组中而不是在字符串中编码的,因此我强烈怀疑在保证消息本身永远不会出现此字符之前,不应使用换行符作为终止符号。您应该检查一个人通常如何发送此类消息,以及接收者如何知道他们的长度。
此外,您正在混合使用字符串和字节数组,这是一个错误。发送方发送原始字节数组。接收器端发生的是InputStreamReader内部将字节数组转换为String。此操作使用诸如UTF-8的字符集将字节解码为字符。你甚至没有指定使用哪个charset,因此输出可以是非常随意的。之后,您的代码将String转换回字节数组,但此代码错误,并不保证还原原始内容(生成的字节数组可能与服务器发送的字节数组不同)。
因此,如果您不在发送方使用Writer类,则不应在接收方使用任何Reader类。而是像发送时一样只使用Streams。