套接字主机回显未'responding'



我最近拿起的Socket programming有这个奇怪的问题。我理解插座可以用于clienthost通信。这个项目也需要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 ()希望得到响应输出,两者都执行相同的问题。没完没了地执行。不幸的是,我不知道该如何处理这个问题。得到测试主机的回复是非常重要的。所以我很感谢你们的帮助。

如果与您通信的服务器不是用Java编写的,或者没有使用对象序列化,则此代码不可能工作。我看不出有任何理由在这里使用对象流。

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

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

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

如果相同的代码在不同的主机上工作,而不是在您的主机上,那么您可能需要查找端口争用。每当创建客户端连接时,就会在服务器上打开一个任意端口,以便与客户端通信。您的防火墙/防病毒可能阻止了它,因此您无法发送响应。

最新更新