如何通过socket进行大量返回信息的读取
2010-11-22 19:29
253 查看
我们知道,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为止,当然这里的更加严谨的做法应该是加入超时的判断。
$buffer = fgets( $sock );
API说明:
string fgets ( int handle [, int length])
从 handle 指向的文件中读取一行并返回长度最多为 length - 1 字节的字符串。碰到换行符(包括在返回值中)、EOF 或者已经读取了 length - 1 字节后停止(看先碰到那一种情况)。如果没有指定 length,则默认为 1K,或者说 1024 字节。
出错时返回 FALSE。
如果在读取的过程中,需要捕捉对应的读取是否超时,则可以调用:
$stream_info = stream_get_meta_data( $sock ); if ( $stream_info['timed_out'] ) { echo 'socket_timed_out'; }
在实际的应用当作,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如下:
$str = stream_get_line ($obj_sock->sock, 4096, "/r/n");
但请注意:这里的读取其实每次只返回read buffer读取到的内容而已,对json串的返回,有可能读取一次是无法读取全数据,因此需要进行循环读取。
$stream_info = stream_get_meta_data( $obj_sock->sock ); while(isset($stream_info['unread_bytes']) && $stream_info['unread_bytes'] > 0){ $str .= stream_get_line ($obj_sock->sock, 4096, "/r/n"); $stream_info = stream_get_meta_data( $obj_sock->sock ); }
直到读取的unread_btyes=0为止,当然这里的更加严谨的做法应该是加入超时的判断。
相关文章推荐
- Java如何通过URL调用远程接口并读取返回信息?
- Java如何通过URL调用远程接口并读取返回信息?
- [置顶] 文本输入框校验(通过字段返回信息进行文本渲染)
- Opencv3.0-python的那些事儿:(九)、Opencv关于如何读取大量视频帧进行处理的方法
- 读取指定文件夹下的全部文件,可通过正则进行过滤,返回文件路径数组 -- 基于node的一个函数
- 直接使用XIB/NIB文件,读取信息创建 UIView [通过Nib文件进行反序列化,得到对象]
- JAVA代码:通过Socket读取返回的数据
- 如何从一个文件特定段落中(文本文件),读取相关的文件信息,并进行分段梳理
- Spring Cloud项目中通过Feign进行内部服务调用发生401\407错误无返回信息的问题
- 如何通过JQ,Ajax来实现返回到上一个页面并进行刷新
- 如何通过销售发票和日记帐事务信息进行销售交货与退货信息分析
- VB对文件进行读取信息并返回到列表框条目
- 使用jQuery匹配文档中所有的li元素,返回一个jQuery对象,然后通过数组下标的方式读取jQuery集合中第1个DOM元素,此时返回的是DOM对象,然后调用DOM属性innerHTML,读取该元素 包含的文本信息
- 如何在android环境下进行ttf解析,通过获取文件头信息得到字体名称!
- C#通过Socket读取大量数据
- JAVA代码:通过Socket读取返回的数据
- 一个完整的通过encoding/json信息传递格式,采用http.POST利用进行与服务器通信,并对返回结果进行解析处理的典型案例
- iOS开发工具-如何使用网络封包分析工具Charles,通过配置proxy对http、https、tcp、udp 等协议的请求响应过程交互信息进行分析、判断、解决我们移动开发中的遇到的各种实际问题。
- 当mysql中指定的socket路径改变时如何通过ODBC进行访问?
- android端和pc端使用usb进行socket通信,其中android是服务器端,pc是客户端。如何实现安卓端输入的数据通过按钮发送到pc端?