代码之家  ›  专栏  ›  技术社区  ›  M. Teasdale

第二次套接字写入似乎没有发送到网络

  •  0
  • M. Teasdale  · 技术社区  · 7 年前

    我正在创建一个简单的网络客户端。它读取一个文本文件,并将每一行放入网络。 在远端,有一个服务器,它读取输入行并用CSV文本行响应。

    我用于测试的传出文件很简单:


    6216448319,理查德·尼克松,注销

    响应应为“已登录”然后是“注销”

    如果我在自己的文件中发送每一行,服务器将正确响应。

    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.
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   user207421    7 年前
    1. 你忽略了流的尽头。一旦 read() 已返回-1,连接已关闭。

    2. socket.isConnected() . 它不会神奇地变成假的。这不是对对等断开连接的测试。

    3. 当然你应该写信 线 对同行?i、 e.呼叫 newLine() 在发送每一行之后?

    4. 字节数

    5. 如果你在后台处理,为什么每一行都会收到回复?后台处理的本质是你只需要写。返回的数据(如下)并不表明这是每行的响应。

    6. 您似乎正在尝试阅读EOL,它已被删除 . 请参阅Javadoc。这没有道理。你们也在努力做到这一点,在你们发送的每一行上,阅读到流的末尾,这就更有意义了。

    7. IN(12): ["Logged in."]<some line terminator, probably but not certainly CR LF because of below>
      S <CR><LF>
      

      然后它关闭了连接。

    我建议您需要彻底检查应用程序协议。