当前位置: 首页 > 知识库问答 >
问题:

如何使用Java发送ISO8583消息

伯俊弼
2023-03-14

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

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

0800:MTI
222001000800000:二进制十六进制编码位图(仅显示字段3、7、11、24、41)
900000:过程代码
011312150:传输日期

然后,我将消息转换为字节数组,并将其与套接字输出流一起发送,但没有来自服务器的响应,当试图读取输入流时,它处于冻结状态。

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

我是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;
    }

共有1个答案

微生弘
2023-03-14

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

但如果您打算坚持使用普通插座:

>

  • 写调用后,调用flush();

         out.write(bytes);
         out.flush();
    

    如果我不工作,事情会变得更棘手。由于您无法控制服务器端部分,因此很难知道需要发送什么才能让他们向您发送回某些内容。您可以尝试发送换行符。但除此之外,您发送的内容与另一端的服务器期望的内容之间存在不匹配

    ---编辑---

    我查阅了ISO 8583,对您要做的事情有了更好的了解。您可以忽略我之前关于使用Web服务器套接字的建议。

  •  类似资料:
    • 问题内容: 香港专业教育学院一直从Java发送最简单的电子邮件没有问题,但我现在正尝试发送html如下: 但是,当我在客户端收到它时,它以纯文本电子邮件的形式接收,即它显示所有html标记,而不是用于格式化,并且我已经检查了电子邮件标题,并说 在邮件标题中 但是为什么因为我将“ text / html”传递给setContent()方法,那似乎是您唯一要做的事情。 问题答案: 您可以尝试以下方法:

    • 我想用grafana显示指标(只是一个简单的每秒/分钟请求数计数器)。我使用石墨收集指标。 当我使用java向graphite报告请求时: 问题是,一切都毫无例外地运行,但是Graphite服务器没有得到任何指标。知道她怎么了吗? 此外,该指标的名称(mymetrics.requests.successful)没有出现在指标系列的列表中。 非常感谢提前!

    • 问题内容: 我想使用Java将“推送通知”消息发送到特定的iPhone设备。 我不知道该怎么做。 我对此进行了谷歌搜索,他们建议使用“ PayLoad”类,但不要从任何jar文件中获取此类。 请有人指导我通过Java将推送通知消息发送到iPhone吗? 问题答案: 使用JavaPNS。例如:

    • 我有一个工作的WebSocket示例,其中客户端从服务器接收消息。 我不确定当客户端连接时,我应该如何向客户端发送旧消息。 示例: 每个客户端在连接时提供其名称 服务器响应“[名称] 刚刚连接”(对所有客户端) 任何新客户端都不会收到这些消息 我想知道客户端是否有任何方法可以接收旧消息(所有消息或过去 5 分钟内的消息都可以接受)。 我怀疑我可能需要自己捕获这些信息,将其存储在某个地方(如数据库)

    • 问题内容: 如何从Java发送SMTP消息? 问题答案: 这是Gmail smtp的示例: 现在,仅当您希望将项目依赖关系降至最低时,才可以这样做,否则我可以热烈推荐使用apache中的类 http://commons.apache.org/email/ 问候 托雷·雅各布森

    • 我需要你的帮助。我正在用MQTT创建一个程序,它必须执行写在文件上的命令,并将结果发送到主题。我已经设法在终端上执行命令并打印结果,但是当我必须通过MQTT发送它时,它会创建两条消息,是否可以只发送带有结果的消息?我该怎么办?谢谢,我将放置代码,用于读取执行的命令的结果以及它发送给我的两条消息。