无法从套接字响应中读取行 break/carriage return
Cannot read line break/carriage return from socket response
我正在通过 telnet 连接向 TP-LINK 无线路由器发送设置命令:
Trying 1.2.3.4...
Connected to 1.2.3.4.
Escape character is '^]'.
*HELLO*$$$
CMD
factory RESET
factory RESET
Set Factory Defaults
<4.00> set sys autoconn 0
set sys autoconn 0
AOK
<4.00>
...
我有一个 PHP 代码,它执行命令的发送并使用套接字获取响应:
socket_write($socket, "factory RESET\r"); // send command
$response = socket_read($socket, 256); // get response
PHP 工作正常。 $response
变量包含:
factory RESET
Set Factory Defaults
但是使用 Java 我遇到了问题。使用 BufferedReader
对象读取响应,我可以获得第一行内容。但我无法获得以下几行:
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// ...
bw.write("factory RESET");
bw.newLine();
bw.flush();
// ...
StringBuilder sb = new StringBuilder();
String s;
while ((s = br.readLine()) != null) {
sb.append(s);
}
我可以得到第一行的内容,但是二读没有继续,也没有抛出异常...
如果我使用 read
函数,则只返回第一行:
char[] buffer = new char[256];
br.read(buffer, 0, 256);
String response = new String(buffer); // response is "factory RESET"
有什么问题?
您的 PHP 代码执行两次读取。您的 Java 代码尝试读取直到流结束,这仅在对等方关闭连接时发生。读一遍。
Telnet 协议中的行分隔符定义为 \r\n
,除非您使用的是二进制模式,而您不是。不像 \r
或 BufferedWriter
在您的平台上可能做的任何事情。
我正在通过 telnet 连接向 TP-LINK 无线路由器发送设置命令:
Trying 1.2.3.4...
Connected to 1.2.3.4.
Escape character is '^]'.
*HELLO*$$$
CMD
factory RESET
factory RESET
Set Factory Defaults
<4.00> set sys autoconn 0
set sys autoconn 0
AOK
<4.00>
...
我有一个 PHP 代码,它执行命令的发送并使用套接字获取响应:
socket_write($socket, "factory RESET\r"); // send command
$response = socket_read($socket, 256); // get response
PHP 工作正常。 $response
变量包含:
factory RESET
Set Factory Defaults
但是使用 Java 我遇到了问题。使用 BufferedReader
对象读取响应,我可以获得第一行内容。但我无法获得以下几行:
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// ...
bw.write("factory RESET");
bw.newLine();
bw.flush();
// ...
StringBuilder sb = new StringBuilder();
String s;
while ((s = br.readLine()) != null) {
sb.append(s);
}
我可以得到第一行的内容,但是二读没有继续,也没有抛出异常...
如果我使用 read
函数,则只返回第一行:
char[] buffer = new char[256];
br.read(buffer, 0, 256);
String response = new String(buffer); // response is "factory RESET"
有什么问题?
您的 PHP 代码执行两次读取。您的 Java 代码尝试读取直到流结束,这仅在对等方关闭连接时发生。读一遍。
Telnet 协议中的行分隔符定义为
\r\n
,除非您使用的是二进制模式,而您不是。不像\r
或BufferedWriter
在您的平台上可能做的任何事情。