gpt4 book ai didi

java - java中服务器关闭连接端后消息才被客户端读取

转载 作者:行者123 更新时间:2023-12-02 05:03:49 27 4
gpt4 key购买 nike

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

最佳答案

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

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

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

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

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

因此,如果您不在发送方使用 Writer 类,则不应在接收方使用任何 Reader 类。相反,像发送时一样仅使用 Streams。

关于java - java中服务器关闭连接端后消息才被客户端读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27996249/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com