返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >Socket的通信原理和使用
  • 725
分享到

Socket的通信原理和使用

网络php 2023-09-06 20:09:11 725人浏览 泡泡鱼
摘要

 目录 一、什么是 Socket? 二、Socket 通信过程         2.1 通信过程介绍        2.2 实现TCP建立连接的三次握手过程  三、 使用Socket进行通信【php】         3.1 PHP中So

 目录

一、什么是 Socket?

二、Socket 通信过程

        2.1 通信过程介绍

       2.2 实现TCP建立连接的三次握手过程

 三、 使用Socket进行通信【php】

        3.1 PHP中Socket常量和函数介绍

        3.2 php实现Socket通信过程 


一、什么是 Socket

Socket 的中文翻译过来就是“套接字”。套接字是什么,我们先来看看它的英文含义:插座。

socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。我的理解就是Socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写io、打开、关闭),这些函数我们在后面进行介绍。

Socket通信主要是基于两种协议实现的:

(1)TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。

(2)UDP(User Data Protocol,用户数据报协议)是与tcp相对应的协议。它是属于TCP/IP协议族中的一种。

通过下图说明实现通信过程之间关系:

 

二、Socket 通信过程

2.1 通信过程介绍

Socket 保证了不同计算机之间的通信,也就是网络通信。对于网站,通信模型是服务器与客户端之间的通信。两端都建立了一个 Socket 对象,然后通过 Socket 对象对数据进行传输。通常服务器处于一个无限循环,等待客户端的连接:

 

根据socket通信基本流程图,总结通信的基本步骤:
服务器端:
第一步:创建一个用于监听连接的Socket对像;
第二步:用指定的端口号和服务器的ip建立一个EndPoint对像;
第三步:用socket对像的Bind()方法绑定EndPoint;
第四步:用socket对像的Listen()方法开始监听;
第五步:接收到客户端的连接,用socket对像的Accept()方法创建一个新的用于和客户端进行通信的socket对像;
第六步:通信结束后一定记得关闭socket;
客户端:
第一步:建立一个Socket对像;
第二步:用指定的端口号和服务器的ip建立一个EndPoint对像;
第三步:用socket对像的Connect()方法以上面建立的EndPoint对像做为参数,向服务器发出连接请求;
第四步:如果连接成功,就用socket对像的Send()方法向服务器发送信息;
第五步:用socket对像的Receive()方法接受服务器发来的信息 ;
第六步:通信结束后一定记得关闭socket; 

2.2 实现TCP建立连接的三次握手过程

三次握手是 TCP 连接的建立过程。在握手之前,主动打开连接的客户端结束 CLOSE 阶段,被动打开的服务器也结束 CLOSE 阶段,并进入 LISTEN 阶段。随后进入三次握手阶段:

① 首先客户端向服务器发送一个 SYN 包,并等待服务器确认,其中:

  • 标志位为 SYN,表示请求建立连接;
  • 序号为 Seq = x(x 一般取随机数);
  • 随后客户端进入 SYN-SENT 阶段。

② 服务器接收到客户端发来的 SYN 包后,对该包进行确认后结束 LISTEN 阶段,并返回一段 TCP 报文,其中:

  • 标志位为 SYN 和 ACK,表示确认客户端的报文 Seq 序号有效,服务器能正常接收客户端发送的数据,并同意创建新连接;
  • 序号为 Seq = y;
  • 确认号为 Ack = x + 1,表示收到客户端的序号 Seq 并将其值加 1 作为自己确认号 Ack 的值,随后服务器端进入 SYN-RECV 阶段。

③ 客户端接收到发送的 SYN + ACK 包后,明确了从客户端到服务器的数据传输是正常的,从而结束 SYN-SENT 阶段。并返回最后一段报文。其中:

  • 标志位为 ACK,表示确认收到服务器端同意连接的信号;
  • 序号为 Seq = x + 1,表示收到服务器端的确认号 Ack,并将其值作为自己的序号值;
  • 确认号为 Ack= y + 1,表示收到服务器端序号 seq,并将其值加 1 作为自己的确认号 Ack 的值。
  • 随后客户端进入 ESTABLISHED。

