首页 php教程 php手册 phpsocket客户端以及服务器例子

phpsocket客户端以及服务器例子

Jun 13, 2016 am 09:32 AM
例子 客户端 服务器

一个菜鸟朋友,突然问了我这个问题...现在稍稍有点时间,就写了一个简单的例子给他,顺便贴上来

服务器端:

<?php
/**
 * @author 邹颢	zouhao619@gmail.com
 */
class SocketServer{
	private $_port=&#39;9000&#39;;
	private $_address=&#39;127.0.0.1&#39;;
	private $_client_socket_list=array();
	public function __set($name,$val){
		$this->$name=$val;
	}
	private function _showError($error){
		exit($error);
	}
	/**
	 * 开始进行socket服务器端监听端口
	 */
	public function start(){
		// 创建端口
		if (($sock = socket_create ( AF_INET, SOCK_STREAM, SOL_TCP )) === false) {
			$this->_showError("socket_create() failed :reason:" . socket_strerror ( socket_last_error () ));
		}
		// 绑定
		if (socket_bind ( $sock, $this->_address, $this->_port ) === false) {
			$this->_showError("socket_bind() failed :reason:" . socket_strerror ( socket_last_error ( $sock ) ));
		}
		// 监听
		if (socket_listen ( $sock, 5 ) === false) {
			$this->_showError("socket_bind() failed :reason:" . socket_strerror ( socket_last_error ( $sock ) ) );
		}
		do {
			//当有一个客户端连接的时候
			if ($client_socket=socket_accept ( $sock )) {
				$count = count ( $this->_client_socket_list ) + 1;
				//把新来的用户加入 客户端数组里
				$this->_client_socket_list[]=$client_socket;
				echo "new connection:\r\n";//服务器端输出当前正在连接的客户端数量
				echo "current connection:{$count}\r\n";
				//接受客户端传过来的字符串
				$msg=$this->read($client_socket);
				echo "client:{$msg}\r\n";
				//服务器向客户端传值
				$my_msg="I am fine,think you\r\n";
				$this->send($client_socket,$my_msg);
			}
			/**
			 * 这段代码给你参考,用来判断是否有客户端主动失去连接
			else{
				foreach ( $this->_client_socket_list as $socket ) {
					$len = socket_recv ($socket, $buffer, 2048, 0 ); // 接受一下客户端信息,如果为0代表断开连接
					if ($len < 7) {
						//这里写是去连接的客户端业务
					}
				}
			}
			 */
				
		}while(true);	
	}
	/**
	 * 发送数据给客户端
	 */
	public function send($client_socket,$str){  
		return socket_write ( $client_socket,$str, strlen ( $str ) );
	}
	/**
	 * 从客户端接受数据
	 */
	public function read($client_socket){
		return socket_read ( $client_socket, 8192 );//8192实际代表的接受长度,我用819292表示长一点,这样长一点的字符串也可以接受到,不到8192也没关系,会自动识别
	}
	
}
$socket_server =new SocketServer();
$socket_server->start();//开始监听
登录后复制
登录后复制

客户端:

<?php
/**
 * @author 邹颢	zouhao619@gmail.com
 */
class SocketServer{
	private $_port=&#39;9000&#39;;
	private $_address=&#39;127.0.0.1&#39;;
	private $_client_socket_list=array();
	public function __set($name,$val){
		$this->$name=$val;
	}
	private function _showError($error){
		exit($error);
	}
	/**
	 * 开始进行socket服务器端监听端口
	 */
	public function start(){
		// 创建端口
		if (($sock = socket_create ( AF_INET, SOCK_STREAM, SOL_TCP )) === false) {
			$this->_showError("socket_create() failed :reason:" . socket_strerror ( socket_last_error () ));
		}
		// 绑定
		if (socket_bind ( $sock, $this->_address, $this->_port ) === false) {
			$this->_showError("socket_bind() failed :reason:" . socket_strerror ( socket_last_error ( $sock ) ));
		}
		// 监听
		if (socket_listen ( $sock, 5 ) === false) {
			$this->_showError("socket_bind() failed :reason:" . socket_strerror ( socket_last_error ( $sock ) ) );
		}
		do {
			//当有一个客户端连接的时候
			if ($client_socket=socket_accept ( $sock )) {
				$count = count ( $this->_client_socket_list ) + 1;
				//把新来的用户加入 客户端数组里
				$this->_client_socket_list[]=$client_socket;
				echo "new connection:\r\n";//服务器端输出当前正在连接的客户端数量
				echo "current connection:{$count}\r\n";
				//接受客户端传过来的字符串
				$msg=$this->read($client_socket);
				echo "client:{$msg}\r\n";
				//服务器向客户端传值
				$my_msg="I am fine,think you\r\n";
				$this->send($client_socket,$my_msg);
			}
			/**
			 * 这段代码给你参考,用来判断是否有客户端主动失去连接
			else{
				foreach ( $this->_client_socket_list as $socket ) {
					$len = socket_recv ($socket, $buffer, 2048, 0 ); // 接受一下客户端信息,如果为0代表断开连接
					if ($len < 7) {
						//这里写是去连接的客户端业务
					}
				}
			}
			 */
				
		}while(true);	
	}
	/**
	 * 发送数据给客户端
	 */
	public function send($client_socket,$str){  
		return socket_write ( $client_socket,$str, strlen ( $str ) );
	}
	/**
	 * 从客户端接受数据
	 */
	public function read($client_socket){
		return socket_read ( $client_socket, 8192 );//8192实际代表的接受长度,我用819292表示长一点,这样长一点的字符串也可以接受到,不到8192也没关系,会自动识别
	}
	
}
$socket_server =new SocketServer();
$socket_server->start();//开始监听
登录后复制
登录后复制

