什么是socket

socket:网络上的两个程序通过一个双向的通信连接实现数据的交换,连接的一端称为一个socket.

因此socket运行是置少有2个端组成,一个为服务端一个为客户端(客户端可以多个).

socket工作原理

socket的几个关键函数

socket的关键函数1:

      socket_create($net参数1,$stream参数2,$protocol参数3)

    作用:创建一个socket套接字,就是一个网络数据流。

    返回值:一个套接字,或者是false,参数错误发出E_WARNING警告

    php的在线手册那里说得更清楚:

    socket_create创建并返回一个套接字,也称作一个通讯节点。一个典型的网络连接由 2 个套接字构成,一个运行在客户端,另一个运行在服务器端。

    参数1是:网络协议,

    网络协议有哪些?它的选择项就下面这三个:

    AF_INET:     IPv4 网络协议。TCP 和 UDP 都可使用此协议。一般都用这个,你懂的。

    AF_INET6:   IPv6 网络协议。TCP 和 UDP 都可使用此协议。

    AF_UNIX:      本地通讯协议。具有高性能和低成本的 IPC(进程间通讯)。

    参数2:套接字流,选项有:

    SOCK_STREAM  SOCK_DGRAM  SOCK_SEQPACKET  SOCK_RAW  SOCK_RDM。

    这里只对前两个进行解释:

    SOCK_STREAM  TCP 协议套接字。

    SOCK_DGRAM   UDP协议套接字。

    欲了解更多请链接这里:http://php.net/manual/zh/function.socket-create.php

    参数3:protocol协议,选项有:

    SOL_TCP:  TCP 协议。

    SOL_UDP:  UDP协议。

    从这里可以看出,其实socket_create函数的第二个参数和第三个参数是相关联的。

    比如,假如你第一个参数应用IPv4协议:AF_INET,然后,第二个参数应用的是TCP套接字:SOCK_STREAM,

    那么第三个参数必须要用SOL_TCP

关键函数2:

    socket_connect($socket参数1,$ip参数2,$port参数3)

    作用:连接一个套接字,返回值为true或者false

    参数1:socket_create的函数返回值

    参数2:ip地址

    参数3:端口号

关键函数3:

    socket_bind($socket参数1,$ip参数2,$port参数3)

    作用:绑定一个套接字,返回值为true或者false

    参数1:socket_create的函数返回值

    参数2:ip地址

    参数3:端口号

关键函数4:

    socket_listen($socket参数1,$backlog 参数2)

    作用:监听一个套接字,返回值为true或者false

    参数1:socket_create的函数返回值

    参数2:最大监听套接字个数

关键函数5:

    socket_accept($socket)

    作用:接收套接字的资源信息,成功返回套接字的信息资源,失败为false

      参数:socket_create的函数返回值

关键函数6:

    socket_read($socket参数1,$length参数2)

    作用:读取套接字的资源信息,

    返回值:成功把套接字的资源转化为字符串信息,失败为false

     参数1:socket_create或者socket_accept的函数返回值

    参数2:读取的字符串的长度

关键函数7:

    socket_write($socket参数1,$msg参数2,$strlen参数3)

    作用:把数据写入套接字中

    返回值:成功返回字符串的字节长度,失败为false

     参数1:socket_create或者socket_accept的函数返回值

    参数2:字符串

    参数3:字符串的长度

关键函数8:

    socket_close($socket)

    作用:关闭套接字

    返回值:成功返回true,失败为false

      参数:socket_create或者socket_accept的函数返回值

    这八个函数是socket的核心函数,下面列举两个个比较重要的函数

    socket_last_error($socket),参数为socket_create的返回值,作用是获取套接字的最后一条错误码号,返回值套接字code

    socket_strerror($code),参数为socket_last_error函数的返回值,获取code的字符串信息,返回值也就是套接字的错误信息

服务端脚本,server_socket.php

