【问题标题】:How to send ISO8583 message using Java如何使用 Java 发送 ISO8583 消息
【发布时间】:2022-01-13 13:25:42
【问题描述】:

如果这是一个重复的问题,我真的很抱歉,但我在其他线程中尝试了很多答案,但没有一个对我有用。

我正在尝试使用 TLSv1.2 协议通过 SSLSocket 向远程服务器发送 ISO8583 消息,我使用密钥库配置了证书并尝试发送示例 ISO8583 消息:08002220010000800000900000011312115000000180105000003

0800:MTI
2220010000800000:二进制十六进制编码位图(仅存在字段 3、7、11、24、41)
900000:进程代码
0113121150:传输日期和时间
000001: 斯坦
801:功能码
05000003:终端 ID

然后我将消息转换为字节数组并使用套接字 OutputStream 发送,但服务器没有响应,并且在尝试读取 InputStream 时冻结。

出于这个问题的目的,我选择测试手动设置的示例消息,不使用任何打包方法。

我对 ISO8583 很陌生,所以我不知道自己做错了什么。

这是迄今为止我尝试过的代码,非常感谢愿意帮助我的人。

Thread thread = new Thread(() -> {
                try {

                    X509TrustManager[] tmm;
                    KeyStore ks  = KeyStore.getInstance("BKS");
                    InputStream is = getResources().openRawResource(R.raw.tunrootca2);
                    ks.load(is, KEY_PASSWORD.toCharArray());

                    tmm=tm(ks);
                    SSLContext ctx = SSLContext.getInstance("TLSv1.2");
                    ctx.init(null, tmm, null);

                    SSLSocketFactory SocketFactory = ctx.getSocketFactory();
                    SSLSocket socket = (SSLSocket) SocketFactory
                            .createSocket(REMOTE_ENDPOINT, REMOTE_ENDPOINT_PORT);


                    String sampleMessage = "080022200100008000009000000113120000000180105000003";
                    byte[] bytesMessage = sampleMessage.getBytes(StandardCharsets.UTF_16LE);

                    byte[] bytes = packData(bytesMessage);

                    OutputStream out = socket.getOutputStream();
                    out.write(bytes);

                    byte[] buffer = new byte[256];

                    InputStream in = socket.getInputStream();
                    int read;
                    while((read = in.read(buffer)) != -1) {
                        String output = new String(buffer, 0, read);
                        Log.v("SOCKET_OUTPUT", output);
                    }

                } catch (Exception e) {
                    e.printStackTrace();
                }
            });

            thread.start();

        });

打包数据函数

static byte[] packData(byte[] data) {
        int len = data.length;
        byte buf[] = new byte[len + 2];
        buf[0] = (byte) (len >> 8 & 255);
        buf[1] = (byte) (len & 255);
        System.arraycopy(data, 0, buf, 2, len);
        return buf;
    }

【问题讨论】:

    标签: java sockets ssl iso8583


    【解决方案1】:

    设置套接字通信可能很棘手。如果可能的话,我建议使用 WebSockets 进行通信,因为它们已经设置了通信协议的连接方式。

    但如果你要坚持使用普通套接字:

    1. 在你的 write 调用之后,调用 flush();

           out.write(bytes);
           out.flush();
      
    2. 如果 1 不起作用,事情会变得更棘手。由于您不控制其中的服务器端部分,因此很难知道您需要向他们发送什么才能让他们向您发送一些东西。您可以尝试发送换行符。但除此之外,您发送的内容与另一端的服务器所期望的内容不匹配

    --- 编辑---

    我查阅了 ISO 8583 并更好地了解您想要做什么。你可以忽略我之前关于使用 WebServer 套接字的建议。

    【讨论】:

    • 非常感谢您的快速回答。遗憾的是,我尝试了第一个解决方案,但没有成功,仍然没有来自服务器的数据,但还是谢谢。
    【解决方案2】:

    您缺少基础知识。您不能使用字符串连接构建 ISO 消息。您必须为这些启用字段设置正确的位图。也许尝试遵循以下示例。它将指导您了解基础知识。

    https://kodejava.org/how-do-i-pack-an-iso-8583-message/

    【讨论】:

    • 位图包含在十六进制字符串中,应该是这个问题。他正在翻译消息的文字十六进制编码字节。
    【解决方案3】:

    您的代码看起来不错。你连接到什么样的后端? 8583 有点像 xml,它是一种格式描述,但是每个处理器都使用它来构建自己的特定协议,因此您确实需要向您要连接的供应商询问协议文档。

    有些事情可能是问题:

    • 完成写入后刷新 OutputStream,消息可能仍挂在您的操作系统缓冲区中
    • 检查供应商文档是否需要某种框架,您可能需要将校验和附加到消息或...
    • 您可能需要在消息前添加一个长度标头。 8583 最初建立在传输处理消息长度的中继协议之上。许多解析器还没有赶上向 TCP/IP 的过渡 :)

    【讨论】:

      猜你喜欢
      • 2019-06-01
      • 2017-01-11
      • 2016-05-21
      • 1970-01-01
      • 1970-01-01
      • 2012-09-28
      • 2012-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多