如何通过socket进行大量返回信息的读取

        我们知道,TCP协议本身一个流的协议,信息之间是没有边界的,均是字节为单位的流,在使用php进行读取socket返回的时候,根据我们的应用场景,可能只需要读取一行返回即可,此时我们非常简单调用如下API即可实现:

 

    

 

API说明:

    string fgets ( int handle [, int length])
  

   从 handle 指向的文件中读取一行并返回长度最多为 length - 1 字节的字符串。碰到换行符(包括在返回值中)、EOF 或者已经读取了 length - 1 字节后停止(看先碰到那一种情况)。如果没有指定 length,则默认为 1K,或者说 1024 字节。

出错时返回 FALSE

 

   如果在读取的过程中,需要捕捉对应的读取是否超时,则可以调用:

  

 

    在实际的应用当作,server返回的信息往往不是简单一号,而是一个有格式的大串,百日返回一篇文章,各个段落之间是有换行的,或者返回一个json 串,每个json的字串是有换行符,这种情况下,我们是不能直接用fgets进行读取的,否则只能读取到第一行,其他的内容将会被截断。

    我们可以使用另外指定结束符的读取API:

    string stream_get_line ( resource handle, int length, string ending)
   

    Returns a string of up to length bytes read from the file pointed to by handle. Reading ends when length bytes have been read, when the string specified by ending is found (which is notincluded in the return value), or on EOF (whichever comes first). If an error occurs, returns FALSE.

    通过我们指定自己的ending串,我们就可以读取整段的内容,demo如下:

   

    但请注意:这里的读取其实每次只返回read buffer读取到的内容而已,对json串的返回,有可能读取一次是无法读取全数据,因此需要进行循环读取。

  

   直到读取的unread_btyes=0为止,当然这里的更加严谨的做法应该是加入超时的判断。

 

在Java中,通过SocketInputStream可以从网络上的一个Socket连接中读取数据。有时候,接收到的数据可能会很大,无法一次性读取完毕。这时候就需要进行分段读取SocketInputStream类提供了多个read()方法,其中一个允许我们指定一个byte数组作为缓冲区,来一次性读取多个字节。我们可以使用一个循环来重复调用read()方法,每次读取一部分数据,直到读完所有的数据为止。 示例代码如下: ``` Socket socket = new Socket("127.0.0.1", 8080); InputStream inputStream = socket.getInputStream(); byte[] buffer = new byte[1024]; // 缓冲区大小 int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { // 对已读取的字节进行处理 processBytes(buffer, bytesRead); } ``` 在上面的代码中,首先创建了一个Socket对象,并通过getInputStream()方法获取到与该Socket连接关联的输入流。然后创建了一个大小为1024的byte数组作为缓冲区。 接下来,使用一个循环来反复调用read()方法,每次读取一部分数据。read()方法返回的是实际读取的字节数,如果返回-1,则表示已经读取完所有数据。 在循环内部,可以对已经读取的字节进行处理,例如将其写入文件或进行其他操作。 需要注意的是,由于网络延迟等原因,可能并不是每次都能读取到完整的数据块。因此,我们需要自己维护一个缓冲区,确保已读取的数据是完整的。 总结来说,通过使用SocketInputStream的read()方法,我们可以实现分段读取数据,将接收到的大数据分成小块进行处理。这样可以避免一次性读取大量数据造成内存占用过高的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值