0

我一直在尝试发送用 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) + "");
    }
}
4

1 回答 1

3

接收者需要以某种方式知道何时停止从套接字读取并返回消息。这基本上可以通过三种方式完成:或者你有一个固定长度的消息,或者你在每条消息前面加上它的长度,或者你有一些结束每条消息的终结符。

在发送方,您只需发送消息,而无需进一步说明接收方如何知道其长度。由于我不知道 ISO8583 标准,我无法判断这种格式的消息是否可能具有上述功能之一。

但是,在接收方,您使用BufferedReader.readLine(),它使用第三个选项并等待换行符。显然,您的消息不会以换行符终止,因此读者会无限等待换行符。

由于消息是在字节数组中编码而不是在字符串中,我强烈怀疑您不应该使用换行符作为终止符,直到保证该字符永远不会出现在消息本身中。相反,您应该检查一个人通常如何发送此类消息,以及接收者如何知道它们的长度。

此外,您正在混合字符串和字节数组,这是一个错误。发送者发送一个原始字节数组。接收端发生的情况是 InputStreamReader 在内部将字节数组转换为字符串。此操作使用 UTF-8 等字符集将字节解码为字符。您甚至没有指定要使用的字符集,因此输出几乎是任意的。之后您的代码将 String 转换回字节数组,但此代码是错误的并且不能保证恢复原始内容(生成的字节数组可能与服务器发送的字节数组不同)。

因此,如果您不在发送方使用 Writer 类,则不应在接收方使用任何 Reader 类。而是在发送时只使用 Streams。

于 2015-01-17T09:37:58.793 回答