PHP的Socket网络编程入门指引_php技巧

什么是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(),这一步不是必须的,但通常都这么做,它最大的意义是防止获得控制终端

什么是守护进程?一个守护进程通常被认为是一个不对终端进行控制的后台任务。它有三个很明显的特征:

  1.     在后台运行
  2.     与启动他的进程脱离
  3.     无须终端控制

最常见的实现方法: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 connect\n"; 

    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访问了

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索php
socket
socket编程入门、qt5 socket编程入门、plc编程入门技巧、杨氏太极拳入门指引、理财入门指引,以便于您获取更多的相关知识。

时间: 2024-10-26 22:29:44

PHP的Socket网络编程入门指引_php技巧的相关文章

Java套接字(Socket)网络编程入门_java

网络应用模式主要有: 主机/终端模式:集中计算,集中管理: 客户机/服务器(Client/Server,简称C/S)模式:分布计算,分布管理: 浏览器/服务器模式:利用Internet跨平台. www(万维网)就是建立在客户机/服务器模式上,以HTML语言和HTTP协议为基础,能够提供各种Internet服务的信息浏览系统.网络信息放在主机的不同位置,www服务器利用超文本链路链接各项信息.www客户机(浏览器Brower)负责与服务器建立联系,向服务器发送请求,处理HTML超媒体,提供图形用户

c++-学习网络编程入门 指导

问题描述 学习网络编程入门 指导 本人接触过c/c++,想学习网络编程,不知从何入门,请大家指导下,推荐些相关的书籍,谢谢! 解决方案 可以从tcp/ip协议以及socket学起,看<计算机网络>,谢希仁编写,和windows网络编程 解决方案二: windows网络编程 解决方案三: 以实践的方式驱动,比如说去做一个简单的httpserver 解决方案四: 看书之余,要多动手.从简单的阻塞式, 到select, 再到iocp或者epoll. 然后看下一些开源的网络库, libevent, n

Socket网络编程学习笔记(3):利用套接字助手类

在上一篇中已经介绍了利用Socket建立服务端和客户端进行通信,如果需要 的朋友可访问<Socket网络编程学习笔记(2):面向连接的Socket>.在本篇 中,将利用C#套接字的助手类来简化Socket编程,使得刚刚接触到网络编程的 朋友们更容易上手. 跟上篇一样,通过C#套接字的助手类来编程同样分 服务端和客户端. 一.服务端侦听模式 1.创建套接字与 IPEndPoint绑定,并设置为侦听模式. 1//创建IPEndPoint实例 2 IPEndPoint ipep = new IPEn

Socket网络编程学习笔记(1):常用方法介绍

虽然天天上博客园欣赏各位"大侠"的杰作,偶然回首,突然发 现自己已成"潜水者"久矣.本来对于自己有限的水平,有点不好意 思在此发贴,不过潜伏久了,才慢慢意识到老是通过浏览他人的文章虽然能够提 高自己能力,能够及时的获取新技术新思想,但却只能停留在他人的思想上.通 过学习,加上自己的想法,再写出来,让大家来指证错误,不仅能够巩固自己的 知识,也可以让一些跟我一样迷惘的朋友们不用再去走一些弯路,岂不是两全其 美,本着这样的想法,打算把自己平时的所学所想都写下来,欢迎各路

Python Socket 网络编程

原文:Python Socket 网络编程 Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ 聊天.收发 email 等等.要解决网络上两台主机之间的进程通信问题,首先要唯一标识该进程,在 TCP/IP 网络协议中,就是通过 (IP地址,协议,端口号) 三元组来标识进程的,解决了进程标识问题,就有了通信的基础了. 本文主要介绍使用 Python 进

socket 网络编程传输文件

问题描述 socket 网络编程传输文件 进行网络通信,socket编程,传输文件过程中,如何来通过调用函数来获得传输文件的大小,以及传输该文件相对应的时间,有什么好的办法吗? 解决方案 从来没弄过Socket的一些东西,最近看了看,一些小东西,希望能帮到和我一样的菜鸟.1.win32程序下的文件传输1.1.Client Code#include #include long GetFileLen(FILE *_file){ long curPosit=ftell(_file)fileLen; f

socket网络编程 文件传输的问题?

问题描述 socket网络编程 文件传输的问题? socket网络编程,目前是同时开启两个进程两个线程,同时从server那端传输两个文件过来,是可以实现,任意格式的文件和任何大小的文件都可以.现在的项目要求是这两个进程要同时传输一个文件.我的思路是一个进程传输该文件的前一半,另一个进程传输该文件的后一半,具体实现就不知道了,希望大家给点意见,已经摸索了好几天.毫无头绪啊!!!!!项目马上就要完成了,谢谢大家. 解决方案 RandomAccessFile,看看吧. 解决方案二: 循序渐进Sock

socket-Windows Socket网络编程中使用的IP地址是公网IP还是内网IP?

问题描述 Windows Socket网络编程中使用的IP地址是公网IP还是内网IP? 因为我按照书上的代码写了一个程序,就是connect什么什么的,我写的MFC做客户端,网络调试助手做服务器端,然后从网络调试助手向MFC程序发送信息.当网络调试助手和MFC程序在一台电脑上时连接是可以成功的,但是在两台电脑上时就不成功了,调试的时候就是connect半天没反应,然后就失败了.IP地址我都填对的.(如果是两个网络调试助手在两台电脑上是能成功连接的,但是我找不到网络调试助手的源代码) 有谁知道是什

python之Socket网络编程详解_python

什么是网络? 网络是由节点和连线构成,表示诸多对象及其相互联系.在数学上,网络是一种图,一般认为专指加权图.网络除了数学定义外,还有具体的物理含义,即网络是从某种相同类型的实际问题中抽象出来的模型.在计算机领域中,网络是信息传输.接收.共享的虚拟平台,通过它把各个点.面.体的信息联系到一起,从而实现这些资源的共享.网络是人类发展史来最重要的发明,提高了科技和人类社会的发展. 网络通信的三要素 IP地址 用来表示一台独立的主机 特殊的IP地址 127.0.0.1或称localhost(表示本地回环