当服务器端收到来自客户端确认收到服务器数据的报文后,得知从服务器到客户端的数据传输是正常的,从而结束 SYN-RECV 阶段,进入 ESTABLISHED 阶段,从而完成三次握手。

三、 使用Socket进行通信【PHP

3.1 php中Socket的常量和函数介绍

常量:

SOL_TCP/SOL_UDP   使用TCP/UDP连接模式

AF_INET   这是大多数用来产生socket的协议,使用TCP或UDP来传输,用在IPv4的地址
AF_INET6   与上面类似,不过是来用在IPv6的地址
AF_UNIX 本地协议,使用在Unix和linux系统上,它很少使用,一般都是当客户端和服务器在同一台机器上的时候使用
SOCK_STREAM 这个协议是按照顺序的、可靠的、数据完整的基于字节流的连接。这是一个使用最多的socket类型,这个socket是使用TCP来进行传输。
SOCK_DGRAM 这个协议是无连接的、固定长度的传输调用。该协议是不可靠的,使用UDP来进行它的连接。
SOCK_SEQPACKET 这个协议是双线路的、可靠的连接,发送固定长度的数据包进行传输。必须把这个包完整的接受才能进行读取。
SOCK_RAW 这个socket类型提供单一的网络访问,这个socket类型使用ICMP公共协议。(ping、traceroute使用该协议)
SOCK_RDM 这个类型是很少使用的,在大部分的操作系统上没有实现,它是提供给数据链路层使用,不保证数据包顺序

函数:
socket_create(int $domain,int $type,int $protocol)    创建一个Socket连接
socket_bind(resource $socket,string $address [,int $port = 0] )    把socket绑定在一个IP地址和端口上
socket_clear_error ([ resource $socket ] )   清除socket的错误或者最后的错误代码
socket_close(resource $socket)     关闭一个socket资源
socket_connect(resource $socket,string $address [,int $port = 0] )   开启一个socket连接,此函数尝试连接服务端
socket_create_listen ( int $port [, int $backlog = 128 ] )   在指定端口打开一个socket监听
socket_create_pair ( int $domain , int $type , int $protocol , array &$fd )   产生一对没有区别的socket到一个数组
socket_get_option ( resource $socket , int $level , int $optname )   获取socket选项
socket_getpeername(resource $socket, string& $address [,int &$port] )  获取远程类似主机的ip地址
socket_getsockname ( resource $socket , string &$addr [, int &$port ] )   获取本地socket的ip地址
socket_iovec_add()    添加一个新的向量到一个分散/聚合的数组
socket_iovec_alloc()   这个函数创建一个能够发送接收读写的iovec数据结构
socket_iovec_delete()   删除一个已经分配的iovec
socket_iovec_fetch()   返回指定的iovec资源的数据
socket_iovec_free()    释放一个iovec资源
socket_iovec_set()    设置iovec的数据新值
socket_last_error ([ resource $socket ] )   获取当前socket的最后错误代码
socket_listen(resource $socket[,int $backlog = 0] )     监听由指定socket的所有连接
socket_read(resource $socket, int $length [,int $type = PHP_BINARY_READ] )    读取指定长度的数据
socket_readv()     读取从分散/聚合数组过来的数据
socket_recv(resource $socket, string &$buf,int $len, int $flags)     从socket里接收数据到缓存
socket_recvfrom()    接受数据从指定的socket,如果没有指定则默认当前socket
socket_recvmsg()    从iovec里接受消息
 socket_select(array &$read,array &$write,array &$except,int $tv_sec [,int $tv_usec = 0] )     多路选择
