java从Socket读取挂起

时间:2015-09-16 12:15:12

标签: java sockets

我必须通过TCP / IP在终端和POS终端之间实现通信。我所拥有的是pos终端的IP和端口以及协议规范。

在java中我做了一个简单的例子来写一个套接字,但是当我想从套接字中读取时我的应用程序冻结(直到达到超时)..

我做错了什么?

 try {
        pos = new Socket("172.16.201.217", 1500);
        pos.setSoTimeout(5000);

        output = new DataOutputStream(pos.getOutputStream());

        System.out.println("is connected?:" + pos.isConnected());
        String amount = "100";
        String p = "000000123401100" + FS + amount + FS + FS + "+0" + FS + "705" + FS + FS + FS + FS + FS + FS + FS + ETX;

        //Podatki is a method which adds some additional chars + CRC.. 
        byte[] protokol = Podatki(p);

        //here I send a complete array of bytes to my pos...
        output.write(protokol, 0, protokol.length);
        output.flush();

        Thread.sleep(1000);


        input = new BufferedReader(new InputStreamReader(pos.getInputStream()));
        String line = "";
        String response = "";
        while ((line = input.readLine()) != null) {
            System.out.println(line);
            response = response + line + "\n";
            if (input.ready() == false) {
                break;
            }

我得到的是超时异常.. 我期待的是pos终端的响应,可以是ACK(确认)或NAK(否定确认)。

谢谢。

2 个答案:

答案 0 :(得分:0)

您的消息可能未完成(例如,它可能正在等待消息字符的特定结尾或字符序列),因此POS正在等待消息的其余部分。在这种情况下,代码的超时发生在pos。

的错误消息之前

要检查它,请在代码和POS之间使用套接字嗅探器,这样您就可以看到客户端和服务器之间传递的确切内容,反之亦然。

答案 1 :(得分:0)

你好像在读书而不是写作。 readLine()将阻塞直到流结束或遇到异常或行终止符。如果您没有发送线路终结器并且没有关闭套接字并且没有发生网络错误,则对等方的readLine()将永久阻止。

发送行终结符:\n\r\n