查看: 855|回复: 0

PHP的Socket网络编程入门指引

[复制链接]

0

威望

6

金钱

8

积分

新手上路

Rank: 1

积分
8
发表于 2017-11-15 22:31:00 | 显示全部楼层 |阅读模式
什么是TCP/IP、UDP?
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享! TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享! UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是属于TCP/IP协议族中的一种。
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享! 这里有一张图,表明了这些协议的关系。
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!TCP/IP协议族包括运输层、网络层、链路层。现在你知道TCP/IP与UDP的关系了吧。
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!Socket在哪里呢?
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
  在图1中,我们没有看到Socket的影子,那么它到底在哪里呢?还是用图来说话,一目了然。
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!原来Socket在这里。
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!Socket是什么呢?
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
  Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!你会使用它们吗?
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
  前人已经给我们做了好多的事了,网络间的通信也就简单了许多,但毕竟还是有挺多工作要做的。以前听到Socket编程,觉得它是比较高深的编程知识,但是只要弄清Socket编程的工作原理,神秘的面纱也就揭开了。
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!  一个生活中的场景。你要打电话给一个朋友,先拨号,朋友听到电话铃声后提起电话,这时你和你的朋友就建立起了连接,就可以讲话了。等交流结束,挂断电话结束此次交谈。 生活中的场景就解释了这工作原理,也许TCP/IP协议族就是诞生于生活中,这也不一定。
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!PHP的Socket编程概述
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
php5.3自带了socket模块,使得php具有socket通信能力,具体api可以参考官方手册:http://php.net/manual/zh/function.socket-create.php, 具体实现跟c非常类似,只是少了内存分配和网络字节序转换这种底层操作
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!同时,php的pcntl模块和posix模块配合可以实现基本的进程管理、信号处理等操作系统级别的功能。这里有两个非常关键的函数,pcntl_fork()和posix_setsid()。fork()一个进程,则表示创建了一个运行进程的副本,副本被认为是子进程,而原始进程被认为是父进程。当fork()运行之后,则可以脱离启动它的进程和终端控制等,也意味着父进程可以自由退出。pcntl_fork()返回值,-1表示执行失败,0表示在子进程中,大于0表示在父进程中。setsIT(),它首先使新进程成为一个新会话的“领导者”,最后使进程不再控制终端。这也是成为守护进程最关键一步,这意味着,不会随着终端关闭而强制退出进程。对于一个不会被中断的常驻进程来说,这是很关键的一步。进行最后一次fork(),这一步不是必须的,但通常都这么做,它最大的意义是防止获得控制终端
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!什么是守护进程?一个守护进程通常被认为是一个不对终端进行控制的后台任务。它有三个很明显的特征:
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!

    乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
  • 在后台运行
    乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
  • 与启动他的进程脱离
    乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
  • 无须终端控制
    乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
最常见的实现方法:fork() -> setsid() -> fork(), 代码里run_server()方法实现了守护进程。
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!server端socket监听代码
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!<?php // 接受客户端请求,回复固定的响应内容 function server_listen_socket ($address, $port) { $buffer = "Msg from wangzhengyi server, so kubi..."; $len = strlen($buffer); // create, bind and listen to socket $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if (! $socket) { echo "failed to create socket:" . socket_strerror($socket) . "n"; exit(); } $bind_flag = socket_bind($socket, $address, $port); if (! $bind_flag) { echo "failed to bind socket:" . socket_strerror($bind_flag) . "n"; exit(); } $backlog = 20; $listen_flag = socket_listen($socket, $backlog); if (! $listen_flag) { echo "failed to listen to socket:" . socket_strerror($listen_flag) . "n"; exit(); } echo "waiting for clients to connectn"; while (1) { if (($accept_socket = socket_accept($socket)) == FALSE) { continue; } else { socket_write($accept_socket, $buffer, $len); socket_close($accept_socket); } } } function run_server () { $pid1 = pcntl_fork(); if ($pid1 == 0) { // first child process // 守护进程的一般流程:fork()->setsid()->fork() posix_setsid(); if (($pid2 = pcntl_fork()) == 0) { $address = "192.168.1.71"; $port = "8767"; server_listen_socket($address, $port); } else { // 防止获得控制终端 exit(); } } else { // wait for first child process exit pcntl_wait($status); } } // server守护进程 run_server();
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!运行效果
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
启动服务器端socket进程,看是否在后台运行,效果如图:
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!客户端访问,可以通过浏览器或者curl访问,这里直接用curl访问了
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!搜索
乡知网,商道、电商、乡村知识分享! 乡知网,商道、电商、乡村知识分享!复制乡知网,商道、电商、乡村知识分享!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

推荐阅读 More>
广告位
快速回复 返回顶部 返回列表