繁体   English   中英

从套接字的InputStream读取

[英]Reading from an InputStream of a Socket

我有一个从W&T到COM-Server ++的套接字连接,该套接字已连接到Internet,并且还通过串行到USB连接到了我的PC。

用于TCP出站通信的COM服务器的设置为:

激活。 数据包选项:禁用
灭活。 超时时间:00030
连接。 超时时间:00300
断开Char:000
客户端:“ C” + Addr:已禁用
响应模式:禁用

在我的应用程序中,我像这样读取该服务器的传入数据:

    boolean running = true;
log.info( "{0}: Starting to listen for input data", name );
while ( running )
{
  try
  {
    int charsRead = inputStream.read( buffer );

    if ( charsRead < 0 )
    {
      running = false;
    }
    else
    {
      byte[] received = Arrays.copyOf( buffer, charsRead );
      /** TODO: Call interface of protocol here */
      log.info( "{0}: data received: {1}", connection.getName(), new String( received ) );
    }
  }
  catch ( IOException ie )
  {
    setStatus( ConnectionStatus.FAILURE );
    close();
    /** TODO: Exception handling */
    running = false;
  }
}

如果我从设备发送: test<CR><LF>我得到的日志输出是:

(terminal1) terminal1: data received: t
(terminal1) terminal1: data received: e
(terminal1) terminal1: data received: st
(terminal1) terminal1: data received: 
(terminal1) terminal1: data received: 

但是,所需的输出是:

(terminal1) terminal1: data received: test  

我的错误在哪里,或者我假设InputStream的read方法的工作流程错误?

一个简单的解决方案如下所示:

StringBuilder sb = new StringBuilder();

int c;

while ( (( c = inputStream.read() ) >= 0) && (c != 0x0a /* <LF> */) ) {
  if ( c != 0x0d /* <CR> */ ) {
    sb.append( (char)c );
  } else {
    // Ignore <CR>.
  }
}

return sb.toString();

该代码一直读取字节,直到找到行的末尾(或流的末尾)为止,并通过<LF>发出信号。

我们期望<CR><LF> ,其中<CR>是行分隔符的一部分,因此我们在收集所有其他字节时将忽略任何<CR>

我不完全了解这个图书馆。 但是流返回返回的内容,没有人能确保它实际上是全部。...这可能解决了您的问题: 如何在Server Socket JAVA中读取所有Inputstream

编辑:您也可以尝试使用ObjectInputStream(如果可能)来获取String作为对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM