目录

  • 概述
  • TCP/IP协议、UDP协议
  • Socket是什么
  • socket通信流程
  • socket编程php代码实战
  • php7进阶到架构师相关阅读

概述

这是关于php进阶到架构之php7核心技术与最佳实战学习的第篇文章:socket通信很难?这一文让你轻松搞定!

  • 第一篇:用房子的思维秒懂php7传值与传引用的区别
  • 第二篇: php7语法糖好甜,让你迷上php魔术方法
  • 第三篇:php7魔术方法__call的最佳实战之数据库PDO类的驱动设计实战
  • 第四篇:精通PHP正则表达式,看这一篇就够啦!
  • 第五篇:不懂对象设计原则,都不好意思自称php大师
  • 第六篇:socket通信很难?这一文让你轻松搞定!

对TCP/IP、UDP、Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵。大家能回答下面几个问题吗?

1.什么是TCP/IP、UDP?

2. Socket在哪里呢?

3. Socket是什么呢?

4. 怎么使用socket编程?

TCP/IP协议、UDP协议

TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,

是一个工业标准的协议集,它是为广域网(WANs)设计的。

UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。

它是属于TCP/IP协议族中的一种。

这里有一张图,表明了这些协议的关系。

TCP-IP,UDP协议关系

TCP/IP协议族包括运输层、网络层、链路层。现在你知道TCP/IP与UDP的关系了吧。

UDP是属于TCP/IP协议族中的一种

Socket在哪里?

在上图中,我们没有看到Socket的影子,那么它到底在哪里呢?请看下图,一目了然。

socket所在位置

原来Socket在这里

Socket是什么?

Socket是应用层与TCP/IP协议族通信的中间软件抽象层。

它是一组接口。

在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP /IP协议族隐藏在Socket接口后面。

对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

socket通信流程

听到Socket编程,是不觉得它是比较高深的编程知识呢?但是只要弄清Socket编程的工作原理,神秘的面纱也就揭开了。 请看下图:

socket编程流程图

先从服务器端说起。

服务器端先初始化Socket,

然后与端口绑定(bind),

对端口进行监听(listen),

调用accept阻塞,

等待 客户端连接。

在这时如果有个客户端初始化一个Socket,

然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。

客户端发送数据请求(write),

服务器端接收请求(read)并处理请求,

然后把回应数据发送给客户端(write),

客户端读取数据(read),

最后关闭连接,一次交互结束。

搞懂socket通信流程了吧?来,对照scoket通信流程图,代码撸起!

socket编程php代码实战

首先,服务端代码Server.php如下:

//确保在连接客户端时不会超时set_time_limit(0);$ip = '127.0.0.1';$port = 8888;/* +------------------------------- *    @socket通信整个过程+------------------------------- *    @socket_create 1.初始化Socket *    @socket_bind  2.端口绑定(bind) *    @socket_listen 3.对端口进行监听(listen)  *    @socket_accept 4.调用accept阻塞,等待 客户端连接  *    @socket_read 5.接收客户端请求数据  *    @socket_write 6.回应数据发送给客户端  *    @socket_close 7.关闭连接  +-------------------------------- *//*----------------    1.初始化Socket    -------------------*///创建服务端的socket套接流,net协议为IPv4,protocol协议为TCP$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);/*----------------    2.端口绑定(bind)    -------------------*//*绑定接收的套接流主机和端口,与客户端相对应*/if(socket_bind($socket,$ip,$port) == false){    echo 'server bind fail:'.socket_strerror(socket_last_error());    /*这里的127.0.0.1是在本地主机测试,你如果有多台电脑,可以写IP地址*/}/*----------------    3.对端口进行监听(listen)    -------------------*///监听套接流if(socket_listen($socket,4)==false){    echo 'server listen fail:'.socket_strerror(socket_last_error());}/*----------------    4.调用accept阻塞,等待 客户端连接    -------------------*///让服务器无限获取客户端传过来的信息do{    /*接收客户端传过来的信息*/    $accept_resource = socket_accept($socket);    /*socket_accept的作用就是接受socket_bind()所绑定的主机发过来的套接流*/    if($accept_resource !== false){        /*读取客户端传过来的资源,并转化为字符串*/        /*----------5.接收客户端请求数据-----------*/        $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()所绑定的主机客户端*/            /*------6.回应数据发送给客户端-----------*/            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);

运行server.php,启动socket服务端

php server.php

现在服务端的程序已经开始运行,端口已经开始监听了

客户端client.php代码如下:

//初始化一个Socket 创建一个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 = 'l love you 我爱你 socket';    //转为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);//工作完毕,关闭套接流

运行client.php代码:

php client.php

至此客户端已经连接上服务端了,并和服务端通信了。赶快本地代码撸起来,记得查看结果哦

php7进阶到架构师相关阅读

https://www.kancloud.cn/gofor/gofor

最后,欢迎大家留言补充,讨论~~~

