0

Socket programming最近收到的这个奇怪的问题。我了解 Socket 可用于 aclienthost. 这个项目ISO8583也需要。我已经有了一个工作代码,我正在修改以在我自己的测试主机上工作。

一切都很好,我的代码实际上可以工作,但我面临的一个问题是我根本没有得到任何回应。从我的计算机发送到主机的请求有效。主机显示正确的消息并将响应发送回我的计算机。但我不知道为什么那时我的应用程序会挂在那里。即使在调试模式下,它也会连续执行该行(我将向您展示它执行哪一行)而不返回任何值。这是我下面的代码。这很混乱,我正在尝试很多方法来尝试获得响应值。

byte dataSmall[] = {0x00, 0x43, 0x60, 0x00, 0x02, 0x00, 0x00, 0x08, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00, (byte) 0xC0, 
            0x00, 0x00, 99, 0x00, 0x00, 0x00, 0x02, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 
            0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31};

    try {
        Socket echoSocket = new Socket("IP Address", port number);
        ObjectOutputStream os = new ObjectOutputStream(echoSocket.getOutputStream());
         String responseLine;
         Client client = new Client(echoSocket);
        Thread reader = new Thread(client, "j8583-client");
        PrintWriter pw = new PrintWriter(os, true);


            reader.start();
            os.writeObject(dataSmall);
            os.flush();

            ObjectInputStream ois = new ObjectInputStream(echoSocket.getInputStream());
            //convert ObjectInputStream object to String
            String message = (String) ois.readObject(); // this is the continuous execution
            System.out.println(message);

            System.out.println("waiting for response");
            BufferedReader in = new BufferedReader(new InputStreamReader(
                    echoSocket.getInputStream()));
            responseLine = in.readLine().toCharArray().toString();

            System.out.println("still waiting for response");
            System.out.println(responseLine);
        os.close();
        in.close();
        echoSocket.close();
        client.stop();
        reader.interrupt();

我已经尝试过.readObject().readLine()希望获得响应输出并且都执行相同的问题。执行无止境。不幸的是,我对如何处理这个问题一无所知。从我的测试主机那里得到响应是非常重要的。所以我很感激你们可以提供的任何帮助。提前致谢。

4

3 回答 3

1

如果您正在与之交谈的服务器不是用 Java 编写的或不使用对象序列化,则此代码可能无法工作。我在这里看不到任何使用对象流的理由。尝试使用实际的套接字流。

于 2013-05-03T11:01:36.460 回答
1

ISO8583 消息传递通常以异步模式完成,读取/写入 ISO 消息的方式是将消息的长度放在首位,编码为 16 位无符号整数。

因此,首先您需要将 ISO 消息放入字节缓冲区中,测量它,然后写入该长度,然后写入消息(并刷新流)。

要读取响应,首先读取 2 个字节,将它们解释为 16 位无符号整数,然后创建该大小的缓冲区并读取消息的其余部分。您需要一个专用线程来连续读取响应并将它们传递给其他工作人员进行解析和处理。

于 2015-11-04T16:56:02.043 回答
-2

如果相同的代码在不同的主机上运行而不是在你的主机上运行,​​那么你可能需要寻找端口争用。每当创建客户端连接时,都会在服务器上打开一个任意端口以与客户端进行通信。您的防火墙/防病毒软件可能会阻止它,因此您无法发回响应。

于 2013-05-03T10:53:28.273 回答