TCP通信socket缓存读取阻塞

来源:互联网 发布:mysql默认事务隔离级别 编辑:程序博客网 时间:2024/06/05 19:27

tcp通信——socket缓存读取阻塞

TCP通信过程,主要是数据的收发,最近一直在学习这方面的知识,其中有很多的细节部分确实是没有接触到,即便是一个小小的知识点,也会导致编程半天没有进展,需要查找很多的资料来解决这方面的问题,以下就来谈谈我在编程中所遇到的问题:
tcp通信程序,包括服务器和客户端,程序编写完成后就会问题,调试的时候。我要进行的工作是把单片机当做服务器,计算机当做客户端来接收从单片机发来的内容,由于通信定义的发送结束标志不一致,所以也就导致我在主机客户端这边接收总是有问题:
我开始使用的是readline的方式来读取缓存上的内容,然后发现出现的问题如果从单片机发来的内容不是以\r\n结尾的话,在主机客户端上是收不到内容的,这样我就不得不来重新定义单片上的发送程序。当然,如果这个程序是我自己写的也就罢了,但是程序的发送并不是全部都按照这样个形式,如果我来改的话这将是一个很大的工程,于是我只能另想方法来解决这个问题。就有了下面的问题。
使用read的方式来读取缓存上的内容,其实我最想说的就是这个问题,这个问题真的困扰了我好几天的时间,真的找到解决办法还是在网上,关于bufferreader中的read方法有好几种,我基本上把每一种都试了一遍,但是都不能解决我的问题。先说一说我所尝试的情况:开始使用的是read(cbuf,off,len)存放的是字符串数组、偏移、字符串的长度,从我尝试的情况来看,当接收的数据为多行数据时,即接收的数据多次发送过来,但是每次发送的某位均以\r\n来结尾,这就会导致,这种read方法只能读取第一行的数据,剩下的无法读出来,这样就真的很尴尬,也很无奈,于是乎,因为这不是我想要的结果,我先要的结果是,全部读出来。
于是这能再重新找另外的方法,我只能用read,但是又让我很崩溃的是他无法返回我所要的值就是那个读完之后要返回的-1,不返回我的程序就会一直执行,跳不出来,从网上找到的结果是这种方式建立的缓存,是不会返回-1的,因为程序默认的是这种缓存即便是内容被读完也不会结束,它会阻塞着一直读取缓存中的内容,只要连接存在,要不就是主动的关闭缓存或者是socket
int b;while((b=buf.read())!=-1){System.out.print((char)b);}

这是代码,程序会一直阻塞在这里一直接受内容,我测试过,就是定时一直从单片机端发送内容,让后结果是它一直可以接收到。

看到网上的一个解决办法,就是使用定时的形式,定时如果在2s内接收程序没有执行结束,就跳出循环,结束程序
long start=System.currentTimeMillis();long end = 0;while((start-end<2000)&&(b=buf.read())!=-1){System.out.print((char)b);end=System.currentTimeMillis();}

虽然没有完美的解决,但是至少可以跳出来了,还有一个解决的方法是使用线程,原理基本一样,可以规定这个线程执行多长时间,如果再次发送数据接再起启动一个线程,使用多线程来完成,虽然麻烦了一点,但是也是一个不错的解决办法。
原创粉丝点击