socket_send(resource $socket, string $buf, int $len, int $flags)     这个函数发送数据到已连接的socket
socket_sendmsg ( resource $socket , array $message [, int $flags = 0 ] )     发送消息到socket
socket_sendto ( resource $socket , string $buf , int $len , int $flags , string $addr [, int $port = 0 ] )    发送消息到指定地址的socket
socket_set_block ( resource $socket )   在socket里设置为块模式
socket_set_nonblock ( resource $socket )   socket里设置为非块模式
socket_set_option ( resource $socket , int $level , int $optname , mixed $optval )    设置socket选项
socket_shutdown ( resource $socket [, int $how = 2 ] )    这个函数允许你关闭读、写、或者指定的socket
socket_strerror ( int $error_number)   返回指定错误号的详细错误
socket_write(resource $socket, string $buffer [,int $length= 0] )     写数据到socket缓存
socket_writev()    写数据到分散/聚合数组

socket_set_option ( resource $socket , int $level , int $optname , mixed $optval ) 设置套接字的套接字选项,通过optname参数设置指定的选项 在指定的协议级别level,设置为套接字的optval参数指向的值

optname 参数列表:

OptionDescriptionType
SO_DEBUG报告是否正在记录调试信息.int
SO_BROADCAST报告是否支持广播消息的传输.int
SO_REUSEADDR报告本地地址是否可以重复使用.int
SO_REUSEPORT报告本地端口是否可以重用.int
SO_KEEPALIVE报告是否通过定期传输消息使连接保持活动状态。 如果连接的套接字无法响应这些消息,则连接断开,并且使用SIGPIPE信号通知写入该套接字的进程.int
SO_LINGER如果存在数据,则报告套接字是否在socket_close()上停留。 默认情况下,当套接字关闭时,它将尝试发送所有未发送的数据。 对于面向连接的套接字,socket_close()将等待其对等方确认数据.
如果l_OnOff非零且l_linger为零,则在面向连接的套接字的情况下,将丢弃所有未发送的数据,并将RST(重置)发送到对等方
另一方面,如果l_onoff不为零且l_linger不为零,则socket_close()将阻塞,直到所有数据发送完毕或l_linger中指定的时间过去。 如果套接字是非阻塞的,则socket_close()将失败并返回错误
array . 该数组将包含两个键:l_onoff和l_linger
SO_OOBINLINE报告“套接字”是否内联带外数据.int
SO_SNDBUF报告发送缓冲区的大小。.int
SO_RCVBUF报告接收缓冲区的大小.int
SO_ERROR报告有关错误状态的信息并清除它int
SO_TYPE报告套接字类型(e.g.SOCK_STREAM).int
SO_DONTROUTE报告传出邮件是否绕过标准路由功能int
SO_RCVLOWAT报告套接字输入操作要处理的最小字节数.int
SO_RCVTIMEORep报告输入操作的超时值.array . 该数组将包含两个键:sec是超时值的秒部分,而usec是超时值的微秒部分.
SO_SNDTIMEO报告超时值,该超时值指定由于流控制阻止发送数据而导致输出功能阻塞的时间.array . 该数组将包含两个键:sec是超时值的秒部分,而usec是超时值的微秒部分.
SO_SNDLOWAT报告套接字输出操作要处理的最小字节数.int
TCP_nodeLAY报告是否禁用Nagle TCP算法.int
MCAST_JOIN_GROUP加入多播组 (added in PHP 5.4)array 使用键“group” ,指定一个字符串
MCAST_LEAVE_GROUP离开多播组 (added in PHP 5.4)array
MCAST_BLOCK_SOURCE阻止从特定源到达特定多播组的数据包,这些数据包必须事先已加入. (added in PHP 5.4)array 具有与MCAST_JOIN_GROUP相同​​的键,以及一个映射到字符串的额外键source
MCAST_UNBLOCK_SOURCE取消阻止(再次开始接收)从特定源地址到达特定多播组的数据包,这些数据包必须事先已加入. (added in PHP 5.4)array
MCAST_JOIN_SOURCE_GROUP接收发往特定组播组的数据包,该组播组的源地址与特定值匹配. (added in PHP 5.4)array
MCAST_LEAVE_SOURCE_GROUP停止接收发往源地址与特定值匹配的特定组播组的数据包. (added in PHP 5.4)array
IP_MULTICAST_IFIPv4组播数据包的传出接口. (added in PHP 5.4)指定接口号的int或字符串返回接口索引。 请注意,与C api不同,此选项不使用IP地址.请注意,与C API不同,此选项不使用IP地址。 这样可以消除IP_MULTICAST_IFIPV6_MULTICAST_IF之间的接口差异.
IPV6_MULTICAST_IFIPv6组播数据包的出接口. (added in PHP 5.4)IP_MULTICAST_IF相同.
IP_MULTICAST_LOOPIPv4数据包的多播回送策略,该策略确定此套接字发送的多播数据包是否也到达该主机使用的出接口上已加入同一多播组的同一主机中的接收者。默认情况下就是这种情况. (added in PHP 5.4)int 任何值都将被接受,并将按照通常的PHP规则转换为布尔值
IPV6_MULTICAST_LOOPIP_MULTICAST_LOOP类似,但适用于IPv6 (added in PHP 5.4)int . 参阅IP_MULTICAST_LOOP.
IP_MULTICAST_TTLIPv4组播数据包的生存时间。 该值应介于0(不要离开接口)和255之间。默认值是1(仅到达本地网络). (added in PHP 5.4)int 取值范围0 ~255.
IPV6_MULTICAST_HOPSIP_MULTICAST_TTL类似,但用于IPv6数据包。 值-1也被接受,这意味着应该使用默认路由. (added in PHP 5.4)int betw

