Java:客户端套接字不读取第二行,在终止符行之后保持打开状态

Java:客户端套接字不读取第二行,在终止符行之后保持打开状态,java,sockets,client,Java,Sockets,Client,在网上读了几十个例子之后,我仍然被这个问题困扰着 我将java客户端的消息发送到C++中的服务器。收到握手信息后,服务器发回以下数据: “0000:1111:2222:3333:4444 结束\u连接\u数据“ 客户端读取最后一行(终止符)后,应立即关闭连接 我就是这样做的: Socket socket = null; String terminator = "END_CONNECT_DATA"; try { int serverPort =

在网上读了几十个例子之后,我仍然被这个问题困扰着

我将java客户端的消息发送到C++中的服务器。收到握手信息后,服务器发回以下数据:

“0000:1111:2222:3333:4444

结束\u连接\u数据“

客户端读取最后一行(终止符)后,应立即关闭连接

我就是这样做的:

    Socket socket = null;

    String  terminator = "END_CONNECT_DATA";

    try
    {
        int serverPort = 7767;
        String ip = "192.168.1.10";
        String messageOut = "HAND-SHAKE MESSAGE";

        socket = new Socket(ip, serverPort);

        DataInputStream input = new DataInputStream( socket.getInputStream());
        DataOutputStream output = new DataOutputStream( socket.getOutputStream());

        //Send message
        output.writeBytes(messageOut);

        //Read Response
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        StringBuffer sb = new StringBuffer();
        String s = "";

        while((s = br.readLine()) != null)
        {
            System.out.println("CHECK !!!");
            System.out.println(s);
            sb.append(s);

            if(s.contains(terminator))
            {
                System.out.println("CHECK TERMINATOR");
                break;
            }
        }

        socket.close();

        String data = sb.toString();

        System.out.println("FULL DATA:\n");
        System.out.println(data);
    }

    catch (UnknownHostException e)
    {
        System.out.println("Sock:"+e.getMessage());
    }

    catch (EOFException e)
    {
        System.out.println("EOF:"+e.getMessage()); 
    }

    catch (IOException e)
    {
        System.out.println("IO:"+e.getMessage());
    }

    finally 
    {
        if(socket!=null)
        {
            try 
            {
                socket.close();

            }
            catch (IOException e) 
            {

            }
        }
    }
} 
我从服务器上得到的只是第一行。光标移到下一行并继续闪烁。套接字连接未关闭。看起来客户端根本没有读取终止符(消息的第二行)

有什么想法吗


非常感谢

显然,对等方既没有在最后一行之后发送行终止符,也没有关闭套接字。因此,使用
readLine()
读取这些消息是不正确的。如果可以调整对等机,请执行此操作。

显然,对等机既没有在最后一行之后发送线路终止符,也没有关闭套接字。因此,使用
readLine()
读取这些消息是不正确的。如果可以调整对等点,请执行此操作。

由于循环未以
\r
\n
终止,因此无法读取第二行中的内容。因此,只返回到那时为止的结果,这是前面描述的第一行

您需要在终止符后面添加一个
\r
\n
,或者使用
BufferedReader.read()
并手动检查,或者采用另一种策略读取消息,因为循环无法读取第二行,因为它没有以
\r
\n
终止。因此,只返回到那时为止的结果,这是前面描述的第一行



您需要在终止符后面添加一个
\r
\n
,或者使用
BufferedReader.read()
并手动检查,或者采用另一种策略读取消息

至少需要解释下一行的原因。当无法读取下一行时,循环退出并关闭套接字。您的服务器是如何发送消息的?作为两条单独的消息或一条在两条消息之间有新行的消息?一条终止符从新行开始的消息。我知道,它读不懂第二行。但是为什么?顺便说一句,循环似乎没有退出,因为我的控制台上没有显示“完整数据”。因为您正在逐行读取,所以终止符后面需要跟一个新行字符。通过这种方式,
BufferedReader
将检测到第二行已终止,因此读取结果。至少需要解释下行投票的原因。当无法读取下一行时,循环退出并关闭套接字。您的服务器是如何发送消息的?作为两条单独的消息或一条在两条消息之间有新行的消息?一条终止符从新行开始的消息。我知道,它读不懂第二行。但是为什么?顺便说一句,循环似乎没有退出,因为我的控制台上没有显示“完整数据”。因为您正在逐行读取,所以终止符后面需要跟一个新行字符。通过这种方式,
BufferedReader
将获取第二行已终止的信息,从而读取结果。服务器将发送第二行(终止符)。我使用为iOS设备编写的客户端进行了检查。我希望避免在服务器端更改任何内容。如果不使用
readLine()
,我如何从服务器读取整个消息?根据您的问题陈述,对等方绝对不可能发送第二行终止符。不管怎样,你已经接受了另一个答案,说它不是
readLine()
不是JDK中唯一的读取方法。很抱歉,我将行终止符与用于指示套接字必须关闭的单词terminator混淆了。我的错。服务器确实发送了第二行(终止符)。我使用为iOS设备编写的客户端进行了检查。我希望避免在服务器端更改任何内容。如果不使用
readLine()
,我如何从服务器读取整个消息?根据您的问题陈述,对等方绝对不可能发送第二行终止符。不管怎样,你已经接受了另一个答案,说它不是
readLine()
不是JDK中唯一的读取方法。很抱歉,我将行终止符与用于指示套接字必须关闭的单词terminator混淆了。我的错,谢谢。我将尝试
BufferedReader.read()
并报告它是否有效。非常感谢。事实就是这样!很高兴这有帮助。干杯。有点我现在使用
while((value=br.read())!=-1){char c=(char)value;}
看起来仍然没有退出循环。虽然它确实读取终止符。@IgorTupitsyn如果您得到了行终止符,顺便说一句,这仍然是不可能的,您应该在该点退出读取循环。这是显而易见的吗?谢谢。我将尝试
BufferedReader.read()
并报告它是否有效。非常感谢。事实就是这样!很高兴这有帮助。干杯。有点我现在使用
while((value=br.read())!=-1){char c=(char)value;}
看起来仍然没有退出循环。虽然它确实读取终止符。@IgorTupitsyn如果您得到了行终止符,顺便说一句,这仍然是不可能的,您应该在该点退出读取循环。这是显而易见的吗?