page contents

php socket简单原理及实现

以下内容希望帮助到大家!

1.什么是socket?

socket:网络上的两个程序通过一个双向的通信连接实现数据的交换,连接的一端称为一个socket.

因此socket运行是置少有2个端组成,一个为服务端一个为客户端(客户端可以多个).

举例:给朋友打电话.1.先有个手机或电话 2.找到朋友号码拨号,等待朋友接电话 3.朋友听到铃声接通电话 4.这里双方都接通了可以相互交流了5.交流结束,挂电话结束.

2.socket工作原理

也类似打电话.

v2-38a3a527a43c61e93e2ab5bbc9306564_720w.jpg

3.结合打电话用代码操作一步步理解:

服务端和客户端(类似朋友和自己),下面用代码通话

-----------------------client start---------------------------------------------------------------------

先客户端(自己):

(1).创建socket (自己搞个电话先)

$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);//创建一个socket套接流

(2)连接服务端(拨通电话,等服务端朋友接电话)

socket_connect($socket,'127.0.0.1',8888) //连接服务端的套接流,这一步就是使客户端与服务器端的套接流建立联系

-----------------------client wait---------------------------------------------------------------------

切换到服务端

-----------------------server start---------------------------------------------------------------------

服务端先,初始化socket:(朋友也必须有电话才能相互通话)

1.创建socket (也给朋友搞个电话)

$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);//创建服务端的socket套接流,net协议为IPv4,protocol协议为TCP

2.绑定socket (因为下面监听前要绑定ip和端口)

socket_bind($socket,'127.0.0.1',8888)//绑定接收的套接流主机和端口,与客户端相对应

3.监听 (朋友比较牛逼,一直在监听,不管谁来电都准备秒接)

socket_listen($socket,4)//监听套接流

4.接通(朋友接通来电)

