资讯专栏INFORMATION COLUMN

从零带你入门Socket编程

glumes / 3148人阅读

摘要:网络编程就是如何在程序中实现两台计算机的通信。而网络编程最终要开发出来的应用大多数为支持各种协议的服务器,比如服务器服务器或者是基于自定义的协议实现的服务。在开始编码之前,首先介绍一下协议栈上图是我从网络编程这本书拍下来的。

相信大部分的初中级PHP程序员平时写的业务代码占绝大多数,写厌了平时的增删改查,何不体验体验网络编程的魅力呢。

学习网络编程能够很好的理解一些底层的网络通信,比如Apache、Nginx如何接受HTTP请求的,然后又是如何和PHP来进行交互的。Nginx为什么能处理高并发的请求?常听别人说的同步IO、异步IO、阻塞IO、非阻塞IO…等等到底是什么意思?相信你学习了网络编程之后就会对其有深刻的理解。当然本文只是一个socket编程的入门,暂时是不包括以上内容的。

应该有一部分同学是没有接触过网络编程的,在这里首先介绍一下网络编程是什么意思。

网络编程就是如何在程序中实现两台计算机的通信。而网络编程最终要开发出来的应用大多数为支持各种协议的服务器,比如:http服务器、websocket服务器、或者是基于自定义的协议实现的服务。其本质上是基于socket套接字,套接字把TCP的通信机制在内部已经实现了,开发人员只注重编码就行了。至于为什么叫套接字,这里我就不讲述了。

在开始编码之前,首先介绍一下TCP协议栈:

上图是我从《TCP/IP网络编程》这本书拍下来的。

TCP/IP协议栈的诞生起源于一个问题:如何通过因特网完成数据的有效传输?

所以基于这个问题,硬件、系统、路由等各个领域的专家聚集在一起,最终定义出了多套大大小小的协议。而我们要讲解的TCP/IP协议,则是处于传输层的。

下面是TCP协议在数据传输方面的简单图示:

上面的图中,主机A向主机B发送数据时,主机A必须在接收到主机B返回的确认消息后,才发送下一个数据包。通过上图我们不难看出TCP协议的最终目的就是:保证数据传输的有效性。对于初学者,我们暂时只需记住以上结论即可。

下面主要介绍PHPsocket开发所要使用的一些标准函数和其用法,最终编写出一个可以向客户端发送“hello,socket”的程序。

创建一个在本机端口监听的套接字需要四个步骤:

1.创建套接字

2.为这个套接字分配IP和端口号

3.使此套接字转换为可接受请求状态

4.开始受理请求

接下来介绍PHP完成这些步骤所需要的函数:

socket_create 创建套接字

socket_bind 分配IP和端口

socket_listen 监听连接

socket_accept 受理连接

socket_connect 连接一个套接字

socket_write 写入数据到套接字

socket_read 从套接字读取最大长度字节数

我们暂时只需知道这个函数是做什么的就行了,至于详细的参数含义可以等做完下面的例子之后在去PHP官网查看。

接下将是最重要的编码环节:

以下server.php为服务端的代码:

代码解读:

第一处:创建一个套接字并且使用IPV4协议,至于参数什么意思相信各位具有查阅文档的能力

第二处:将该套接字绑定到本机的8899端口

第三处:调用 socket_listen 开始监听此端口的请求

第四处:开始受理连接请求,这里要注意一下,如果没有接收到请求的话,此函数会一直阻塞

第五到第七处:向发送请求的客户端发送“hello,socket”字符串,最后一定注意关闭socket资源

我们运行一下这个文件:

输入:php server.php

按下回车之后我们会看到此脚本已经进入阻塞状态:

到这里我们最基本的一个服务端程序已经完成了,这里可能会有小伙伴有疑问了,以上第四处到底是受理的什么请求呢?

那么接下来所要编写的客户端程序则是这个问题的最好解答。

客户端程序相对来说比较简单一点:

分为两步:

1.创建用于向服务端指定端口发送请求的套接字

2.通过调用连接函数向服务端发送连接请求

下面开始客户端client.php的编写:

代码解读:

第一处:连接到以上服务端程序所监听的8899端口

第二处:接收服务端发来的“hello,socket”消息

第三处:输出接收到的字符

接下来我们先运行服务端:

php server.php

然后再运行客户端:

php client.php

将看到如下结果:

成功的输出了“hello,socket”字符串!

相信大家看到这里已经对socket编程有一个初步的认识。

接下来介绍几个函数可以很方便的完成以上操作:

对于以上的服务端程序我们可以使用stream_socket_server 函数来改写的更为简洁,使用stream_socket_server函数我们可以一次性的创建、绑定、监听三个步骤。

以下是修改过的server_v2.php

代码解答:

第一处:使用stream_socket_server 一次性创建套接字,绑定到8899端口,开始监听 三个步骤。

第二处:由于是用stream_socket_server函数创建的资源,与socket_create创建的资源不同,所以这里全部使用操作stream资源的函数。

关于phpSocket编程的入门,就先介绍到这里,如有错误的地方欢迎后台回复指出哦。

如果觉得本文不错的话,可以关注我的公众号: 阿毛的Coding之路

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30846.html

相关文章

  • 网络编程 - 收藏集 - 掘金

    摘要:个高级多线程面试题及回答后端掘金在任何面试当中多线程和并发方面的问题都是必不可少的一部分。目前在生产环基于的技术问答网站系统实现后端掘金这一篇博客将详细介绍一个基于的问答网站的实现,有详细的代码。 15 个高级 Java 多线程面试题及回答 - 后端 - 掘金在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分。如果你想获得任何股票投资银行的前台资讯职位,那么你应该准备很多...

    justCoding 评论0 收藏0
  • 网络编程 - 收藏集 - 掘金

    摘要:个高级多线程面试题及回答后端掘金在任何面试当中多线程和并发方面的问题都是必不可少的一部分。目前在生产环基于的技术问答网站系统实现后端掘金这一篇博客将详细介绍一个基于的问答网站的实现,有详细的代码。 15 个高级 Java 多线程面试题及回答 - 后端 - 掘金在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分。如果你想获得任何股票投资银行的前台资讯职位,那么你应该准备很多...

    selfimpr 评论0 收藏0

发表评论

0条评论

glumes

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<