如何用PHP实现Socketwebsocket 服务器实现

一、Socket 简介
1、socket只不过是一个。
2、使用这个socket数据结构去开始一个客户端和服务器之间的会话。
3、服务器是一直在监听准备产生一个新的会话。当一个客户端连接服务器,它就打开服务器正在进行监听的一个端口进行会话。
4、服务器端接受客户端的连接请求,那么就进行一次循环。现在这个客户端就能够发送信息到服务器,服务器也能发送信息给客户端。
二、Socket 变量
产生一个Socket,你需要三个变量:一个协议、一个socket类型和一个公共协议类型。
2、Socket类型
SOCK_STREAM&&
3、公共协议
三、Socket函数
1、socket_create
作用:产生一个socket,相当于产生一个socket的数据结构
用法:socket_create ( int domain, int type, int protocol )
参数:domain,协议;type,类型;protocol,公共协议
返回:socket resource on success, or FALSE on error
2、socket_bind
作用:把socket绑定在一个IP地址和端口上
用法:socket_bind ( resource socket, string address [, int port] )
参数:socket,address,ip地址;port,端口
返回:Boolean
3、socket_accept
作用:接受一个Socket连接
用法:socket_accept ( resource socket )
参数:socket,socket resource
返回:Returns a new socket resource on success, or FALSE on error.
4、socket_connect()
作用:开始一个socket连接
用法:socket_connect ( resource socket, string address [, int port] )
参数:socket,address,ip地址;port,端口
返回:Boolean
5、socket_listen
作用:监听由指定socket的所有连接
用法:socket_listen ( resource socket [, int backlog] )
参数:socket,
返回:Boolean
6、socket_read
作用:读取指定长度的数据
用法:socket_read ( resource socket, int length [, int type] )
参数:socket,length,字符长度;type,PHP_BINARY_READ |PHP_NORMAL_READ
返回:string
7、socket_write
作用:写数据到socket缓存
用法:socket_write ( resource socket, string buffer [, int length] )
参数:socket,buffer,字符;length,字符长度;
返回:Boolean
8、socket_send()
作用:这个函数发送数据到已连接的socket
用法:socket_send ( resource socket, string buf, int len, int flags )
参数:socket,buf,字符;len,字符长度;
返回:Boolean
9、socket_last_error
作用:获取当前socket的最后错误代码
用法:socket_last_error ( [resource socket] )
参数:socket,
10、socket_strerror
作用:返回指定错误号的详细错误
用法:socket_strerror ( int errno )
参数:errno,socket_last_
返回:string
11、socket_close
作用:关闭一个socket资源
用法:socket_close ( [resource socket] )
参数:socket,
返回:null
四、使用说明
确认打开socket方法
a、编辑.ini文件,去掉 extension=php_sockets.dll 前面的注释:
b、代码来加载扩展库
if(!extension_loaded('sockets'))&{&&
五、socket编程
1、服务器端
a、初始化一个socket并且打开一个缓存收发数据。
b、等待连接,一旦产生一个连接,它将打印“Socket connected”在服务器端的屏幕上。
c、服务器检查缓冲区,如果缓冲区里有数据,它将把数据发送到连接过来的计算机。
然后它发送这个数据的接受信息,一旦它接受了信息,就把信息保存到数据里,并且让连接的计算机知道这些信息,最后关闭连接。
d、连接关闭后,服务器又开始处理下一次连接。
//&获取协议&&
a、客户端连接到服务器。客户端读取数据。
b、如果这是第一时间到达这个循环的首次连接,这个服务器将发送“NO DATA”返回给客户端。如果情况发生了,这个客户端在连接之上。
c、客户端发送它的数据到服务器,数据发送给服务器,客户端等待响应。一旦接受到响应,那么它将把响应写到屏幕上。
//&创建&socket&&
阅读(...) 评论()workerman 一个高性能的PHP Socket 服务器
最近在做一个小汽车跑一跑的游戏.游戏规则是用手机微信扫描,然后打开活动,小汽车会从一个手机屏幕跑到另外一个手机屏幕,可以手动点击切换跑道.
这个项目主要用到的技术就是php + redis + mysql ,框架是workman框架.今天给大家说说workman框架相关的知识.等这个游戏做完了,有感兴趣的可以留下邮箱,我会给大家发源码.
workerman是一个高性能的PHP socket 服务器框架,workerman基于PHP多进程以及libevent事件轮询库,PHP开发者只要实现一两个接口,便可以开发出自己的网络应用,例如Rpc服务、聊天室服务器、手机游戏服务器等。
workerman的目标是让PHP开发者更容易的开发出基于socket的高性能的应用服务,而不用去了解PHP socket以及PHP多进程细节。 workerman本身是一个PHP多进程服务器框架,具有PHP进程管理以及socket通信的模块,所以不依赖php-fpm、nginx或者apache等这些容器便可以独立运行。
workerman的特性 纯PHP开发
workerman完全使用PHP开发,使用workerman开发的应用程序不依赖php-fpm、apache、nginx这些容器就可以独立运行。 这使得PHP开发者开发、部署、调试应用程序非常方便。
支持PHP多进程
为了充分发挥服务器多CPU的性能,workerman默认支持多进程多任务。workerman开启一个主进程和多个子进程对外提供服务, 主进程负责监控子进程退出信号,并负责生成新的子进程去处理服务,这样做不仅提高了应用程序的性能,而且使得workerman更加稳定。
支持TCP、UDP
workerman支持TCP和UDP两种传输层协议,只需要更改配置的一个字段,便可以更换传输层协议,业务代码无需任何改动。
支持高并发
workerman支持Libevent事件轮询库(需要安装Libevent扩展), 使用Libevent在高并发时性能非常卓越,如果没有安装Libevent则使用PHP内置的Select相关系统调用。
支持各种应用层协议
接口上支持各种应用层协议,包括自定义协议。Workerman默认支持的协议有HTTP、WebSocket、以及简单的Text文本协议。 同时Workerman提供了通用的协议接口,开发者基于此接口便可以方便的开发出自己的协议。
支持长连接
很多时候需要PHP应用程序要与客户端保持长连接,比如聊天室、游戏等,但是传统的PHP容器(apache、nginx、php-fpm)很难做到这一点。 使用workerman可以轻松使用PHP长连接。php单个进程可以支持几千甚至几万的并发连接,多进程则可支持数十万甚至上百万的并发连接。
workerman内部带有监控统计模块,能够统计workerman自身的一些数据,如进程退出次数及退出状态,每个进程占用内存大小及监听的ip端口、每个进程启动时间、 进程运行的服务名、每个进程处理请求数、连接数、数据包发送失败量等等。这些信息可以本地运行php start.php status本地查看。
支持心跳检测
Gateway/Worker开发模型支持服务端的心跳检测,可以定时向客户端发送应用层的心跳,能够及时检测到客户端极端掉线情况(掉电、突发网络故障等)。
workman的特性还有其他的特别多,就不一一举例了,感兴趣的,可以去官网查手册.
责任编辑:
声明:本文由入驻搜狐号的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
今日搜狐热点6661人阅读
Socket(1)
1.&socket&概述
socket&也称作套接字,用于描述&IP&地址和端口,是一个通信链的句柄,可以用来实现不同计算机之间的通信。socket&是对&TCP&/&IP&协议的封装,它只是提供了一组针对&TCP&或者&UDP&进行编程的接口(API)。
socket&利用客户端&/&服务器端的模式巧妙地解决了进程之间建立通信连接的问题。
2.&socket&的工作原理
服务器端先初始化&socket,然后与端口绑定(bind),对端口进行监听(listen),等待客户端连接,调用accept阻塞。
这时,如果有客户端初始化一个&socket,然后请求连接服务器(connect),如果连接成功,客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把响应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。
3.&socket通信演示
服务器端的代码:
(在&E:\xampp\htdocs\demo&下新建一个php文件socket_server.php)
//&设置脚本最大执行时间,单位为秒,0表示永不超时
set_time_limit(0);
$address&=&'127.0.0.1';
$port&=&10005;&&&//&端口可以是1到65535之间的任何数字,前提是未被占用
//&创建并返回一个套接字(通讯节点),一个典型的网络连接由&2&个套接字构成,一个运行在服务器端,另一个运行在客户端
if(&($sock&=&socket_create(AF_INET,&SOCK_STREAM,&SOL_TCP))&===&false)&{
echo&&socket_create()&failed,&reason:&&&.&socket_strerror(socket_last_error())&.&&\n&;
//&绑定socket到具体的主机端口
if&(socket_bind($sock,&$address,&$port)&===&false)&{
echo&&socket_bind()&failed,&reason:&&&.&socket_strerror(socket_last_error($sock))&.&&\n&;
//&监听socket服务器上的请求连接,等待接入
if&(socket_listen($sock,&5)&===&false)&{
echo&&socket_listen()&failed,&reason:&&&.&socket_strerror(socket_last_error($sock))&.&&\n&;
//&确认客户端的连接请求,成功后,返回一个新的子socket句柄(子线程),用于通信
if&(($msgsock&=&socket_accept($sock))&===&false)&{
echo&&socket_accept()&failed,&reason:&&.socket_strerror(socket_last_error($sock))&.&&\n&;
$msg&=&&Welcome&to&connect&'$address'&.&\n&;
//&发送消息(数据)到客户端
if&(false&===&socket_write($msgsock,&$msg,&strlen($msg))){
echo&&socket_write()&failed,&reason:&&&.&socket_strerror(socket_last_error($sock))&.&\n&;
echo&&Read&client&message&\n&;
//&读取客户端的数据
$receivedData&=&socket_read($msgsock,&8192);
echo&&Received&message:&&.$receivedData.&\n&;;
//&将客户端发来的数据,进行处理,然后再发送数据给客户端
$responseData&=&'[time:'.date('Y-m-d&H:i:s').']'.PHP_EOL.'[data:'.trim($receivedData).']';
if&(false&===&socket_write($msgsock,&$responseData,&strlen($responseData)))&{&&
echo&&socket_write()&failed,&reason:&&&.&socket_strerror(socket_last_error($sock))&.&\n&;
//&关闭连接成功的子socket
socket_close($msgsock);
}&while(true);
//&关闭等待接入的socket
socket_close($sock);
服务器端的代码,需要在&cmd&下或者&CLI模式下运行,打开命令行窗口,输入如下命令:
php&E:\xampp\htdocs\demo\socket_server.php
就可以在服务器端运行socket服务。
注意:服务器端的命令行窗口不可关闭。
客户端的代码:
(在&E:\xampp\htdocs\demo&下新建一个php文件socket_client.php)
$address&=&'127.0.0.1';
$service_port&=&10005;
//&创建并返回一个套接字(通讯节点)
$socket&=&socket_create(AF_INET,&SOCK_STREAM,&SOL_TCP);
if&($socket&===&false)&{
echo&&socket_create()&failed,&reason:&&.socket_strerror(socket_last_error()).&\n&;
echo&&Attempting&to&connect&to&'$address'&on&port&'$service_port'...&;
//&发起socket连接请求
$result&=&socket_connect($socket,&$address,&$service_port);
if($result&===&false)&{
echo&&socket_connect()&failed,&reason:&&.socket_strerror(socket_last_error($socket)).&\n&;
echo&&Connect&success.&\n&;
$input&=&&This&is&a&message&from&client&.&\n&;
//&向socket服务器发送消息
socket_write($socket,&$input,&strlen($input));
echo&&&Client&send&success&\n&;
echo&&Reading&response:\n&;
//&读取socket服务器发送的消息
while&($out&=&socket_read($socket,&8192))&{
echo&PHP_EOL;
socket_close($socket); //&关闭socket连接
客户端的代码,可以在浏览器中运行(如:),也可以在命令行窗口运行,新打开一个cmd,输入如下命令:
php&E:\xampp\htdocs\demo\socket_client.php
就可以看到客户端与服务器端进行通信的结果。
最后,推荐使用&Workerman 来实现 socket 通信。(详情可参考&)
Workerman 是一款纯 PHP 开发的开源高性能的&PHP
Socket&服务器框架。被广泛的用于手机app、手游服务端、网络游戏服务器、聊天室服务器、硬件通讯服务器、智能家居、车联网、物联网等领域的开发。 支持TCP长连接,支持Websocket、HTTP等协议,支持自定义协议。基于workerman,开发者可以更专注于业务逻辑开发,不必再为 PHP Socket 底层开发而烦恼。
访问:300814次
积分:5134
排名:第6409名
原创:233篇
评论:39条
文章:20篇
阅读:13584
(4)(4)(4)(4)(5)(4)(6)(7)(4)(8)(12)(4)(5)(5)(31)(9)(37)(26)(9)(4)(10)(4)(21)(2)(1)(3)下次自动登录
现在的位置:
& 综合 & 正文
PHP实现Socket服务器的代码
&?php ob_implicit_flush(); set_time_limit(0);
$address = "192.40.7.93";//换成你自己的地址 $port = 10000;
if(($socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP)) == false)
echo "错误(socket_create):".socket_strerror(socket_last_error())."&br /&";
if(socket_bind($socket,$address,$port) == false)
echo "错误(socket_bind):".socket_strerror(socket_last_error())."&br /&";
if(socket_listen($socket) == false)
echo "错误(socket_listen):".socket_strerror(socket_last_error())."&br /&";
/* After the socket socket has been created using socket_create() and bound to a name with socket_bind(),
it may be told to listen for incoming connections on socket.
while(true){
if(($msgSocket = socket_accept($socket)) == false){
echo "错误(socket_accept):".socket_strerror(socket_last_error())."&br /&";
this function will accept incoming connections on that socket.
Once a successful connection is made, a new socket resource is returned, which may be used for communication.
If there are multiple connections queued on the socket, the first will be used.
If there are no pending connections, socket_accept() will block until a connection becomes present.
If socket has been made non-blocking using socket_set_blocking() or socket_set_nonblock(), FALSE will be returned.
$msg = "Welcome!&br /&";
//socket_write($msg,$msg,strlen($msg));
$command = "";
while(true){
if(($buf = socket_read($msgSocket,2048,PHP_BINARY_READ)) == false){
echo "错误(socket_read):".socket_strerror(socket_last_error())."&br /&";
The function socket_read() reads from the socket resource socket created by the socket_create() or socket_accept() functions.
The maximum number of bytes read is specified by the length parameter.
Otherwise you can use \r, \n, or \0 to end reading (depending on the type parameter, see below).
if(!$buf = trim($buf))
if($buf == "quit")
if($buf == "shutdown"){
socket_close($msgSocket);
$tallBack = "You say:$buf\n";
socket_write($msgSocket,$tallBack,strlen($tallBack));
if(ord($buf) != 13)
$command .= $
$command1 = "You Say:$command\r\n";
socket_write($msgSocket,$command1,strlen($command1));
echo "User typed:".$command."&br /&";
$command = "";
socket_close($msgSocket); }
socket_close($socket); ?&
然后打开CMD,输入:telnet 192.40.7.93 10000,自己体验去吧! 注,要把:php_sockets.dll 打开
【上篇】【下篇】2013年5月 总版技术专家分月排行榜第一
2016年7月 总版技术专家分月排行榜第二2016年3月 总版技术专家分月排行榜第二2015年12月 总版技术专家分月排行榜第二2014年8月 总版技术专家分月排行榜第二2014年7月 总版技术专家分月排行榜第二2013年6月 总版技术专家分月排行榜第二
匿名用户不能发表回复!|

我要回帖

更多关于 websocket 服务器实现 的文章

 

随机推荐