php socket编程实现聊天程序,老雷socket编程之PHP利用socket扩展实现聊天服务

老雷socket编程之PHP利用socket扩展实现聊天服务

socket聊天服务原理

37db07480dd205f29ab14d05316fb3a2.png

PHP有两个socket的扩展 sockets和streams

sockets

socket_create(AF_INET, SOCK_STREAM, SOL_TCP)

socket_write

socket_read

socket_close

客户端

socket_connect($socket, $address, $service_port);

服务端

socket_bind($sock, $address, $port)

socket_listen($sock)

socket_accept

Streams

客户端

stream_socket_client

fwrite

fread

fclose($fp);

服务端

stream_socket_server

stream_set_blocking

stream_select

stream_socket_accept conn

stream_socket_recvfrom

stream_socket_sendto

stream_socket_shutdown

课后练习

使用sockets和streams扩展实现客户端跟服务端的功能。

服务端代码 客服端可使用udp&tcp测试工具

class SocketService

{

public $host="tcp://0.0.0.0:8000";

private $address;

private $port;

private $_sockets;

public $clients;

public $maxid=1000;

public function __construct($address = '', $port='')

{

if(!empty($address)){

$this->address = $address;

}

if(!empty($port)) {

$this->port = $port;

}

}

public function onConnect($client_id){

echo "Client client_id:{$client_id} \n";

}

public function onMessage($client_id,$msg){

//发给所有的

foreach($this->clients as $kk=>$cc){

if($kk>0){

$this->send($cc, $msg);

}

}

}

public function onClose($client_id){

echo "$client_id close \n";

}

public function service(){

//获取tcp协议号码。

$tcp = getprotobyname("tcp");

$sock = stream_socket_server($this->host, $errno, $errstr);;

if(!$sock)

{

throw new Exception("failed to create socket: ".socket_strerror($sock)."\n");

}

stream_set_blocking($sock,0);

$this->_sockets = $sock;

echo "listen on $this->address $this->host ... \n";

}

public function run(){

$this->service();

$this->clients[] = $this->_sockets;

while (true){

$changes = $this->clients;

//$write = NULL;

//$except = NULL;

stream_select($changes, $write, $except, NULL);

foreach ($changes as $key => $_sock){

if($this->_sockets == $_sock){ //判断是不是新接入的socket

if(($newClient = stream_socket_accept($_sock)) === false){

unset($this->clients[$key]);

continue;

}

$line = trim(stream_socket_recvfrom($newClient, 1024));

$this->maxid++;

$this->clients[$this->maxid] = $newClient;

$this->onConnect($this->maxid);

} else {

$msg=@stream_socket_recvfrom($_sock, 2048);

if(!$msg){

stream_socket_shutdown($this->clients[$key],STREAM_SHUT_RDWR);

unset($this->clients[$key]);

$this->onClose($key);

}else{

$msg=$this->decode($msg);

$this->onMessage($key,$msg);

}

}

}

}

}

/**

* 发送数据

* @param $newClinet 新接入的socket

* @param $msg 要发送的数据

* @return int|string

*/

public function send($newClinet, $msg){

$msg=$this->encode($msg);

if($msg){

stream_socket_sendto($newClinet, $msg);

}

}

public function encode($msg){

return $msg . "\n";

}

public function decode($msg){

return rtrim($msg, "\r\n");

}

/**

* 关闭socket

*/

public function close(){

return socket_close($this->_sockets);

}

}

$sock = new SocketService('127.0.0.1','9000');

$sock->run();

老雷socket编程之websocket实现

老雷socket编程之websocket实现 我们主要实现私聊和群聊两个功能,要在web端实现想微信QQ那样的即时通讯的功能,我们需要了解一下websocket.websocket是一种可以双向通讯的 ...

iPhone socket 编程之BSD Socket篇

iPhone socket 编程之BSD Socket篇 收藏在进行iPhone网络通讯程序的开发中,不可避免的要利用Socket套接字.iPhone提供了Socket网络编程的接口CFSocket, ...

[深入浅出WP8.1(Runtime)]Socket编程之UDP协议