acceptresource=socketaccept(acceptresource=socketaccept(socket);//接收客户端传过来的信息

-----------------------server wait---------------------------------------------------------------------

切回客户端

-----------------------client go on ---------------------------------------------------------------------

先客户端:

(3).传输数据到服务端 (开口像朋友说话,正常交流了:朋友最近过得好吗?)

$message = " 朋友最近过得好吗?"

message=mbconvertencoding(message=mbconvertencoding(message,'GBK','UTF-8');//转为GBK编码,处理乱码问题

socket_write(socket,socket,message,strlen($message))//向服务端写入字符串信息

(4)读取服务端发回信息(听朋友回复,这里可以一直循环读取客户)

callback=socketread(callback=socketread(socket,1024)//读取服务端返回来的套接流信息

(5)结束

socket_close($socket);//交流完毕,关闭套接流

-----------------------client end---------------------------------------------------------------------


看服务端

-----------------------server go on ---------------------------------------------------------------------

5.读取客户端信息(听到了:朋友最近过得好吗?)

string=socketread(string=socketread(accept_resource,1024);//读取客户端传过来的资源,并转化为字符串

6.回复下客户端

$message = "过得很好,好得不得了";

socket_write(acceptresource,acceptresource,message,strlen($message));

7.结束

socket_close($accept_resource);

----------------------server end ---------------------------------------------------------------------

4.完整代码:

client_socket.php

<?php
    //创建一个socket套接流
    $socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
    /****************设置socket连接选项,这两个步骤你可以省略*************/
     //接收套接流的最大超时时间1秒,后面是微秒单位超时时间,设置为零,表示不管它
    socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array("sec" => 1, "usec" => 0));
     //发送套接流的最大超时时间为6秒
    socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array("sec" => 6, "usec" => 0));
    /****************设置socket连接选项,这两个步骤你可以省略*************/
    //连接服务端的套接流,这一步就是使客户端与服务器端的套接流建立联系
    if(socket_connect($socket,'127.0.0.1',8888) == false){
        echo 'connect fail massege:'.socket_strerror(socket_last_error());
    }else{
        $message = '朋友最近过得好吗?';
        //转为GBK编码,处理乱码问题,这要看你的编码情况而定,每个人的编码都不同
        $message = mb_convert_encoding($message,'GBK','UTF-8');
        //向服务端写入字符串信息
        if(socket_write($socket,$message,strlen($message)) == false){
            echo 'fail to write'.socket_strerror(socket_last_error());
        }else{
            echo 'client write success'.PHP_EOL; 
            //读取服务端返回来的套接流信息
                while($callback = socket_read($socket,1024)){
                    echo 'server return message is:'.PHP_EOL.$callback;
                }
        }
    }
    socket_close($socket);//工作完毕,关闭套接流

server_socket.php

<?php
//创建服务端的socket套接流,net协议为IPv4,protocol协议为TCP
    $socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
    /*绑定接收的套接流主机和端口,与客户端相对应*/
    if(socket_bind($socket,'127.0.0.1',8888) == false){
        echo 'server bind fail:'.socket_strerror(socket_last_error());
        /*这里的127.0.0.1是在本地主机测试,你如果有多台电脑,可以写IP地址*/
    }
    //监听套接流
    if(socket_listen($socket,4)==false){
        echo 'server listen fail:'.socket_strerror(socket_last_error());
    }
//让服务器无限获取客户端传过来的信息
do{
    /*接收客户端传过来的信息*/
    $accept_resource = socket_accept($socket);
    /*socket_accept的作用就是接受socket_bind()所绑定的主机发过来的套接流*/
    if($accept_resource !== false){
        /*读取客户端传过来的资源,并转化为字符串*/
        $string = socket_read($accept_resource,1024);
        /*socket_read的作用就是读出socket_accept()的资源并把它转化为字符串*/
        echo 'server receive is :'.$string.PHP_EOL;//PHP_EOL为php的换行预定义常量
        if($string != false){
            $return_client = 'server receive is : 朋友:过得很好,好得不得了';
            $return_client = mb_convert_encoding($return_client,'GBK','UTF-8');
            /*向socket_accept的套接流写入信息,也就是回馈信息给socket_bind()所绑定的主机客户端*/
            socket_write($accept_resource,$return_client,strlen($return_client));
            /*socket_write的作用是向socket_create的套接流写入信息,或者向socket_accept的套接流写入信息*/
        }else{
            echo 'socket_read is fail';
        }
    /*socket_close的作用是关闭socket_create()或者socket_accept()所建立的套接流*/
        socket_close($accept_resource);
    }
}while(true);
socket_close($socket);

8.运行效果

去到文件目录,按Shift键+鼠标右键,在此处打开命令窗口,打开dos窗口

1.php server_socket.php (一定要先运行服务端)

v2-612f3379f948bdd19d55134f47cf7ca1_720w.jpg

同上打开多一个窗口

2.php client_socket.php

看效果

v2-c9ca1b3055f5306a60ad5ce4877a8695_720w.jpg

3.服务端收到

v2-fc2b55d7ed3ba2b2ca2e55bde1389d30_720w.jpg

2.项目一般哪些地方用得上?

(1).服务端主动推送

网上有比较好的WEB推送框架:web-msg-sender,基于WebSocket长连接通讯,根据手册操作简单快速实现推送功能

连接:http://www.workerman.net/web-sender

(2).网页聊天

用上面的推送也可以简单实现

socket的简单的demo演示

server.php
 
$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
socket_bind($socket,'0.0.0.0',6666);
socket_listen($socket);
$sock = socket_accept($socket);
$res = socket_read($sock,2048);
echo $res;
socket_write($sock,'hello client');
 
client.php
 
$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
socket_connect($socket,'127.0.0.1',6666);
$msg = 'hlllo server';
socket_write($socket,$msg);
$res = socket_read($socket,2048);

以下内容希望帮助到大家

attachments-2020-03-9dhR7aXy5e784f04ab60a.jpg

  • 发表于 2020-03-23 13:54
  • 阅读 ( 603 )
  • 分类:PHP开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1135 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1470 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章