注意事项:服务器端请用CLI模式运行,cgi模式会超时,新手常喜欢犯的错误.什么是CLI模式,简单的说就是用命令行去执行,而不要用游览器打开,否则会超时的

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1670
14
CakePHP 教程
1428
52
Laravel 教程
1329
25
PHP教程
1274
29
C# 教程
1256
24
VMware Horizon Client无法打开[修复] VMware Horizon Client无法打开[修复] Feb 19, 2024 pm 11:21 PM

VMwareHorizon客户端可帮助您便捷地访问虚拟桌面。然而,有时虚拟桌面基础设施可能会遇到启动问题。本文将讨论当VMwareHorizon客户端未能成功启动时,您可以采取的解决方法。为什么我的VMwareHorizon客户端无法打开?在配置VDI时,如果未打开VMWareHorizon客户端,可能会出现错误。请确认您的IT管理员提供了正确的URL和凭据。如果一切正常,请按照本指南中提到的解决方案解决问题。修复未打开的VMWareHorizon客户端如果您的Windows计算机上未打开VMW

VMware Horizon客户端在连接时冻结或停滞[修复] VMware Horizon客户端在连接时冻结或停滞[修复] Mar 03, 2024 am 09:37 AM

在使用VMWareHorizon客户端连接到VDI时,我们可能会遇到应用程序在身份验证过程中冻结或连接阻塞的情况。本文将探讨这个问题,并提供解决这种情况的方法。当VMWareHorizon客户端出现冻结或连接问题时,您可以采取一些措施来解决这一问题。修复VMWareHorizon客户端在连接时冻结或卡住如果VMWareHorizon客户端在Windows11/10上冻结或无法连接,请执行下面提到的解决方案:检查网络连接重新启动Horizon客户端检查Horizon服务器状态清除客户端缓存修复Ho

电驴搜索连不上服务器如何解决 电驴搜索连不上服务器如何解决 Jan 25, 2024 pm 02:45 PM

解决办法:1、检查电驴设置,确保已输入正确的服务器地址和端口号;2、检查网络连接,确保计算机已连接到互联网,并重置路由器;3、检查服务器是否在线,如果您的设置和网络连接都没有问题,则需要检查服务器是否在线;4、更新电驴版本,访问电驴官方网站,下载最新版本的电驴软件;5、寻求帮助。

无法连接到RPC服务器导致无法进入桌面的解决方法 无法连接到RPC服务器导致无法进入桌面的解决方法 Feb 18, 2024 am 10:34 AM

RPC服务器不可用进不了桌面怎么办近年来,计算机和互联网已经深入到我们的生活中的各个角落。作为一种集中计算和资源共享的技术,远程过程调用(RPC)在网络通信中起着至关重要的作用。然而,有时我们可能会遇到RPC服务器不可用的情况,导致无法进入桌面。本文将介绍一些可能导致此问题的原因,并提供解决方案。首先,我们需要了解RPC服务器不可用的原因。RPC服务器是一种

如何将Dnsmasq配置为DHCP中继服务器 如何将Dnsmasq配置为DHCP中继服务器 Mar 21, 2024 am 08:50 AM

DHCP中继的作用是将接收到的DHCP数据包转发到网络上的另一个DHCP服务器,即使这两个服务器位于不同的子网中。通过使用DHCP中继,您可以实现在网络中心部署一个集中式的DHCP服务器,并利用它为所有网络子网/VLAN动态分配IP地址。Dnsmasq是一种常用的DNS和DHCP协议服务器,可以配置为DHCP中继服务器,以帮助管理网络中的动态主机配置。在本文中,我们将向您展示如何将dnsmasq配置为DHCP中继服务器。内容主题:网络拓扑在DHCP中继上配置静态IP地址集中式DHCP服务器上的D

CentOS安装fuse及CentOS安装服务器详解 CentOS安装fuse及CentOS安装服务器详解 Feb 13, 2024 pm 08:40 PM

作为一名LINUX用户,我们经常需要在CentOS上安装各种软件和服务器,本文将详细介绍如何在CentOS上安装fuse和搭建服务器的过程,帮助您顺利完成相关操作。CentOS安装fuseFuse是一个用户空间文件系统框架,允许非特权用户通过自定义文件系统实现对文件系统的访问和操作,在CentOS上安装fuse非常简单,只需按照以下步骤操作:1.打开终端,以root用户登录。2.使用以下命令安装fuse软件包:```yuminstallfuse3.确认安装过程中的提示,输入`y`继续。4.安装完

PHP MQTT客户端开发指南 PHP MQTT客户端开发指南 Mar 27, 2024 am 09:21 AM

MQTT(MessageQueuingTelemetryTransport)是一种轻量级的消息传输协议,通常用于物联网设备之间的通信。PHP是一种常用的服务器端编程语言,可以用来开发MQTT客户端。本文将介绍如何使用PHP开发MQTT客户端,并包含以下内容:MQTT协议的基本概念PHPMQTT客户端库的选取和使用实例:使用PHPMQTT客户端发布和

用PHP构建IP代理服务器的最佳实践指南 用PHP构建IP代理服务器的最佳实践指南 Mar 11, 2024 am 08:36 AM

在网络数据传输中,IP代理服务器扮演着重要的角色,能够帮助用户隐藏真实IP地址,保护隐私、提升访问速度等。在本篇文章中,将介绍如何用PHP构建IP代理服务器的最佳实践指南,并提供具体的代码示例。什么是IP代理服务器?IP代理服务器是一种位于用户与目标服务器之间的中间服务器,它充当用户与目标服务器之间的中转站,将用户的请求和响应进行转发。通过使用IP代理服务器

See all articles