java - 如何使用 Java 发送 ISO8583 消息

标签 java sockets ssl iso8583

如果这是一个重复的问题,我真的很抱歉,但我在其他线程中尝试了很多答案,但没有一个对我有用。
我正在尝试使用 TLSv1.2 协议(protocol)通过 SSLSocket 向远程服务器发送 ISO8583 消息,我使用 keystore 配置了证书并尝试发送示例 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();

        });
PackData 函数
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;
    }

最佳答案

设置套接字通信可能很棘手。如果可能的话,我建议使用 WebSockets 进行通信,因为它们已经设置了通信协议(protocol)的连接方式。
但是,如果您要坚持使用普通套接字:

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

  • - - 编辑 - -
    我查阅了 ISO 8583 并对您正在尝试做的事情有了更好的了解。你可以忽略我之前关于使用 WebServer 套接字的建议。

    关于java - 如何使用 Java 发送 ISO8583 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70697386/

    相关文章:

    java - 将 UDP 从 Java 发送到 Python 不起作用

    java - 使用 Tycho 在同一项目中进行源代码和测试源代码

    java - 如何修复线程 "main"java.io.EOFException 中的异常? (java套接字)

    c++ - boost asio在基于tcp的协议(protocol)中找到消息的开头

    Java Netty - 根据输入消息将结果作为 StringEncoder 或 ObjectEncoder 发送到客户端?

    sockets - 如何在 openssl 中管理错误队列(SSL_get_error 和 ERR_get_error)

    ssl - 双语域通配符 SSL 证书?

    java - ReadWriteLock 与 StampedLock

    java - 即使我捕获它,也会抛出 NoSuchElementException 吗?

    node.js - 如何配置 express js 4 为 http 中的某些页面和 https 中的其他页面提供服务?