iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP+Socket系列之实现客户端与服务端数据传输
  • 792
分享到

PHP+Socket系列之实现客户端与服务端数据传输

phpsocket 2023-05-14 20:05:01 792人浏览 薄情痞子
摘要

本篇文章给大家带来了关于PHP+Socket的相关知识,其中主要介绍了什么是socket?php+socket如何实现客户端与服务端数据传输?感兴趣的朋友下面一起来看一下,希望对大家有帮助。socket介绍实现网络进程之间的通信,几乎所有应

本篇文章给大家带来了关于PHP+Socket的相关知识,其中主要介绍了什么是socket?php+socket如何实现客户端与服务端数据传输?感兴趣的朋友下面一起来看一下,希望对大家有帮助。

socket介绍

实现网络进程之间的通信,几乎所有应用程序都是采用 socket,socket 是应用层与 tcp/IP 协议族通信的中间抽象层,它是一组接口。在设计模式中,socket 其实是一个门面模式,它把复杂的 TCP/IP 协议族隐藏在 socket 接口后面,对用户来说,一组简单的接口就是全部,让 socket 去组织数据,以符合指定的协议

7617f3b78753cdf0045f85ac8eabdbf.jpg

socket 的英文原意是 「孔」或「插座」,通常也被称作「套接字」,用于描述 IP 地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。

socket 链接的三个过程

  • 服务端监听:IP+端口号

  • 客户端请求:发出向服务端的 IP 以及端口的连接请求

  • 链接确认:服务端套接字监听到或者说接收到客户端套接字连接请求,他就会建立一个新的进程,把服务端的套接字描述发给客户端,以响应客户端的请求,一旦客户端确认了此描述,连接就建立好了。儿服务端的套接字继续处于监听状态,继续接受其他客户端套接字的连接请求。

089f4c71a9dec261bb76eb0e1202e85.jpg

php实现socket

如果需要在 php 中使用 socket,则需要在编译 php 是添加 --enable-sockets 配置项来启用,可使用 php -m|grep sockets 命令检查启用情况,具体编译过程可参考 这篇文章

快速体验

服务端与客户端简略代码如下,运行后服务端会阻塞等待客户端连接,客户端会在控制台要求输入内容,输入后信息会在服务端打印,同时客户端显示转为大写的内容,此示例服务端与客户端运行在一台服务器

服务端监听

<?php

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

// 设置 ip 被释放后立即可使用
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, true);

// 绑定ip与端口
socket_bind($socket, 0, 8888);

// 开始监听
socket_listen($socket);

while (true) {
    // 接收内容
    $conn_sock = socket_accept($socket);
    socket_getpeername($conn_sock, $ip, $port);
    // echo '请求ip: ' . $ip . PHP_EOL . '端口: ' . $port;

    while (true) {
        // 获取消息内容
        $msg = socket_read($conn_sock, 10240);
        // TODO 处理业务逻辑

        // 将信息转为大写并原样返回客户端
        socket_write($conn_sock, strtoupper($msg));

        echo $msg;
    }
}

客户端连接

<?php

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

// 连接服务端
socket_connect($socket, '127.0.0.1', 8888);

while (true) {
    // 让控制台输入内容
    fwrite(STDOUT, '请输入内容:');
    $in = fgets(STDIN);

    // 向服务端发送内容
    socket_write($socket, $in);

    // 读取服务端发送的消息
    $msg = socket_read($socket, 10240);
    echo $msg;
}

语法解释

socket_create

socket_create(int $domain,int $type, int $protocol): resource|false

创建并返回一个套接字资源,通常也称作一个通讯节点。一个典型的 socket 由至少 2 个套接字组成,其中一个运行在客户端,一个运行在服务端。

