服务端

<?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");

?>

最简单的PHP socket的更多相关文章

  1. winsock2之最简单的win socket编程

    原文:winsock2之最简单的win socket编程 server.cpp #include <WINSOCK2.H> #include <stdio.h> #pragma ...

  2. UEditor编辑器和php简单的实现socket通信

    一.UEditor编辑器 使用这个编辑器是需要先下载编辑器文件,记得下载的时候放入自己的网站中,既然是php中使用,自然我下载的就是php的UEditor编辑器了,然后是utf-8的 其实使用很简单, ...

  3. 简单的异步Socket实现——SimpleSocket_V1.1

    简单的异步Socket实现——SimpleSocket_V1.1 笔者在前段时间的博客中分享了一段简单的异步.net的Socket实现.由于是笔者自己测试使用的.写的很粗糙.很简陋.于是花了点时间自己 ...

  4. 简单RPC之Socket实现

    最近看到Dubbo大神写得使用Socket实现的简单的RPC调用,对RPC的理解更简单了,然后根据大神的代码自己也重构了一下. RPC Server端代码,主要是使用ServerSocket获得rpc ...

  5. 使用Beetle简单构建高性能Socket tcp应用

    beetle是基于c#编写的高性能Socket tcp组件,它基于SocketAsyncEventArgs的实现并提供了发送队列和接收队列的支持,可以根据情况灵活地设置1-N个发送队列和接收队列.除了 ...

  6. Ajax跨域问题及解决方案 asp.net core 系列之允许跨越访问(Enable Cross-Origin Requests:CORS) c#中的Cache缓存技术 C#中的Cookie C#串口扫描枪的简单实现 c#Socket服务器与客户端的开发(2)

    Ajax跨域问题及解决方案   目录 复现Ajax跨域问题 Ajax跨域介绍 Ajax跨域解决方案 一. 在服务端添加响应头Access-Control-Allow-Origin 二. 使用JSONP ...

  7. 非常简洁简单的tcp socket库 XKSocket

    一个非常简洁简单的异步tcp socket库,主要就是分包的问题,处理组包,粘包等问题 非常适合新手:) 项目中带有使用示例. http://git.oschina.net/dreamzgj/XKSo ...

  8. 简单的php socket 实例

    server: <?php set_time_limit(0); $ip = '127.0.0.1'; $port = 8888; // 1. 创建 if( ($sock = socket_cr ...

  9. 简单的java socket 示例

    一.搭建服务器端 a).创建ServerSocket对象绑定监听端口. b).通过accept()方法监听客户端的请求. c).建立连接后,通过输入输出流读取客户端发送的请求信息. d).通过输出流向 ...

  10. C# Socket系列二 简单的创建 socket 通信

    看了系列一 我们开启了对socket tcp的监听状态,那么这一章我们来讲解怎么创建socket的通信代码 我新建一个类 TSocketBase public abstract class TSock ...

随机推荐

  1. mysql五-1:单表查询

    一 介绍 本节内容: 查询语法 关键字的执行优先级 简单查询 单条件查询:WHERE 分组查询:GROUP BY HAVING 查询排序:ORDER BY 限制查询的记录数:LIMIT 使用聚合函数查 ...

  2. HDU1028 (整数拆分)

    Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

  3. 使用Python获取计算机名,ip地址,mac地址等等

    获取计算机名 # 获取计算机名,常用的方法有三种 import os import socket # method one name = socket.gethostname() print(name ...

  4. #!bin/sh是啥

    第一句的#!是对脚本的解释器程序路径,脚本的内容是由解释器解释的,我们可以用各种各样的解释器来写对应的脚本,比如说/bin/csh脚本,/bin/perl脚本,/bin/awk脚本,/bin/sed脚 ...

  5. (2)三剑客之grep

    1)grep和egrep定义grep:在文件中全局查找指定的正则表达式,并打印所有包含该表达式的行egrep:扩展的egrep,支持更多的正则表达式元字符2)命令格式语法:grep [选项] patt ...

  6. magento 搬家

    1.删除浏览记录: log_customer log_visitor log_visitor_info log_url log_url_info log_quote report_viewed_pro ...

  7. [win7] 带网络的安全模式,启动QQEIMPlatform第三方服务

    REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\SafeBoot\Network\QQEIMPlatform" /VE /T REG_ ...

  8. HDU 1017 A Mathematical Curiosity (输出格式,穷举)

    #include<stdio.h> int main() { int N; int n,m; int a,b; int cas; scanf("%d",&N); ...

  9. UVa1599 Ideal Path(双向bfs+字典序+非简单图的最短路+队列判重)

    题目大意: 对于一个n个房间m条路径的迷宫(Labyrinth)(2<=n<=100000, 1<=m<=200000),每条路径上都涂有颜色,颜色取值范围为1<=c&l ...

  10. 树链剖分【p2568】[SDOI2011]染色

    Description 给定一颗有\(n\)个节点的无根树和\(m\)个操作,操作有\(2\)类: 1.将节点\(a\)到节点\(b\)路径上所有点染成颜色\(c\) 2.询问节点\(a\)到节点\( ...