第二个套接字写入似乎没有发送到网络
Second socket write does not appear to send to network
我正在创建一个简单的网络客户端。它读取一个文本文件并将每一行放到网络上。
在远端,有一个服务器读取传入的行并用 CSV 文本行进行响应。
我用于测试的传出文件很简单:
6216448319,理查德·尼克松,登录
6216448319,理查德尼克松,注销
响应应该是,"Logged In." 后跟 "Logged Out."
第一行处理完美,但尽管第二行似乎已写入套接字,但服务器从未看到传入消息。我已尽最大努力按照在线文档和各种教程进行操作,但我所看到的似乎都没有表现出相同的行为。我错过了什么?
如果我在自己的文件中发送每一行,服务器会正确响应。
protected Integer call() {
LOG.info("Starting spooler for file {}, address {}:{}", spoolFile, ipAddress, port);
InetAddress server = null;
try {
server = InetAddress.getByName(ipAddress);
LOG.info("IP Address: {}", server.getHostAddress());
} catch (Exception e) {
LOG.error("Unknown host: {}", ipAddress, e);
}
try (Socket socket = new Socket(server, port);
BufferedWriter socketWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//PrintWriter socketWriter = new PrintWriter(socket.getOutputStream(), true);
BufferedReader socketReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedReader fileReader = new BufferedReader(new InputStreamReader(new FileInputStream(spoolFile)))
) {
// Read the spool file line by line and put it out on the wire.
String line;
while ((line = fileReader.readLine()) != null) {
if (isCancelled()) {
LOG.error("Spool has been cancelled.");
break;
}
line = line.trim();
LOG.info("OUT({}): [{}]", line.length(), line);
//Wait until the channel has successfully written out the line.
LOG.info("Socket is {} for write.", socket.isConnected() ? "connected" : "not connected");
socketWriter.write(line);
socketWriter.flush();
TalkmanMessage outMessage = new TalkmanMessage(line);
outMessageList.add(outMessage);
// Wait for the network to respond.
// Apparently, readline() blocks until a message is received.
LOG.info("Waiting for response...");
LOG.info("Socket is {} for read.", socket.isConnected() ? "connected" : "not connected");
String msg = socketReader.readLine();
LOG.info("IN({}): [{}]", msg == null ? null : msg.length(), msg);
TalkmanMessage inMessage = new TalkmanMessage(msg);
inMessage.setDelay(
Duration.between(outMessage.getTime(), inMessage.getTime()).toNanos());
inMessageList.add(inMessage);
//The readline() seems to leave a non-printing byte in the socket. Read that out.
int leftOver;
do {
LOG.info("Socket is {} for EOL", socket.isConnected() ? "connected." : "not connected");
leftOver = socketReader.read();
LOG.info("Read {} from socket.", leftOver);
} while (leftOver > -1);
}
} catch (Exception e) {
LOG.error("Unable to read from file/write to .", e);
}
return 1;
}
日志命令产生以下输出:
OUT(29): [6216448319,Richard Nixon,Log In]
Socket is connected for write.
Waiting for response...
Socket is connected for read.
IN(12): ["Logged in."]
Socket is connected for EOL
Read 13 from socket. S
Socket is connected for EOL
Read 10 from socket.
Socket is connected for EOL
Read -1 from socket.
OUT(30): [6216448319,Richard Nixon,Log Out]
Socket is connected for write.
Waiting for response...
Socket is connected for read. IN(null): [null]
Socket is connected for EOL
Read -1 from socket.
您忽略了流的结尾。一旦 read()
返回 -1,连接将关闭。
你一直在测试是错误的socket.isConnected()
。它不会神奇地变成假的。这不是对端断开连接的测试。
确定你应该写 行 给同行?即在发送每一行后调用 newLine()
?
事实上,你应该只复制 字节 ,而不是读取行、removing/restoring 行终止符、修剪等。对于流,不是读者和作家。
如果您正在假脱机,为什么您希望每一行都有响应?假脱机的本质是你只是写。返回的数据(下方)绝不表明这是每行的响应。
您似乎正在尝试阅读已被 newLine()
删除的 EOL。请参阅Javadoc。这没有意义。而且你还试图通过阅读直到流结束,在你发送的每一行上,这更没有意义。
服务器给您发送的内容如下:
IN(12): ["Logged in."]<some line terminator, probably but not certainly CR LF because of below>
S <CR><LF>
然后它关闭了连接。
我建议您需要彻底审查申请协议。
我正在创建一个简单的网络客户端。它读取一个文本文件并将每一行放到网络上。 在远端,有一个服务器读取传入的行并用 CSV 文本行进行响应。
我用于测试的传出文件很简单:
6216448319,理查德·尼克松,登录
6216448319,理查德尼克松,注销
响应应该是,"Logged In." 后跟 "Logged Out."
第一行处理完美,但尽管第二行似乎已写入套接字,但服务器从未看到传入消息。我已尽最大努力按照在线文档和各种教程进行操作,但我所看到的似乎都没有表现出相同的行为。我错过了什么?
如果我在自己的文件中发送每一行,服务器会正确响应。
protected Integer call() {
LOG.info("Starting spooler for file {}, address {}:{}", spoolFile, ipAddress, port);
InetAddress server = null;
try {
server = InetAddress.getByName(ipAddress);
LOG.info("IP Address: {}", server.getHostAddress());
} catch (Exception e) {
LOG.error("Unknown host: {}", ipAddress, e);
}
try (Socket socket = new Socket(server, port);
BufferedWriter socketWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//PrintWriter socketWriter = new PrintWriter(socket.getOutputStream(), true);
BufferedReader socketReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedReader fileReader = new BufferedReader(new InputStreamReader(new FileInputStream(spoolFile)))
) {
// Read the spool file line by line and put it out on the wire.
String line;
while ((line = fileReader.readLine()) != null) {
if (isCancelled()) {
LOG.error("Spool has been cancelled.");
break;
}
line = line.trim();
LOG.info("OUT({}): [{}]", line.length(), line);
//Wait until the channel has successfully written out the line.
LOG.info("Socket is {} for write.", socket.isConnected() ? "connected" : "not connected");
socketWriter.write(line);
socketWriter.flush();
TalkmanMessage outMessage = new TalkmanMessage(line);
outMessageList.add(outMessage);
// Wait for the network to respond.
// Apparently, readline() blocks until a message is received.
LOG.info("Waiting for response...");
LOG.info("Socket is {} for read.", socket.isConnected() ? "connected" : "not connected");
String msg = socketReader.readLine();
LOG.info("IN({}): [{}]", msg == null ? null : msg.length(), msg);
TalkmanMessage inMessage = new TalkmanMessage(msg);
inMessage.setDelay(
Duration.between(outMessage.getTime(), inMessage.getTime()).toNanos());
inMessageList.add(inMessage);
//The readline() seems to leave a non-printing byte in the socket. Read that out.
int leftOver;
do {
LOG.info("Socket is {} for EOL", socket.isConnected() ? "connected." : "not connected");
leftOver = socketReader.read();
LOG.info("Read {} from socket.", leftOver);
} while (leftOver > -1);
}
} catch (Exception e) {
LOG.error("Unable to read from file/write to .", e);
}
return 1;
}
日志命令产生以下输出:
OUT(29): [6216448319,Richard Nixon,Log In]
Socket is connected for write.
Waiting for response...
Socket is connected for read.
IN(12): ["Logged in."]
Socket is connected for EOL
Read 13 from socket. S
Socket is connected for EOL
Read 10 from socket.
Socket is connected for EOL
Read -1 from socket.
OUT(30): [6216448319,Richard Nixon,Log Out]
Socket is connected for write.
Waiting for response...
Socket is connected for read. IN(null): [null]
Socket is connected for EOL
Read -1 from socket.
您忽略了流的结尾。一旦
read()
返回 -1,连接将关闭。你一直在测试是错误的
socket.isConnected()
。它不会神奇地变成假的。这不是对端断开连接的测试。确定你应该写 行 给同行?即在发送每一行后调用
newLine()
?事实上,你应该只复制 字节 ,而不是读取行、removing/restoring 行终止符、修剪等。对于流,不是读者和作家。
如果您正在假脱机,为什么您希望每一行都有响应?假脱机的本质是你只是写。返回的数据(下方)绝不表明这是每行的响应。
您似乎正在尝试阅读已被
newLine()
删除的 EOL。请参阅Javadoc。这没有意义。而且你还试图通过阅读直到流结束,在你发送的每一行上,这更没有意义。服务器给您发送的内容如下:
IN(12): ["Logged in."]<some line terminator, probably but not certainly CR LF because of below> S <CR><LF>
然后它关闭了连接。
我建议您需要彻底审查申请协议。