参数:

  • domain 指定当前套接字使用什么协议,可用协议如下:

    Domain描述
    AF_INETIPv4 网络协议,TCP 与 UDP 都可使用此协议
    AF_INET6IPv6 网络协议,TCP 与 UDP 都可使用此协议
    AF_UNIX本地通讯协议,具有高性能与低成本的 IPC
  • type 用户指定当前套接字使用的类型

    type描述
    SOCK_STREAM可顺序化的、可靠的、全双工的、基于链接的字节流,支持数据传送流量控制机制。TCP 协议基于这种流式套接字。
    SOCK_DGRAM数据报文的支持(无连接、不可靠、固定最大长度)UDP 协议基于这种报文套接字
    SOCK_SEQPACKET可顺序化的、可靠的、全双工的、面向连接的、固定最大长度的数据通信,数据端通过接收每一个数据段来读取整个数据包
    SOCK_RAW读取原始的网络协议,这种特殊的套接字可用于手工构建任意类型的协议,一般使用这个套接字来实现 ICMP 请求
    SOCK_RDM可靠的数据层,但不保证到达顺序,一般的操作系统都未实现此功能
  • protocol 设置指定 domain 套接字下的具体协议,如果所需协议是 TCP 或者 UDP,可以直接使用常量 SOL_TCPSOL_UDP,这个参数的具体值可通过 getprotobyname() 函数获取

返回值

socket_create() 正确时返回一个套接字资源,失败时返回 false。可以调用 socket_last_error() 获取错误码,错误码可以通过 socket_strerror(int $err_no) 转换为文字的错误说明。

socket_bind

socket_bind(resource $socket, string $address [, int $port]): bool

绑定一个地址与端口到套接字

