服务端

<?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. Swift教程之运算符重载

    http://blog.csdn.net/mengxiangyue/article/details/43437797 原文地址:http://www.raywenderlich.com/80818/o ...

  2. RabbitMQ消息队列(二): 工作队列

    1. 工作队列: 对于资源密集型任务,我们等待其处理完成在很多情况下是不现实的,比如无法在http的短暂请求窗口中处理大量耗时任务, 为了达到主线程无需等待,任务异步执行的要求,我们可以将任务加入任务 ...

  3. Google Breakpad 之一,跨平台crash 处理上报系统简介

    Google Breakpad 之一,跨平台crash 处理上报系统简介 http://blog.csdn.net/wpc320/article/details/8290501 Google Brea ...

  4. Oracle基础 01 表空间 tablespace

    --查看表空间 select * from dba_tablespaces; select * from v$tablespace; select * from dba_data_files; --查 ...

  5. bootstrap,ECMA

    前端UI(布局)框架 bootstrap Amaze UI BootStrap 全局css样式 栅格系统 container 容器 超小屏幕 手机 vw <768px 宽度 100% 小屏幕 平 ...

  6. WCF测试小程序

    using System;using System.Collections.Generic;using System.Linq;using System.Runtime.Serialization;u ...

  7. 《Java并发编程实战》学习笔记

    第2章 线程安全性 正确性: 某个类的行为与其规范完全一致. 2.1线程安全: 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或 ...

  8. go语言方法实例

    方便和函数的区别: 方法能给用户定义的类型添加新的行为.方法实际上也是函数,只是在声明时,在关键字func 和方法名之间增加了一个参数. package main import ( "fmt ...

  9. 常用的WebService一览表

    天气预报Web服务,数据来源于中国气象局Endpoint :http://www.webxml.com.cn/WebServices/WeatherWebService.asmxDisco       ...

  10. (六)if流程控制

    (1)单分支结构 if 条件判断;then fi 例 #!/bin/bash read -p "please input Y" num if [ "$num" ...