首页 > 代码库 > socket 初步使用

socket 初步使用

   socket分为2个部分,1部分是服务器端,监听某个接口,当有客户端有请求时,自动运行代码。

第二个部分是客户端,来传送数据。

<?php    //服务器端口
    header(‘Content-type:text/html;Charset=GBK‘);    //服务器段程序,监听借口,并进行相应的数据处理    /*        socket 服务器通信整个过程        socket_creat        socket_bind        socket_listen        socket_accetp        socket_read        socket_write        socket_close    */    //1,创建通信节点    $socket             = socket_create(AF_INET,SOCK_STREAM,0);    if(!$socket)        exit(‘create error : ‘ . socket_strerror(socket_last_error()));    //2,绑定制定端口    $ip                 = ‘127.0.0.1‘;    $port                 = ‘1935‘;    $res                 = socket_bind($socket,$ip,$port);    if(!$res)        exit(‘bind error:‘ . socket_strerror(socket_last_error()));    //3, 开始监听    $res                 = socket_listen($socket);    if(!$res)        exit(‘listen error ‘ . socket_strerror(socket_last_error()));    //4,接收一个通信,处理    do {        $msgsock         = socket_accept($socket);        if(!$msgsock)            exit(‘accetp error:‘ . socket_strerror(socket_last_error()));        //读出客户端传入的数据        $msgclient         = socket_read($msgsock, 1024);        if($msgclient === false)            exit(‘read error:‘ . socket_strerror(socket_last_error()));        echo ‘收到客户端数据:‘ . $msgclient;        //返回信息        $remsg             = ‘已经收到请求!处理完毕!123‘;        $res             = socket_write($msgsock, $remsg);        if($res === false)            exit(‘write error :‘ . socket_strerror(socket_last_error()));        //相关操作        echo ‘正在进行操作...‘;        sleep(10);        //释放资源        socket_close($msgsock);    }while(true);    //5,释放资源    socket_close($socket);
//触发端口,让服务器程序运行,端口设置为 1935    //初始化    $ip             = ‘127.0.0.1‘;    $port             = ‘1935‘;    /*        socket链接整个过程        1,socket_create        第一个参数指定应用程序使用的通信协议的协议族,对于TCP/IP协议族,该参数置AF_INET;        第二个参数指定要创建的套接字类型,流套接字类型为SOCK_STREAM、数据报套接字类型为SOCK_DGRAM、原始套接字SOCK_RAW(WinSock接口并不适用某种特定的协议去封装它,而是由程序自行处理数据包以及协议首部);        第三个参数指定应用程序所使用的通信协议。此参数可以指定单个协议系列中的不同传输协议。在Internet通讯域中,此参数一般取值为0,系统会根据套接字的类型决定应使用的传输层协议。        2,socket_connect        3,socket_write        4,socket_read        5,socket_close    */    //1,创建通信节点    $socket         = socket_create(AF_INET,SOCK_STREAM,0);    if($socket === false)        exit(‘创建节点失败!错误信息:‘ . socket_strerror(socket_last_error()));    echo ‘创建节点成功,准备链接...‘,‘<br />‘;    //2,开始链接    $res             = socket_connect($socket,$ip,$port);    if (!$res) {        exit(‘连接节点失败!失败原因:‘ . socket_strerror(socket_last_error()));    }    echo ‘链接成功!准备发送....‘,‘<br />‘;    //3,发送数据    $buffer         = ‘发送一个请求!‘ . "\r\n";    $res             = socket_write($socket, $buffer);    if($res === false)        exit(‘发送请求失败!失败原因:‘ . socket_strerror(socket_last_error()));    //4,接受服务器回传信息    $out             = socket_read($socket, 8192);    if ($out === false) {        exit(‘获取服务器回传内容失败!原因:‘ . socket_strerror(socket_last_error()));    }    if ($out)        echo ‘获取到服务器回传内容--><strong style="color:red">‘ . $out . ‘</strong>‘;    else         echo ‘服务器没有回传内容!‘;    //关闭链接    socket_close($socket);

运行后发现缺点,就是还是单进程的。

当服务器运行速度很慢时候,会造成客户端长时间的等待。不利于用户体验。

目前自己的想法是就要利用php实现多进程来配合使用,多进程的实现为一般有两种方法,一种是使用PHP自带的pcntl_*函数(仅限linux),另一种就是使用popen/proc_open,然后在php内部控制进程数量。

明天进行研究。(linux下使用fork。)

目前只是简单的了解并且使用。