Java 从套接字的输入流读取

Java 从套接字的输入流读取,java,sockets,serial-port,Java,Sockets,Serial Port,我有一个从W&T到的插座连接,它连接到internet,也通过串行到USB连接到我的电脑 用于TCP出站通信的COM服务器设置为: 行动。数据包选项:禁用不活动。超时:00030 连接超时:00300断开连接字符:000客户端: “C”+地址:禁用响应模式:禁用 在我的应用程序中,我读取此服务器的传入数据,如下所示: boolean running = true; log.info( "{0}: Starting to listen for input data", name ); wh

我有一个从W&T到的插座连接,它连接到internet,也通过串行到USB连接到我的电脑

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

行动。数据包选项:禁用
不活动。超时:00030
连接超时:00300
断开连接字符:000
客户端: “C”+地址:禁用
响应模式:禁用

在我的应用程序中,我读取此服务器的传入数据,如下所示:

    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;
  }
}
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();
然而,所需的输出是:

(terminal1) terminal1: data received: test  

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

我不太清楚这个库。但是流返回它所得到的,并且没有人确保它实际上是它的全部。。。 这可能会解决您的问题:


编辑:您还可以尝试使用ObjectInputStream(如果可能)将字符串作为对象获取。

我不太清楚这个库。但是流返回它所得到的,并且没有人确保它实际上是它的全部。。。 这可能会解决您的问题:


编辑:您还可以尝试使用ObjectInputStream(如果可能)将字符串作为对象获取。

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

    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;
  }
}
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();
StringBuilder sb=新建StringBuilder();
INTC;
而(((c=inputStream.read())>=0)和&(c!=0x0a/**/){
如果(c!=0x0d/**/){
sb.附加((char)c);
}否则{
//忽略。
}
}
使某人返回字符串();
此代码一直在读取字节,直到找到一行的结尾(或流的结尾),由
发出信号


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

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

    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;
  }
}
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();
StringBuilder sb=新建StringBuilder();
INTC;
而(((c=inputStream.read())>=0)和&(c!=0x0a/**/){
如果(c!=0x0d/**/){
sb.附加((char)c);
}否则{
//忽略。
}
}
使某人返回字符串();
此代码一直在读取字节,直到找到一行的结尾(或流的结尾),由
发出信号



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

public abstract int read()抛出IOException从输入流读取下一个字节的数据
public int read(byte[/b)抛出IOException从输入流读取一定数量的字节Oh ok,这样他直到最后才读取。从技术上讲,等待while完成,然后注销缓冲区将返回理想的结果,对吗?只需将读取的内容附加到数组中,直到数组结束,这就是简单的答案:流只提供字节传输。除此之外的任何事情,如将消息映射到字节和从字节映射消息,都需要在此基础上实现。这就像确保每个“消息”都以换行符结尾一样简单(当“消息”是单行文本时)。public abstract int read()抛出IOException从输入流中读取下一个字节的数据
public int read(byte[]b)抛出IOException从输入流中读取一些字节Oh ok,这样他直到最后才读取。从技术上讲,等待while完成,然后注销缓冲区将返回理想的结果,对吗?只需将读取的内容附加到数组中,直到数组结束,这就是简单的答案:流只提供字节传输。除此之外的任何事情,如将消息映射到字节和从字节映射消息,都需要在此基础上实现。这就像确保每个“消息”都以换行符结尾一样简单(当“消息”是一行文本时)。我只是使用
java.net.Socket
,这个套接字有一个您得到的InputStream,类是
java.io.InputStream
,所以它基本上是普通java。我只是想为那些可能知道更具体问题的人提供COM服务器信息。我将看一看前面提到的方法。我刚刚检查了它,但函数readFully()对我不可用。我刚读过read(),read(byte[]),skip,reset,close和read(byte[],int,int)…Eclipse和文档告诉我它是java.io.InputStream…@kleopi:请在评论之前检查好的,很抱歉我可能弄错了。然而,为了进一步参考,我发现:ObjectInputStream是不可能的,因为我有一个普通的tcp通信,它将在上面的一层中处理,以使用不同的协议。此流添加了一个不适合处理以供以后使用的标头。还是要感谢您的想法,我只是在使用
java.net.Socket
,这个Socket有一个您得到的InputStream,类是
java.io.InputStream
,所以它基本上是普通的java。我只是想为那些可能知道更具体问题的人提供COM服务器信息。我将看一看前面提到的方法。我刚刚检查了它,但函数readFully()对我不可用。我刚读过read(),read(byte[]),skip,reset,close和read(byte[],int,int)…Eclipse和文档告诉我它是java.io.InputStream…@kleopi:请在评论之前检查好的,很抱歉我可能弄错了。然而,为了进一步参考,我发现:ObjectInputStream是不可能的,因为我有一个普通的tcp通信,它将在上面的一层中处理,以使用不同的协议。此流添加了一个不适合处理以供以后使用的标头。仍然感谢您的想法,这正是我所需要的:)谢谢您,这是一个非常好的主意,可以使用inputStream本身进行循环。不知道为什么我没有想到那个快速的问题。我再次测试,发现流在大约30秒后关闭。我在它周围附加了另一个while循环,以便在套接字仍然连接到