服务端

<?php
error_reporting(E_ALL);
set_time_limit(0);

$ip = "127.0.0.1";
$port = 1935;

function show_msg($msg){
echo iconv("UTF-8", "gb2312//IGNORE", $msg);
}

$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
if($socket < 0) {
show_msg("socket_create() 失败的原因是:" . socket_strerror($socket) . "\n");
exit;
}

if (!socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1)) {
show_msg("socket_set_option() 失败的原因是:" . socket_strerror($socket) . "\n");
exit;
}

if (!socket_set_nonblock($socket)) {
show_msg("socket_set_nonblock() 失败的原因是:" . socket_strerror($socket) . "\n");
exit;
}

$ret = socket_bind($socket, $ip, $port);
if (!$ret) {
show_msg("socket_bind() 失败的原因是:" . socket_strerror($socket) . "\n");
exit;
}

$ret = socket_listen($socket, 1);
if ($ret < 0 ) {
show_msg("socket_listen() 失败的原因是:" . socket_strerror($socket) . "\n");
exit;
}

$clients = array($socket);
while(true) {
$reads = $clients;
$writes=null;
$execs=null;
if(socket_select($reads, $writes, $execs, 2) < 1){
continue;
}

if(in_array($socket,$reads)) {
$newsock = socket_accept($socket);
socket_getpeername($newsock,$remoteIP,$remotePort);
$userSN = $remoteIP.'_'.$remotePort;
show_msg("-------------有新的连接($userSN):,客户数:".count($clients)."-------------\n");
$clients[$userSN] = $newsock;
}

foreach($reads as $read_sock) {
if($read_sock == $socket){
continue;
}
$data = @socket_read($read_sock, 2048, PHP_BINARY_READ);
socket_getpeername($read_sock, $remoteIP, $remotePort);
$userSN = $remoteIP.'_'.$remotePort;
if($data === false){
socket_close($read_sock);
unset($clients[$userSN]);
show_msg("($userSN)已断开连接\n");
continue;
}

show_msg("从($userSN)接收消息:,$data\n");
//广播
foreach($clients as $client){
if($client != $socket){
socket_getpeername($read_sock, $remoteIP, $remotePort);
$userSN = $remoteIP.'_'.$remotePort;
show_msg("发送消息到($userSN):$data\n");
@socket_write($client,$data,strlen($data));
}
}
}
}

客户端

<?php
error_reporting(E_ALL);
set_time_limit(0);

$ip = "127.0.0.1";
$port = 1935;

function show_msg($msg){
echo iconv("UTF-8", "gb2312//IGNORE", $msg);
}

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket < 0) {
show_msg("socket_create() 失败的原因是:" . socket_strerror($socket) . "\n");
exit;
}

$ret = socket_connect($socket, $ip, $port);
if ($ret < 0) {
show_msg("socket_connect() 失败的原因是:" . socket_strerror($ret) . "\n");
exit;
}
while(true){
$msg = "sadfasdfasdfasdf====";
socket_write($socket, $msg, strlen($msg));
show_msg("发送消息:$msg\n");

$msg = socket_read($socket, 8192);
if($msg){
show_msg("接收消息:$msg\n");
}

sleep(1);
}
socket_close($socket);
echo show_msg("关闭OK\n");

?>

最新文章

  1. 关于elasticsearch和kibana的时区和日期问题
  2. php就业网版本已改版成功
  3. (翻译) TFS源代码控制的未来 (TFSVC vs. Git)
  4. bashrc的加载
  5. 关于remote访问中的flex端配置问题
  6. Sqlserver 快照
  7. js split str.split(&amp;quot; &amp;quot;); split使用方法 在某处截字符串
  8. 《Linux命令行与shell脚本编程大全》 第十四章 学习笔记
  9. Hibernate学习笔记(1)Hibernate构造
  10. a href=&quot;javascript:void(0)&quot; 是什么意思?加不加上有什么区别?
  11. Java_中快速获取系统时间
  12. BASIC-2 01字串
  13. springMVC对异常处理的支持
  14. Java基础——集合(持续更新中)
  15. Linux(CentOS7)下如何配置多个JDK环境变量
  16. yum源 Python3 Django mysql安装
  17. 前端JS Excel解析导入
  18. ubuntu,day1基础命令,shutdown,man,touch,rm,mv,cp,stat,locale,apt,date,tzselect,cal,快捷方式,echo,查看文件
  19. django MTV架构下的网站开发步骤
  20. 对 data属性的使用之一

热门文章

  1. python-列表 字典 集合 元祖 字符串的相关总结练习
  2. Hadoop简单源码样例
  3. css用法(持续更新ing)
  4. [ 总结 ] web server iptables 简单配置
  5. 《Java编程思想》笔记 第十二章 通过异常处理错误
  6. selenium+python自动化79-文件下载(SendKeys)【转载】
  7. k8s的存储Volume
  8. 【集合类型的并发】Collections.synchronizedList
  9. AC日记——Magazine Ad codeforces 803d
  10. 【xunsearch】笔记