0

0

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

藏色散人

藏色散人

发布时间:2023-02-02 11:35:01

|

5535人浏览过

|

来源于learnku

转载

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

socket介绍

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

7617f3b78753cdf0045f85ac8eabdbf.jpg

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

立即学习PHP免费学习笔记(深入)”;

socket 链接的三个过程

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

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

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

089f4c71a9dec261bb76eb0e1202e85.jpg

php实现socket

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

快速体验

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

服务端监听

客户端连接

语法解释

socket_create

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

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

参数:

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

    Domain 描述
    AF_INET IPv4 网络协议,TCP 与 UDP 都可使用此协议
    AF_INET6 IPv6 网络协议,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) 转换为文字的错误说明。

Android配合WebService访问远程数据库 中文WORD版
Android配合WebService访问远程数据库 中文WORD版

采用HttpClient向服务器端action请求数据,当然调用服务器端方法获取数据并不止这一种。WebService也可以为我们提供所需数据,那么什么是webService呢?,它是一种基于SAOP协议的远程调用标准,通过webservice可以将不同操作系统平台,不同语言,不同技术整合到一起。 实现Android与服务器端数据交互,我们在PC机器java客户端中,需要一些库,比如XFire,Axis2,CXF等等来支持访问WebService,但是这些库并不适合我们资源有限的android手机客户端,

下载

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速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1502

2023.10.24

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

320

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1502

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

624

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

653

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

609

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

172

2025.07.29

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

9

2026.01.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 10.3万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.2万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号