13.3 Socket编程之UDP协议 UDP协议和TCP协议都是Socket编程的协议,但是与TCP协议不同,UDP协议并不提供超时重传,出错重传等功能,也就是说其是不可靠的协议.UDP适用于一次只 ...

PHP Socket 编程之9个主要函数的使用之测试案例

php的socket编程算是比较难以理解的东西吧,不过,我们只要理解socket几个函数之间的关系,以及它们所扮演的角色,那么理解起来应该不是很难了,在笔者看来,socket编程,其实就是建立一个网络 ...

Java Socket 编程之Socket与ServerSocket的区别

http://www.cnblogs.com/hq-antoine/archive/2012/02/11/2346474.html 1.1 ServerSocket类    创建一个ServerSoc ...

python的socket编程之udp编程

在上篇文章中,仅仅讲述了如何进行了TCP编程,在本章中,将讲述使用udp进行编码,先看如下的代码,服务器端: root@python 513]# cat serverudp.py #!/usr/bin ...

socket编程之二:两种链接类型tcp和udp

前面一篇文章说到了一些计算机网络的基础知识.引入了socket.从这节開始,就进入正题了. 一 概述 TCP:Transimission Control Protocol传输控制协议. UPD:Use ...

Linux系统编程(32)—— socket编程之TCP服务器与客户端

TCP协议的客户端/服务器程序的一般流程 服务器调用socket().bind().listen()完成初始化后,调用accept()阻塞等待,处于监听端口的状态,客户端调用socket()初始化后, ...

socket编程之TCP/UDP

目标: 1.编写TCP服务端客户端,实现客户端发送数据,服务端接收打印 2.采用OOP方式编写TCP服务端客户端,实现客户端发送数据,服务端添加时间戳,返回给客户端 3.采用OOP方式编写UDP服务端 ...

随机推荐

团队第二周:SRS文档

项目计划: 对于这次的实验,我们组计划进行一个图书管理系统的项目书写,在第一阶段,对该项目先进行一下规划,总结该项目的注意事项以及实验要求,并加以实施. 下面我先对我们项目的要求坐一下说明: 1定义五 ...

(转)JAVA AJAX教程第四章—AJAX和MVC的简单结合

这里我们再理解了AJAX后,开始来用实例感受AJAX的力量. 今天我最后要实现的效果,当鼠标放到图片上时会根据,会把数据库库里的数据读出,通过显示框显示出来.这个在很多网上商店都有用到这里效果,我们这 ...

Filter的执行顺序及实例

学习中的收藏,该文出自http://www.cnblogs.com/Fskjb/archive/2010/03/27/1698448.html 在此,非常感谢该文章作者的分享,本文完全转载自上面链接, ...

DropDownListFor使用ViewData进行绑定的示例

特别注意,经实践: 此方法的ViewBag的名称必须和new SelectList()中的最后一个参数,即下拉框的默认值的名称必须相同,如: ViewBag.Title = WebConst.UnSe ...

js或jquery实现图片轮播

如: 1.//3个div的统一class = 'div' var index =0; //3秒轮播一次 var timer = setInterval(function(){     index =  ...

golang 基本数据结构使用

1 goalng struct 1.1 var s1 student 1.2 s2 := student {"zhou", 33} 1.3 s3 := student {Name: ...

【MySql】Order By 排序

你可以使用任何字段来作为排序的条件,从而返回排序后的查询结果. 你可以设定多个字段来排序. 你可以使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列. 默认情况下,它是按升序排列. 你 ...

fscanf_s与scanf_s的宽度参数与缓冲区参数分析

fscanf_s函数 在文件操作中经常会用到fscanf这个函数,但是在VC和VS中会有警告 意思是编译器觉得fscanf不安全,叫你考虑用一下fscanf_s这个函数来代替fscanf,fscanf ...

C++ 中的指针、引用以及函数调用中的问题

参考链接:https://www.cnblogs.com/dolphin0520/archive/2011/04/03/2004869.html 函数传参的方式有三种: (1)值传递: (2)引用传递 ...

sql in语句

转自http://www.1keydata.com/cn/sql/sql-in.php 在 SQL 中,在两个情况下会用到 IN 这个指令:这一页将介绍其中之一 -- 与 WHERE 有关的那一个情况 ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值