<?php
//创建服务端的socket套接流,net协议为IPv4,protocol协议为TCP
$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP); /*绑定接收的套接流主机和端口,与客户端相对应*/
if(socket_bind($socket,'127.0.0.1',8888) == false){
echo 'server bind fail:'.socket_strerror(socket_last_error());
/*这里的127.0.0.1是在本地主机测试,你如果有多台电脑,可以写IP地址*/
}
//监听套接流
if(socket_listen($socket,4)==false){
echo 'server listen fail:'.socket_strerror(socket_last_error());
}
//让服务器无限获取客户端传过来的信息
do{
/*接收客户端传过来的信息*/
$accept_resource = socket_accept($socket);
/*socket_accept的作用就是接受socket_bind()所绑定的主机发过来的套接流*/ if($accept_resource !== false){
/*读取客户端传过来的资源,并转化为字符串*/
$string = socket_read($accept_resource,1024);
/*socket_read的作用就是读出socket_accept()的资源并把它转化为字符串*/ echo 'server receive is :'.$string.PHP_EOL;//PHP_EOL为php的换行预定义常量
if($string != false){
$return_client = 'server receive is : '.$string.PHP_EOL;
/*向socket_accept的套接流写入信息,也就是回馈信息给socket_bind()所绑定的主机客户端*/
socket_write($accept_resource,$return_client,strlen($return_client));
/*socket_write的作用是向socket_create的套接流写入信息,或者向socket_accept的套接流写入信息*/
}else{
echo 'socket_read is fail';
}
/*socket_close的作用是关闭socket_create()或者socket_accept()所建立的套接流*/
socket_close($accept_resource);
}
}while(true);
socket_close($socket); ?>

小提示:请注意上面的socket_bind,socket_listen,socket_accept三个函数的执行顺序不可更改,也就是说

必须先执行socket_bind,再执行socket_listen,最后才执行socket_accept

客户端脚本,client_socket.php

<?php
//创建一个socket套接流
$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
/****************设置socket连接选项,这两个步骤你可以省略*************/
//接收套接流的最大超时时间1秒,后面是微秒单位超时时间,设置为零,表示不管它
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array("sec" => 1, "usec" => 0));
//发送套接流的最大超时时间为6秒
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array("sec" => 6, "usec" => 0));
/****************设置socket连接选项,这两个步骤你可以省略*************/ //连接服务端的套接流,这一步就是使客户端与服务器端的套接流建立联系
if(socket_connect($socket,'127.0.0.1',8888) == false){
echo 'connect fail massege:'.socket_strerror(socket_last_error());
}else{
$message = 'Hello, socket!这是测试!';
//转为GBK编码,处理乱码问题,这要看你的编码情况而定,每个人的编码都不同
// $message = mb_convert_encoding($message,'GBK','UTF-8');
//向服务端写入字符串信息 if(socket_write($socket,$message,strlen($message)) == false){
echo 'fail to write'.socket_strerror(socket_last_error()); }else{
echo 'client write success'.PHP_EOL;
//读取服务端返回来的套接流信息
while($callback = socket_read($socket,1024)){
echo 'server return message is:'.PHP_EOL.$callback;
}
}
}
socket_close($socket);//工作完毕,关闭套接流 ?>

测试效果

后记补充:

socket_set_option($socket参数1 ,$level 参数2,$optname 参数3,$optval 参数4)

这个函数的作用是给套接字设置数据流选项,还是一个很重要的函数。

参数1:socket_create或者socket_accept的函数返回值

参数2:SOL_SOCKET,好像只有这个选项

参数3与参数4是相关联的,

参数3可为:SO_REUSEADDR  SO_RCVTIMEO     S0_SNDTIMEO

解释一下:

SO_REUSEADDR  是让套接字端口释放后立即就可以被再次使用

        参数3假如是这个,则参数4可以为true或者false

SO_RCVTIMEO   是套接字的接收资源的最大超时时间

SO_SNDTIMEO   是套接字的发送资源的最大超时时间

  参数3假如是这两个,则参数4是一个这样的数组array('sec'=>1,'usec'=>500000)

  数组里面都是设置超时的最大时间,不过,一个是秒为单位,一个是微秒单位,作用都一样

