Java:客户端套接字不读取第二行,在终止符行之后保持打开状态
在网上读了几十个例子之后,我仍然被这个问题困扰着 我将java客户端的消息发送到C++中的服务器。收到握手信息后,服务器发回以下数据: “0000:1111:2222:3333:4444 结束\u连接\u数据“ 客户端读取最后一行(终止符)后,应立即关闭连接 我就是这样做的: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 =
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如果您得到了行终止符,顺便说一句,这仍然是不可能的,您应该在该点退出读取循环。这是显而易见的吗?