c# socket接收字符串_socket通信很难?这一文让你轻松搞定!相关推荐

  1. mysql 逐行相加_隔行求和很难吗?使用函数即可轻松搞定,再也不用逐行相加了...

    Hello,大家好,今天跟大家分享下我们如何在excel中实现隔行求和,工作中我们想要求和的数据可能是每隔一列相互错开的,因为数据区域不是连续的,所以很多人会一行一行地进行计算,十分的浪费时间,今天就 ...

  2. 微信扫码登录很难吗?5步帮你搞定

    点击关注公众号,利用碎片时间学习 微信开放平台:微信扫码登录功能 官方文档:https://developers.weixin.qq.com/doc/oplatform/Website_App/WeC ...

  3. 微信消息经常延迟接收?一键调整这些功能,就能帮你轻松搞定

    不知道大家有没有遇到这样的事情,那就是微信经常延迟接收消息,明明别人早就将消息发过来了,但是等到自己收到时,却发现已经过了好几分钟了. 如果错过了重要消息,还是很让人烦恼的,那微信消息为什么会延迟接收 ...

  4. 优化信息流很麻烦?三招教你轻松搞定

    随着移动互联网的快速发展,大多数人已经习惯用手机获取各类信息.但信息量的不断增大,各种低质重复信息正严重影响着用户体验.所谓信息流性能优化,就是利用"大数据+人工"的方式在信息的数 ...

  5. 逆向查找_「函数说12」数据逆向查找很复杂?match+index让你轻松搞定

    EXCEL进阶课堂 · 函数说 持续更新,这是第12篇教程. 欢迎各位小伙伴转发.点赞.讨论,更欢迎私信获取练习素材,刻意练习才能学有收获. 第12讲:如何轻松的实现数据逆向查找--match+ind ...

  6. excel一列求和_在excel中设置动态求和其实很简单,三个函数即可轻松搞定

    Hello,大家好,今天跟大家分享下我们如何在excel中设置动态求和的效果,如下图,当我们更改姓名和月份的时候会根据我们选择的数据自动求和,比如:我们将名字设置为刘备,截止月份设置为12月,就会对刘 ...

  7. 做“路径文字”很难吗? PS几步轻松实现

    做"路径文字"很难吗? PS几步轻松实现 作者 微博 @i视频编辑 横版视频链接在这里 竖版视频在这里 比如一行文字沿着曲线排列,或者像圆形印章的文字一样,看了下面这篇小文,做&q ...

  8. 告别卸载软件难 四大方法轻松搞定

    我们常会遇到一些永远不会使用的原装软件,这些软件占据着你的系统空间,但是却像狗皮膏药一样赖着不走.前些日的苹果IOS10更新后,很多人都卸载了邮件等部分APP,而近日,被誉为"全家桶&quo ...

  9. 制作点击文字变颜色_手机照片、视频怎样添加文字?原来很简单,4种方法一分钟搞定...

    手机照片.视频怎样添加文字?原来很简单,4种方法一分钟搞定 还有3天就到了元旦佳节,相信大家都很开心,美好的假期开始了. 那么可以说是你们元旦必备手机技巧,怎样给照片.视频添加文字,分享4种笔者常用的 ...

最新文章

  1. 挑战练习题2.3动态规划 poj3181 Dollar Dayz 完全背包
  2. update module
  3. 【快乐水题】1725. 可以形成最大正方形的矩形数目
  4. python_易忘的简单知识点总结
  5. 05_ClickHouse、MergeTree系列引擎概述与存储结构、建表模板、建表语句、MergeTree设置、建表示例、数据存储、数据片段(data part)
  6. kafka-manager 安装
  7. 给你一个K8S的“发行版”
  8. linux ftp 没反应,【已回应】FTP无法使用怎么办
  9. Redis中struct运用
  10. python第三项开始每一项都等于前两项的积_Python二十九个常见的脚本汇总!
  11. 51单片机c语言教程第二章,51单片机C语言教程-郭天祥-PDF转word版第二章.docx
  12. 闲置的eSATA接口,会影响Windows 7的启动速度
  13. 再见SNDA,在离职之后
  14. ios 隐藏app的插件_iPhone如何隐藏App图标?iOS9不越狱隐藏App小技巧
  15. c语言rank函数使用实例,rank函数实例(1)
  16. 如何用自签名证书为.sis文件签名
  17. MySQL入门学习教程
  18. 精雕细琢见真章《STM32Cube高效开发教程》
  19. 管理员账户没有系统维护权限处理办法
  20. 云计算和大数据的标准化需求和标准化组织有哪些?

热门文章

  1. Delphi保存网页中的图片
  2. SqlServer系统函数
  3. Delphi开发单机瘦数据库程序要点
  4. 高级C语言教程-C语言函数setjmp()函数
  5. python中如何安装 EasyGui模块
  6. xml内容过多装不下,怎么实现下滑功能(最简单的下滑功能实现)
  7. python基础——数字型
  8. 低版本ulibc支持recvmmsg sendmmsg功能
  9. 「 每日一练,快乐水题 」1189. “气球” 的最大数量
  10. Jackson 注解 -- 指定输出顺序