资讯专栏INFORMATION COLUMN

基于Socket实现简单的回声服务器

graf / 2263人阅读

摘要:上一篇文章是对编程的入门,这次我们基于实现一个简单的收发消息的服务。通过上面一篇文章,我们已经对于创建套接字的流程有了一定的了解,在这里就不多说这些了。第处将读取到的输入信息写入缓冲区,从而发送到服务端。

上一篇文章是对socket编程的入门,这次我们基于socket实现一个简单的收发消息的服务。

实现思路:

先说服务端:

接受客户端的连接

读取客户端发送过来的信息

将接受到信息发送给客户端

客户端:

首先连接到服务端

读取用户输入

将用户输入的信息发送给服务端

发送之后将会接收到服务端返回来的信息

由于PHP没有原生的从命令行接收用户输入的函数,所以这里通过以下方式来实现:

"/dev/stdin",这个是linux的标准输入,其实这个函数就是把linux的标准输入,重定向到我们的后端PHP程序了。然后我们的PHP程序就接收到了用户的输入,接着就可以把这个输入发送到回声服务程序的服务端了。

通过上面一篇文章,我们已经对于创建套接字的流程有了一定的了解,在这里就不多说这些了。

接下来开始服务端的实现:

echo_server.php:

代码解读:

第1处:这里直接使用了上一篇文章介绍的stream_socket_server函数,可以一次性的完成socket的创建、绑定以及监听。

第2处:开始监听我们创建的套接字(至于这里为什么加上@,因为stream_socket_accept函数如果一定时间内没有收到客户端的连接的话,会报一个warning)

第3处:通过fread函数,读取输入缓冲区,一次读取1024个字节

第4处:将读取到的字符写入输入缓冲,从而发送到客户端。

通过上面的程序我们已经实现了回声服务程序的服务端。

接下来我们可以运行一下,会发现我们的echo_server.php已经进入阻塞状态,等待客户端连接。

接着实现客户端:

echo_client.php

代码解读:

第1处:调用我们的重定向标准输入函数,调用此函数之后,如果不输入任何字符,程序是不会执行到下一行的,因为这里会被阻塞。

第2处:如果我们输入了q这个字符,将跳出while循环,紧接着会执行fclose,关闭连接。这里要注意一下,客户端关闭连接之后,会向服务端发送一个信号,告诉服务端我已经断开连接了,服务端接受到之后将关闭此客户端的连接。

第3处:将读取到的输入信息写入缓冲区,从而发送到服务端。

第4处到第5处是要重点讲解的内容。

此处为什么不直接通过fread函数一次性读取服务端返回的消息呢?

以下是对于这个问题的解答:

对于每一个socket,都有一个发送缓冲区和接收缓冲区。如果我们发送的数据足够大,则可能分为两次发送。也就是说fwrite之后,我们发送的字符有可能被分成两部分发送了,而服务端的代码是在不断的接收数据,然后返回数据。

所以客户端可能出现如下情况:发送一次字符之后,客户端尚未接收到全部的数据就调用了fread函数,从而打印多次。

所以对于这个问题最好的解决方法就是,我们客户端是能够提前知道要接收的字符大小的,所以这里通过strlen函数获取要接收的数据大小,如果不足这个大小则继续读取,直到满足条件之后再输出。

下面是程序运行的效果:

以上则是我们的回声服务程序,记得自己动手练习哦,眼过千遍不如手过一遍!

本人会持续分享一些关于编程以及编程自学相关的文章,记录自己的自学编程之路。同时希望自己的分享能够帮助一些对编程感兴趣以及正在编程道路上的朋友。欢迎大家关注我的公众号「阿毛的Coding之路 」。

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

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

相关文章

  • 实时音视频通信(RTC)中必须要了解三种关键算法

    摘要:拥塞控制算法包含三种拥塞控制算法,和。在早期的实现当中,这两个拥塞控制算法分别是在发送端和接收端实现的。音频算法音频算法指的是在发送端对发送信号依次进行回声消除降噪以及音量均衡操作,它包含三个算法回声消除,噪声抑制和自动增益控制。 1、背景 RTC(Real-time Communica...

    ivyzhang 评论0 收藏0
  • 红点王宇航:以实时连接场景为目标一些技术架构探索

    摘要:文红点联合创始人王宇航我今天分享的主题,是以实时连接场景为目标的一些技术架构探索。主要是关于红点在产品研发过程中,我们的技术选择,架构变化,还有这个过程中,我们的一些考虑。红点的第一个版本红点的第一个版本功能比较简单。 showImg(https://segmentfault.com/img/bVrBAw); 文 | 红点联合创始人 王宇航 我今天分享的主题,是以实时连接场景为目标的一...

    voyagelab 评论0 收藏0
  • PHPSocket编程之多进程回声务器

    摘要:所以这次采用多进程的方式来实现同时为多个客户端提供服务。而多进程则是通过创建多个进程来共同完成一件事。如果是子进程的执行环境,则返回。正常情况下,子进程是通过父进程创建的。以上则是我们的多进程回声服务程序。 上次的回声服务程序有个很大的缺点,就是只能同时连接一个客户端,这明显是不合理的。 所以这次采用多进程的方式来实现同时为多个客户端提供服务。 以下是最终的效果:showImg(htt...

    shengguo 评论0 收藏0

发表评论

0条评论

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