PHP socket编程

1、集成于内核的socket
这个系列的函数仅仅只能做主动连接无法实现端口监听相关的功能。而且在4.3.0之前所有socket连接只能工作在阻塞模式下。
此系列函数包括
fsockopen,pfsockopen
这两个函数的具体信息可以查询php.net的用户手册
他们均会返回一个资源编号对于这个资源可以使用几乎所有对文件操作的函数对其进行操作如fgets(),fwrite(), fclose()等单注意的是所有函数遵循这些函数面对网络信息流时的规律,例如:
fread() 从文件指针 handle 读取最多 length 个字节。 该函数在读取完 length 个字节数,或到达 EOF 的时候,或(对于网络流)当一个包可用时就会停止读取文件,视乎先碰到哪种情况。
可以看出对于网络流就必须注意取到的是一个完整的包就停止。

2、就是偶看到的socket.so/socket.dll了
php4.x 以后有这么一个模块extension=php_sockets.dll,Linux上是一个extension=php_sockets.so。
当打开这个此模块以后就意味着php拥有了强大的socket功能,包括listen端口,阻塞及非阻塞模式的切换,multi-client 交互式处理等这个系列的函数列表参看http://www.php.net/manual/en/ref.sockets.php

server_socket

server_socket

set_time_limit(0);
$address = ‘127.0.0.1’;
$port = ‘2046’;
$sock = socket_create(AF_INET,SOCK_STREAM,SOL_TCP) or die(“socket_create()失败的原因是”.socket_strerror(socket_last_error()).” ”);
socket_set_block($sock) or die(“socket_set_block()失败的原因”.socket_strerror(socket_last_error()).” ”);
$result = socket_bind($sock,$address,$port) or die(“sock_bind()失败的原因是:”.socket_strerror(socket_last_error()).” ”);
$result = socket_listen($sock,4) or die(“socket_listen失败的原因是:”.socket_strerror(socket_last_error()).” ”);
echo “ok Bind the socket on $address:$port……”;
echo “ok Now ready to accept connections. Listening on the socket……”;
do{
$msgsock = socket_accept($sock) or die(“socket_accept()失败的原因是:”.socket_strerror(socket_last_error()).” ”);
$buf = socket_read($msgsock,8192);
echo “Recieved msg:$buf ”;
$msg = “welcome ”;
socket_write($msgsock,$msg,strlen($msg)) or die(“socket_write()失败的原因是”.socket_strerror(socket_last_error()).” ”);
socket_close($msgsock);
}while(true);
socket_close($sock);
client_socket

client_socket

<?php
set_time_limit(0);
$host = “127.0.0.1”;
$port = ‘2046’;
$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP) or die(“socket_create()失败的原因:”.socket_strerror(socket_last_error()).” ”);
$connetcion = socket_connect($socket,$host,$port) or die(“socket_connect()失败的原因:”.socket_strerror(socket_last_error()).” ”);
socket_write($socket,”hello i am the client”) or die(“socket_write()失败的原因:”.socket_strerror(socket_last_error()).” ”);
while($buff = socket_read($socket,1024,PHP_NORMAL_READ)){
echo “server response was:$buff ”;
}
socket_close($socket);
?>server_socket.php是服务器端,创建一个socket连接,并绑定在2046端口监听
server_socket_listening

server_socket_listening


运行后,可以看到2046端口正在监听了
listening

listening


client_socket.php是客户端,连接服务器端,并像服务器端发送一句i am the client等待服务器端响应返回数据
client

client


再来看看服务器在接收到client端后
server

server


socket还能模拟post get等请求,smtp等等,要熟悉这些协议,就可以做很多很多事了。不过,貌似看到一句话,php虽然有socket功能,但是据说是,不稳定,最好还是用c java这样的来写socket编程,实际工作中也木有用过,也不造这个是不是真的,不过php一个脚本语言,十有八九可能真是这样的吧。希望以后有机会,可以得出我自己的亲身体验。
 

评论

目前评论:0   

点击加载更多评