• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

实例详解php的socket编程

php 搞代码 4年前 (2022-01-22) 34次浏览 已收录 0个评论

关于socket编程所涉及到的网络协议,什么TCP啊,UDP啊,什么socket三次握手等等,这些网络协议网上有很详细的解释,这里不讲,只截个socket建立套接的过程图让你瞧瞧:

                  

    这个图是我辛辛苦苦从别人那里盗截过来的,你一定要好好看啊,同时,在这里我也向那个被我盗截图的笔者表示感谢,本人对自己盗取你的图案表示歉意,还望你大人大量不要计较啊。本人实在太懒了,懒得画图,(其实是对自己的画图技术表示不自信,呵呵)。

    socket是怎么本¥文来源gaodai$ma#com搞$代*码*网(搞代gaodaima码建立连接的呢?上面已经提到过了,它建立连接的过程是与mysql的客户端和服务端的连接本质是一样的。而它与mysql不同的是,mysql的服务端和客户端都已经为我们编辑好了,我们只要应用就行了。但是,关键时刻来啦,socket它什么东西都没有提供给我们,唯一提供给我们的就是:几十个socket函数。

    这言外之意就是说,socket编程就是要我们自己创建服务端和客户端,也就是说,“socket编程“——就是要我们自己建立一个类似于mysql的服务端和客户端的应用。

    说到这里,我想问一句,你说这socket让人头疼不?它既不建立个服务端,也不建立个客户端给我们应用,非要让我们自己去应用socket的函数,创建一个属于我们自己的网络协议套接应用,这是不是很让你头疼呢?头疼也没办法,要是你需要自己的应用,你还是不得不跟socket打交道。呵呵,这只是题外话,不多说,下面进入正题。

    在你没有被socket编程搞蒙之前,我还是让你看看socket的几个关键函数,先给你解释一下它们各自的作用。不然,要是对socket编程一点基础都没有的人看到了,我怕你看了之后,就果断跳过这篇文章,从此对socket产生恐惧症了。呵呵,又多说了。

    socket的关键函数1

     socket_create($net参数1$stream参数2$protocol参数3)

    作用:创建一个socket套接,说白了,就是一个网络数据流

    返回值:一个套接字,或者是false,参数错误发出E_WARNING警告

    php的在线手册那里说得更清楚:

    socket_create创建并返回一个套接字,也称作一个通讯节点。一个典型的网络连接由 2 个套接字构成,一个运行在客户端,另一个运行在服务器端。

上面一句话是从php在线手册那里复制过来的。看到没有,这里说得意思是不是和我上面反反复复提到的客户端与服务端一模一样?呵呵。

    参数1是:网络协议,

    网络协议有哪些?它的选择项就下面这三个:

    AF_INET:   IPv4 网络协议。TCP UDP 都可使用此协议。一般都用这个,你懂的。

    AF_INET6:   IPv6 网络协议。TCP UDP 都可使用此协议。

    AF_UNIX:   本地通讯协议。具有高性能和低成本的 IPC(进程间通讯)。

    参数2:套接字流,选项有:

    SOCK_STREAM  SOCK_DGRAM  SOCK_SEQPACKET  SOCK_RAW  SOCK_RDM

    这里只对前两个进行解释:

    SOCK_STREAM  TCP 协议套接字。

    SOCK_DGRAM   UDP协议套接字。

    欲了解更多请链接这里:http://php.net/manual/zh/function.socket-create.php

    参数3protocol协议,选项有:

    SOL_TCP:  TCP 协议。

    SOL_UDP:  UDP协议。

    从这里可以看出,其实socket_create函数的第二个参数和第三个参数是相关联的。

    比如,假如你第一个参数应用IPv4协议:AF_INET,然后,第二个参数应用的是TCP套接字:SOCK_STREAM

    那么第三个参数必须要用SOL_TCP这个应该不难理解。

    TCP 协议套接字嘛,当然只能用TCP协议了,是不是?如果你应用UDP套接字,那么第三个参数该怎么选择我就不说了,呵呵,你懂的。

    关键函数2

    socket_connect($socket参数1,$ip参数2,$port参数3)

    作用:连接一个套接字,返回值为true或者false

    参数1socket_create的函数返回值

    参数2ip地址

    参数3:端口号

    关键函数3

    socket_bind($socket参数1,$ip参数2,$port参数3)

    作用:绑定一个套接字,返回值为true或者false

   参数1socket_create的函数返回值

    参数2ip地址

    参数3:端口号

    关键函数4

    socket_listen($socket参数1,$backlog 参数2)

    作用:监听一个套接字,返回值为true或者false

    参数1socket_create的函数返回值

    参数2最大监听套接字个数

    关键函数5

    socket_accept($socket)

    作用:接收套接字的资源信息,成功返回套接字的信息资源,失败为false

   参数:socket_create的函数返回值

    关键函数6

    socket_read($socket参数1,$length参数2)

    作用:读取套接字的资源信息,

    返回值:成功把套接字的资源转化为字符串信息,失败为false

    参数1:socket_create或者socket_accept的函数返回值

    参数2:读取的字符串的长度

    关键函数7

    socket_write($socket参数1$msg参数2$strlen参数3)

    作用:把数据写入套接字中

    返回值:成功返回字符串的字节长度,失败为false

    参数1socket_create或者socket_accept的函数返回值

    参数2:字符串

    参数3:字符串的长度

    关键函数8

    socket_close($socket)

    作用:关闭套接字

    返回值:成功返回true,失败为false

   参数:socket_create或者socket_accept的函数返回值

    这八个函数是socket的核心函数,下面列举两个个比较重要的函数

    socket_last_error($socket),参数为socket_create的返回值,作用是获取套接字的最后一条错误码号,返回值套接字code

    socket_strerror($code),参数为socket_last_error函数的返回值,获取code的字符串信息,返回值也就是套接字的错误信息

    这两个函数在socket编程中还是很重要的,在写socket编程的时候,我觉得你还是得利用起来,特别是新手,可以当做调试用

    

    下面就是代码了,注意注意,请认真看我的注释,注释很重要,注释很重要,注释很重要,重要的事情要大喊三遍,呵呵。

    服务端脚本,D:\vhost\test\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 : '.$string.PHP_EOL;            /*向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);

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:实例详解php的socket编程
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址