3.2 php实现Socket通信过程 

创建服务端代码 socket_server.php

ORMAL_READ)){if(trim($message)){echo $connection.": ".$message."\n";}}//关闭客户端连接socket_close($connection);}//关闭建立的socket套接流socket_close($socket);

创建客户端代码 socket_client.php

 3, "usec" => 0));//绑定接收的套接流主机和端口$ip = '127.0.0.1';$port = '8888';$connection = socket_connect($socket, $ip, $port);//接收服务端传过来的信息if($data = socket_read($socket, 1024, PHP_NORMAL_READ)){echo 'server: '.$data;}while(true){//向socket_accept的套接流写入信息$data = fread(STDIN, 1024);if($data){socket_write($socket, $data."\n");}}//关闭建立的socket套接流socket_close($socket);

执行结果:

来源地址:https://blog.csdn.net/m0_68949064/article/details/124496444

--结束END--

本文标题: Socket的通信原理和使用

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

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

猜你喜欢
  • Socket的通信原理和使用
     目录 一、什么是 Socket? 二、Socket 通信过程         2.1 通信过程介绍        2.2 实现TCP建立连接的三次握手过程  三、 使用Socket进行通信【php】         3.1 PHP中So...
    99+
    2023-09-06
    网络 php
  • Socket通信原理和实践
    目录TCP/IP、UDP、Socket什么是TCP/IP、UDP?Socket在哪里呢?Socket是什么呢?你会使用它们吗?1、网络中进程之间如何通信?2、什么是Socket?so...
    99+
    2024-04-02
  • WebSocket的通信原理和使用
    一、什么是WebSocket? 1.1 简介 WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信,即允许服务器主动发送信息给客户端。因此,在WebSocket中,浏览器和服务器只...
    99+
    2023-09-13
    websocket php
  • Python基础之Socket通信原理
    上图是socket网络编程的流程图 至于数据在网络中是怎么走的,咱先不说,那个太底层了,咱今天见就说如何将数据从咱的屏幕上放到网络流中去。 这可不是键盘敲敲,回车一按的事情,在这背...
    99+
    2024-04-02
  • Python中Socket通信的原理是什么
    本篇文章给大家分享的是有关Python中Socket通信的原理是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。python是什么意思Python是一种跨平台的、具有解释性、...
    99+
    2023-06-14
  • Java中socket通信的原理是什么
    Java中socket通信的原理是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。java.net.Socket继承于java.lang.Object,有八个...
    99+
    2023-06-17
  • JAVA中实现原生的 socket 通信机制原理
    本文介绍了JAVA中实现原生的 socket 通信机制原理,分享给大家,具体如下:当前环境jdk == 1.8知识点 socket 的连接处理 IO 输入、输出流的处理 请求数据格式处理 请求模型优化场景今天,和大家聊一下 JAVA...
    99+
    2023-05-31
    java socket 通信
  • socket通信和tcp通信的区别有哪些
    本篇内容介绍了“socket通信和tcp通信的区别有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!socket通信和tcp通信的区别:1...
    99+
    2023-06-29
  • Android中使用socket使底层和framework通信的实现方法
    一般的native和framework的通信是通过jni,但是这一般只是framework调用native,native如果有消息要怎样通知上层 呢?android中GSP模块...
    99+
    2022-06-06
    方法 framework socket Android
  • 实时通信Socket io的使用示例详解
    目录引言1、什么是socket.io2、socket.io的使用3、客户端自带事件4、版本问题引言 最近在工作中,遇到了一个需求,需要和后台服务实时通信,获取各种设备的实时状态、以及...
    99+
    2022-11-16
    Socket io实时通信 Socket io
  • java与as3的socket通信
    as3 与java 都提供了Socket类用于网络通信, 但两者的使用也有较大的不同. 为了方便两者的通信, 我在做了一些实验的基础上, 写下获得的经验,以免忘记.as3 的socket 读写数据方法常用的有四个: readUTF, wri...
    99+
    2023-01-31
    通信 java socket
  • golang函数和管道通信的原理
    go 语言中函数和管道结合使用实现进程间通信。函数可将管道作为参数传递,通过管道发送或接收数据。管道是无缓冲通道,可用于在 goroutine 之间发送和接收数据,并支持无向和有向管道。...
    99+
    2024-05-04
    golang 管道 作用域
  • php使用socket简单实现通信功能
    目录WebSocket的作用什么是握手背景介绍WebSocket的作用 WebSock其实在平常使用,我们是时常见到的,用于实时通讯,例如我们常用的实时聊天、服务端向客户端消息推送、...
    99+
    2023-03-06
    php socket php socket通信
  • Socket通信的示例分析
    这篇文章将为大家详细讲解有关Socket通信的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。 建立网络通信...
    99+
    2023-06-27
  • Java使用Socket通信传输文件的方法示例
    本文实例讲述了Java使用Socket通信传输文件的方法。分享给大家供大家参考,具体如下:前面几篇文章介绍了使用Java的Socket编程和NIO包在Socket中的应用,这篇文章说说怎样利用Socket编程来实现简单的文件传输。这里由于前...
    99+
    2023-05-31
    java socket ava
  • Android Socket通信的简单实现
    公司要实现一个简单的聊天功能,提前研究一下Socket通信,而公司的服务端功能又没有实现,所以这里就把服务端的功能放到一个界面实现了。 直接上代码: <?xml v...
    99+
    2024-04-02
  • Java聊天室之使用Socket实现通信功能
    目录一、题目描述二、解题思路三、代码详解一、题目描述 题目实现:使用套接字实现了服务器端与客户端的通信。 运行程序,在服务器端的文本框中输入信息,然后按回车键,客户端就会收到服务器端...
    99+
    2022-11-13
    Java实现聊天室 Java聊天室 Java Socket 通信
  • php怎么使用socket简单实现通信功能
    这篇文章主要讲解了“php怎么使用socket简单实现通信功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php怎么使用socket简单实现通信功能”吧!WebSocket的作用WebSo...
    99+
    2023-07-05
  • java如何利用socket通信实现Modbus-RTU通信协议
    小编给大家分享一下java如何利用socket通信实现Modbus-RTU通信协议,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!ModbusModbus是一种串行...
    99+
    2023-06-14
  • 如何使用Python中的socket编程进行数据通信
    标题:Python中的socket编程及代码示例引言:在现代互联网时代,数据通信无处不在。而Python中的socket编程提供了一种简单而有效的方式来实现网络上的数据传输。本文将介绍如何使用Python的socket模块来进行数据通信,并...
    99+
    2023-10-22
    Python Socket编程 数据通信
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作