参数:

  • socket 使用 socket_create() 创建的套接字资源

  • address

    如果套接字是 AF_INET 族,那么 address 必须是一个四点法的 IP 地址,例如 127.0.0.10.0.0.0

    如果套接字是 AF_UNIX 族,那么 address 是 Unix 套接字一部分(例如 /tmp/my.sock

  • port (可选)

    该参数仅用于使用 AF_INET 族时,指定当前套接字监听的端口号

返回值:

绑定成功返回 true,失败时则返回 false,同 socket_create ,在绑定失败时可以调用 socket_last_error() 获取错误码,错误码可以通过 socket_strerror(int $err_no) 转换为文字的错误说明。

socket_listen

socket_listen(resource $socket [, int $backlog]): bool

在使用 socket_create() 创建套接字并使用 socket_bind() 将其绑定到名称之后,可能会告诉它侦听套接字上的传入连接。该函数仅适用于 SOCK_STREAMSOCK_SEQPACKET 类型的套接字。

参数:

  • socket 使用 socket_create() 创建的套接字资源
  • backlog 最大数量的积压传入连接将排队等待处理,如果连接请求到达时队列已满,则客户端可能会收到指示为 ECONNREFUSED 的错误。或者,如果底层协议支持重传,则可能会忽略该请求,以便重试可能会成功。

返回值:

绑定成功返回 true,失败时则返回 false,可以调用 socket_last_error() 获取错误码,错误码可以通过 socket_strerror(int $err_no) 转换为文字的错误说明。

socket_accept

socket_accept(resource $socket): resource|false

当有新的客户端连接时,返回一个新的 socket 资源以用于与客户端通信,如有多个连接排队,则返回第一个连接,相反如果没有待处理的连接,该函数会默认阻塞当前进程,直至新的客户端连接、断开

参数:

  • socket 使用 socket_create() 创建的套接字资源

返回值:

成功时返回一个新的套接字资源,错误时返回 false,可以调用 socket_last_error() 获取错误码,错误码可以通过 socket_strerror(int $err_no) 转换为文字的错误说明。

socket_connect

socket_connect(resource $socket, string $address [, int $port = null]): bool

使用套接字实例发起到 address 的连接

参数:

  • socket 该参数必须是由 socket_create() 创建的 socket 实例

  • address

    如果套接字是 AF_INET 族,那么 address 必须是一个四点法的 IP 地址,例如 127.0.0.1 如果支持 IPv6 并且套接字是 AF_INET6,那么 address 也可以是一个有效的 IPv6 地址(例如 ::1

    如果套接字是 AF_UNIX 族,那么 address 是 Unix 套接字一部分(例如 /tmp/my.sock

返回值:

成功时返回 true, 或者在失败时返回 false

socket_write

socket_write(resource $socket, string $data [, int $length = null]): int|false

传输数据至指定套接字

参数:

  • socket 使用 socket_create()socket_accept() 创建的套接字资源

  • data 要发送的内容

  • length (可选)

    可以指定发送套接字的替代字节长度。如果这个长度大于实际发送内容的长度,它将被静默地截断为实际发送内容的长度。

返回值:

成功时返回成功发送的字节数,或者在失败时返回 false,可以调用 socket_last_error()socket_strerror(int $err_no) 获取具体错误信息

socket_read

socket_read(resource $socket, int $length, int $mode = PHP_BINARY_READ): string|false

从套接字资源内读取数据

参数:

  • socket 使用 socket_create()socket_accept() 创建的套接字资源(服务端为 socket_accept() 客户端为 socket_create()

  • length 指定最大能够读取的字节数。否则您可以使用 \r\n\0 结束读取(根据 mode 参数设置)

  • mode (可选)

    PHP_BINARY_READ (默认)- 使用系统的 recv() 函数。二进制安全地读取数据。

    PHP_NORMAL_READ - 读取到 \n\r 时停止。

返回值:

socket_read() 返回一个字符串,表示接收到的数据。如果发生了错误(包括远程主机关闭了连接),则返回 false,可以调用 socket_last_error()socket_strerror(int $err_no) 获取具体错误信息

socket_close

socket_close(resource $socket): void

关闭并销毁一个套接字资源

参数:

  • socket 使用 socket_create()socket_accept() 创建的套接字资源

返回值:

推荐学习:《PHP视频教程

以上就是PHP+Socket系列之实现客户端与服务端数据传输的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: PHP+Socket系列之实现客户端与服务端数据传输

本文链接: https://www.lsjlt.com/news/203599.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • PHP+Socket系列之实现客户端与服务端数据传输
    本篇文章给大家带来了关于php+socket的相关知识,其中主要介绍了什么是socket?php+socket如何实现客户端与服务端数据传输?感兴趣的朋友下面一起来看一下,希望对大家有帮助。socket介绍实现网络进程之间的通信,几乎所有应...
    99+
    2023-05-14
    php socket
  • PHP+Socket如何实现客户端与服务端数据传输
    这篇文章主要介绍“PHP+Socket如何实现客户端与服务端数据传输”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“PHP+Socket如何实现客户端与服务端数据传输”文章能帮助大家解决问题。sock...
    99+
    2023-07-05
  • Python socket怎么实现服务端和客户端数据传输
    今天小编给大家分享一下Python socket怎么实现服务端和客户端数据传输的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了...
    99+
    2023-06-30
  • Pythonsocket如何实现服务端和客户端数据传输(TCP)
    目录socket服务端和客户端数据传输(TCP)socket服务端,客户端互相通信socket服务端和客户端数据传输(TCP) 服务器端: import socket #创建一个so...
    99+
    2024-04-02
  • 服务端与客户端怎么利用socket传文件
    这篇文章给大家介绍服务端与客户端怎么利用socket传文件,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。逻辑:客户端将需要查找的文件名以流的形式传给服务端服务端接受客户端的连接,把流转化为字符串,进行一个目录的遍历,查...
    99+
    2023-05-31
    socket 服务端与客户端
  • Android客户端与服务端数据加密传输方案详解
    目录前言数据加密方案数据加密细节AES加解密RSA公钥加密总结前言 在网络通信中,通信传输数据容易被截取或篡改,如果在传输用户隐私数据过程中,被不法分子截取或篡改,就可能导致用户受...
    99+
    2023-01-03
    Android客户端服务端数据加密传输 Android 数据加密传输
  • Python基于socket实现TCP客户端和服务端
    目录一、基于socket实现的TCP客户端二、基于socket实现的TCP服务端三、socket实现的多任务版TCP服务端1、面向对象版本一、基于socket实现的TCP客户端 im...
    99+
    2024-04-02
  • 客户端Socket与服务端ServerSocket串联实现网络通信
    目录引导语1、类属性2、初始化3、bind4、accept5、面试题5.1、说说你对Socket和ServerSocket的理解?5.2、说说对SocketOptions中的SO_T...
    99+
    2024-04-02
  • python利用socket实现客户端和服务端之间进行通信
    目录一、socketsocket通信的条件:IP和端口形象比喻二、客户端实现过程三、服务器实现过程四、演示五、实现持续通信过程前言: 今天教大家通过Python进行Socket网络编...
    99+
    2024-04-02
  • Python基于socket怎么实现TCP客户端和服务端
    这篇文章主要讲解了“Python基于socket怎么实现TCP客户端和服务端”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python基于socket怎么实现TCP客户端和服务端”吧!一、基...
    99+
    2023-06-30
  • nodejs中socket怎么实现服务端和客户端功能
    小编给大家分享一下nodejs中socket怎么实现服务端和客户端功能,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!具体如下:使用node.js的net模块能很快的开发出基于TCP的服务端...
    99+
    2024-04-02
  • python socket多线程实现客户端与服务器连接
    python socket多线程实现客户端与服务器连接,供大家参考,具体内容如下 之前因为一些作业需要完成一个服务器监听多个客户端的程序,于是就用python写了这样的程序。话不多说...
    99+
    2024-04-02
  • 客户端Socket与服务端ServerSocket串联实现网络通信的方法
    本文小编为大家详细介绍“客户端Socket与服务端ServerSocket串联实现网络通信的方法”,内容详细,步骤清晰,细节处理妥当,希望这篇“客户端Socket与服务端ServerSocket串联实现网络通信的方法”文章能帮助大家解决疑惑...
    99+
    2023-06-29
  • 如何实现C#服务端与客户端连接
    今天就跟大家聊聊有关如何实现C#服务端与客户端连接,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。C#服务端与客户端连接实现的时间性:当服务器开始对端口侦听之后,便可以创建客户端与它建...
    99+
    2023-06-17
  • python3中实现客户端与服务端交互发
    在python3中实现客户端与服务端程序交互,从客户端发送文件到服务端客户端代码:client.py#!/usr/bin/env python #_*_ encoding=utf-8 _*_ import socket,sys,os ...
    99+
    2023-01-31
    服务端 客户端
  • php使用workman框架实现socket服务以及连接客户端
    1. 解决什么问题,为什么要用workman  socket服务    都知道游戏安装包很大,渠道推广时,需要对游戏进行分包处理,而PHP命...
    99+
    2024-04-02
  • Golang TCP服务器 - 实现客户端之间的数据交流
    “纵有疾风来,人生不言弃”,这句话送给正在学习Golang的朋友们,也希望在阅读本文《Golang TCP服务器 - 实现客户端之间的数据交流》后,能够真的帮助到大家。我也会在后续的文章中,陆续更新...
    99+
    2024-04-04
  • Android socket实现原理详解 服务端和客户端如何搭建
    本文实例为大家分享了Android socket的实现原理,供大家参考,具体内容如下Socket套接字 是网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。socket实现的原理机制:通信的两端都有Socket...
    99+
    2023-05-30
    android socket roi
  • C#实现MQTT服务端与客户端通讯功能
    关于MQTT MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设...
    99+
    2024-04-02
  • C#中怎么实现服务端与客户端通信
    C#中怎么实现服务端与客户端通信,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。C#服务端与客户端通信实现实例:TcpClient client;&nb...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作