首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Java发送ISO8583消息

如何使用Java发送ISO8583消息
EN

Stack Overflow用户
提问于 2022-01-13 13:25:42
回答 3查看 2.2K关注 0票数 2

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

我试图使用TLSv1.2协议通过08002220010000800000900000011312115000000180105000003向远程服务器发送ISO8583消息,我用Keystore配置了证书,并试图发送一个示例ISO8583消息:ISO8583

0800:MTI

2220010000800000:二进制十六进制编码位图(只有字段3、7、11、24、41 )

900000:进程代码

0113121150:传输日期和时间

000001:STAN

801:函数代码

05000003:终端ID

然后,我将消息转换为一个字节数组,并使用套接字OutputStream发送它,但是没有来自服务器的响应,当试图读取InputStream时,它正在冻结。

为了解决这个问题,我选择测试手动设置的示例消息,而不使用任何打包方法。

我是ISO8583的新手,所以我不知道自己做错了什么。

下面是我尝试过的代码,非常感谢那些试图帮助我的人。

代码语言:javascript
复制
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函数

代码语言:javascript
复制
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;
    }
EN

回答 3

Stack Overflow用户

发布于 2022-01-13 13:40:25

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

但是,如果您要坚持使用普通套接字:

写完调用后,调用

  1. ();

Out.write(字节);out.flush();

如果

  1. 1不起作用,事情就会变得更加棘手。由于您没有控制服务器端的部分,所以很难知道您需要发送什么才能让它们发送回您的东西。您可以尝试发送换行符。但是,否则,您要发送的内容与服务器对

的期望是不匹配的。

--编辑--

我查阅了ISO 8583,并有一个更好的想法,你想做什么。您可以忽略我以前关于使用WebServer套接字的建议。

票数 0
EN

Stack Overflow用户

发布于 2022-01-16 00:44:05

你错过了最基本的。不能使用字符串连接构建ISO消息。您必须为这些启用字段设置正确的位图。也许试着遵循下面的样本。它将指导你的基本知识。

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

票数 0
EN

Stack Overflow用户

发布于 2022-01-17 10:00:56

你的代码看起来没问题。您连接到哪种后端? 8583有点像xml,它是一种格式描述,但是每个处理器都使用它来构建自己的特定协议,所以您确实需要询问正在连接的供应商的协议文档。

有些事情可能是问题所在:

当您完成编写时,

  • 刷新OutputStream,消息可能仍然挂在操作系统缓冲区
  • 中,检查供应商文档是否需要为消息添加校验和或.
  • ,您可能需要为消息添加长度头。8583最初建立在中继协议之上,在中继协议中传输处理消息长度。许多解析器尚未赶上到TCP/IP :)

的转换。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70697386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档