php 的 socket简单原理及实现的更多相关文章

  1. php socket简单原理及实现笔记

    1.什么是socket? socket:网络上的两个程序通过一个双向的通信连接实现数据的交换,连接的一端称为一个socket. 因此socket运行是置少有2个端组成,一个为服务端一个为客户端(客户端 ...

  2. Win Socket编程原理及简单实例

    [转]http://www.cnblogs.com/tornadomeet/archive/2012/04/11/2442140.html 使用Linux Socket做了小型的分布式,如Linux ...

  3. Linux C Socket编程原理及简单实例

    部分转自:http://goodcandle.cnblogs.com/archive/2005/12/10/294652.aspx 1.   什么是TCP/IP.UDP? 2.   Socket在哪里 ...

  4. Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)

    转载地址:http://blog.csdn.net/mad1989/article/details/9147661 ZERO.前言 有关通信原理内容是在网上或百科整理得到,代码部分为本人所写,如果不当 ...

  5. socket编程原理

    socket编程原理 1.问题的引入 1) 普通的I/O操作过程: UNIX系统的I/O命令集,是从Maltics和早期系统中的命令演变出来的,其模式为打开一读/写一关闭(open-write-rea ...

  6. Java基础知识强化之网络编程笔记02:Socket通信原理图解

    1. Socket (1)Socket套接字  网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字 (2)Socket原理机制:  • 通信两端都有Socket.  • 网 ...

  7. Socket通信原理简介

    Socket通信原理简介 字数1011 阅读1766 评论2 喜欢11 何谓socket 计算机,顾名思义即是用来做计算.因而也需要输入和输出,输入需要计算的条件,输出计算结果.这些输入输出可以抽象为 ...

  8. 【VS开发】socket编程原理

    socket编程原理 1.问题的引入 1) 普通的I/O操作过程: UNIX系统的I/O命令集,是从Maltics和早期系统中的命令演变出来的,其模式为打开一读/写一关闭(open-write-rea ...

  9. Python Socket通信原理

    [Python之旅]第五篇(一):Python Socket通信原理   python Socket 通信理论 socket例子 摘要:  只要和网络服务涉及的,就离不开Socket以及Socket编 ...

随机推荐

  1. P1197 [JSOI2008]星球大战——链式前向星+并查集

    https://www.luogu.org/problem/P1197 这道题算是关闭农场的加强版吧,数据有点大,矩阵存不下: 也是记录删点操作,从后往前加边: 先将每个点都算成一个连通块,然后每连一 ...

  2. c++ 字符串转数字

    #字符串转整数 string ss="-99"; cout<< stoi(ss)<<endl;

  3. FOI冬令营 Day2

    目录 T1.直径(diameter) 传送门 Code T2.定价(price) 传送门 Code T3.排序(sort) 传送门 Code T1.直径(diameter) 传送门 Code //20 ...

  4. Linux MySQL 储存中文失败简单解决办法

    如图,保存的中文都变成了??? show create table table_name;可以查到表的默认编码 这里看到默认的字符集是latin1,而不是utf8 需要修改 alter databas ...

  5. MongoDB与RoboMongo的安装+python基本操作MongoDB

        MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是可以应用于各种规模的企业.各个行业以及各类应用程序的开源数据库.作为一个适用于敏捷开发的数据库,MongoDB的数据 ...

  6. thymeleaf 与shiro 整合错误

    错误 @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { // ...

  7. Code First 迁移----官方 应用程序启动时自动升级(MigrateDatabaseToLatestVersion 初始值设定项)

    Code First 迁移 如果使用的是 Code First 工作流,推荐使用 Code First 迁移改进应用程序的数据库架构. 迁移提供一组允许以下操作的工具: 创建可用于 EF 模型的初始数 ...

  8. OpenJudge计算概论-最长单词2

    /*======================================================================== 最长单词2 总时间限制: 1000ms 内存限制: ...

  9. OpenJudge计算概论-矩阵交换行

    /*======================================================================== 矩阵交换行 总时间限制: 1000ms 内存限制: ...

  10. 总结解决 Android-Studio 编译耗时(好久、太长)问题

    首先通过搜索有关Android-Studio 编译耗时(好久.太长)问题的博客,速度确实有所改善. 一.暂时解决 Android-Studio 编译耗时(好久.太长)问题 本文链接:https://b ...