php的Socket通信以及出现的错误

现在的PYTHON很火,但是我们的PHP也不错!主要是看有没有去挖掘它,去在phper中开更多的脑洞,有时学习框架学累的时候,不妨写写脚本。或许能帮助自己更好的了解PHP。

这里我们就不阐述Socket(套接字)是什么了,这里我们使用常见的C(client)/S(server)模式。

作为服务器端,它的操作socket流程如下:

下面是Server.php的代码

<?php
#The script is used to listen the requests from client
error_reporting(E_ALL & ~E_NOTICE);
$ip = ‘127.0.0.1‘;
$port = 1993;
$sock = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
if(!$sock){
	echo ‘In create process‘.socket_strerror(socket_last_error());
}
$bind_ornot = socket_bind($sock,$ip,$port);
if(!$bind_ornot)
{
	echo ‘In bind process:‘.socket_strerror(socket_last_error($sock));
	return 0;
}
if(socket_listen($sock,10)){
	$flag = 1;
do{
	$conn_socket = socket_accept($sock);
        $msg = "Send Message:Hello,World";
	if(socket_write($conn_socket,$msg,strlen($msg)))
		{
			echo "第{$flag}次:发送成功\n";
		};
	if($flag == 5)
		{
		    echo "停止监听,发送完成";
		    break;
		 }
	$flag++;
	socket_close($conn_socket);
}while(True);
}
?>

socket_create()函数是用来创建一个socket资源,它有三个参数,第一个参数指的是协议族,其中AF_INET指的是使用ipv4的协议族,第二个参数是指使用的通信类型,SOCK_STREAM指的是流模式。流模式对应的是可靠连接,也就是tcp连接方式。第三个指的是选用哪一种连接方式,要是tcp就是用SOL_TCP.要是udp就使用SOL_UDP。

对于socket_listen,第一个参数是要监听的套接字,第二个是可允许的队列数目,即允许有多少个人连接。但在使用前得先绑定一个ip地址和端口

上面的php代码,监听本地环路地址‘127.0.0.1’的1993端口,只要有连接请求发送到1993端口,便与客户端建立tcp连接,之后便是发送信息到客户端,发送完消息之后便关闭连接。里面的flag为计数标志变量,当$flag为5的时候,停止建立连接。

PS:socket_strerror(socket_last_error($sock))返回的是对应套接字产生错误的原因,编码是根据操作系统所使用的语言,我这里是windows的中文系统,所以返回的是gbk编码!

接下来是client.php操作socket的流程。

下面是代码:

<?php
error_reporting(E_ALL & ~E_NOTICE);
$sock = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
if($sock){
	if(socket_connect($sock,‘127.0.0.1‘,1993))
	{
		while(($content = socket_read($sock,256)))
		{
			echo $content."\n";
		}
	}
	else
	{
		echo ‘In connect process‘.socket_strerror(socket_last_error());
	}
}
else
{
	echo ‘In create process‘.socket_strerror(socket_last_error($sock));
}
?>

上面的代码使用socket_connect()连接到正在监听的服务器端口1993,连接后,通过socket_read()从连接后的套接字读取内容!返回的由于是字符串类型,可以直接打印!

之后我们先运行server.php,因为其负责监听指定端口和发送信息。

倘若我们先运行client.php,那我们便会发现返回这样的错误!

错误一:服务端没有在监听

返回错误:由于目标计算机积极拒绝,无法连接

错误二:端口已经被绑定了使用了,也就是你第二次运行了server.php

返回错误:通常每个套接字地址(协议/网络地址/端口)只允许一次

所以在我们测试前,最好先查看一下,端口是否被占用!

netstat -an | find "端口号"

正确的运行次序以及结果如下,先运行server.php

只需要php server.php即可!

可以看到没运行server.php前,本地127.0.0.1没有监听1993端口,但是一运行之后,服务端便在1993端口进行监听。

之后运行client.php

客户端接收到来自服务端的信息,而服务端则进行计数,记录自己发送的次数!

这个简单的例子可以为之后的socket应用打下一些基础,最常见的如聊天工具,然后到游戏之类的!

时间: 2024-10-12 22:28:57

php的Socket通信以及出现的错误的相关文章

TCP及socket通信原理

一.网络互联模型 因特网在刚面世时,只有同一制造商生产的计算机才能彼此通信,制定网络互联模型的目的就是为异种的计算机互连提供一个共同的基础和标准框架,并为保持相关标准的一致性和兼容性提供共同的参考. 互联参考模型: OSI七层模型(Open System Interconnect):应用层.表示层.会话层.传输层.网络层.数据链路层.物理层 DoD四层模型:是OSI七层模型的浓缩版,包括 进程/应用层.主机到主机层.因特网层.网络接入层 以上两种模型是层次型的,分层模型的优点主要在于: ①将网络

php的socket通信

对TCP/IP.UDP.Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵.那么我想问: 1.         什么是TCP/IP.UDP?2.         Socket在哪里呢?3.         Socket是什么呢?4.         你会使用它们吗? 什么是TCP/IP.UDP? TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网

VS下使用Google Protobuf完成SOCKET通信

如何在Windows环境下的VS中安装使用Google Protobuf完成SOCKET通信 出处:如何在Windows环境下的VS中安装使用Google Protobuf完成SOCKET通信 最近一段时间,由于项目的需要,接触到了Protobuf这个东东,在Linux环境下,体验了一把,感觉挺不错,很方便,且高效.是一个非常值得学习掌握和应用的数据抽象.平台无关.功能强大.…(此处省略1000字)的开源工具. Google虽然把Protobuf做成了跨平台.跨语言,但作为微软的死对头,它在re

python的socket通信实例

一.socket简介 1. 套接字 套接字是为特定网络协议(例如TCP/IP,ICMP/IP,UDP/IP等)套件对上的网络应用程序提供者提供当前可移植标准的对象. 它们允许程序接受并进行连接,如发送和接受数据.为了建立通信通道,网络通信的每个端点拥有一个套接字对象极为重要. 套接字为BSD UNIX系统核心的一部分,而且他们也被许多其他类似UNIX的操作系统包括Linux所采纳. 许多非BSD UNIX系统(如ms-dos,windows,os/2,mac os及大部分主机环境)都以库形式提供

android中非阻塞socket通信

1.什么是同步与异步,阻塞与非阻塞 首先我们要明白搞明白:同步就等于阻塞?异步就等于非阻塞?这是不对的,同步不等于阻 塞,而异步也不等于非阻塞. 1)那什么是同步编程? 什么是同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回.根据这个定义,android中绝大多数函数都是同步调用.但是一般而言,我们在谈论同步.异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务.在android中,由于主线程(UI线程的不安全性),我们经常会用到handler的SendMessage

Flash Socket通信的安全策略问题 843端口

1.问题描述       将flash发布为html格式后,加载页面后,swf无法与服务器进行socket通信.Flash端显示的错误为:securityErrorHandler信息: [SecurityErrorEvent type="securityError" bubbles=false cancelable=false eventPhase=2 text="Error #2048"] 在服务器端显示的信息是由客户端尝试进行连接,但是无法接受数据.接受的数据显

第二十天 TCP 及socket通信原理、http协议及web服务、httpd核心配置详解

一.TCP及socket通信原理详解 二.http协议及web服务原理(一) 三.http协议及web服务原理(二) 四.httpd核心配置详解 1.tcp.udp是一种传输协议,实现进程地址标记,套接字是一个虚拟设备,用来表明主机上的某个进程      众所周知:0-1023:管理员才有权限使用,永久地分配给某应用使用(由IANA分配)      注册端口:1024-41951:只有一部分被注册,分配原则上非特别严格.      动态端口或私有端口:41952-65535:由内核分配临时端口,

【Java】Java Socket 通信示例

用socket(套接字)实现客户端与服务端的通信. 这里举两个例子: 第一种是每次客户端发送一个数据,服务端就做一个应答.(也就是要轮流发) 第二种是客户端可以连续的向服务端发数据,服务端也可以连续向客户端发数据.(多线程) 为了方便起见,客户端服务端都放在一个主机上,分别开两个进程[哈哈,进程间通信lol~] PS: 一个聊天程序雏形 代码也放在GitHub上了:https://github.com/MummyDing/socketChatDemo Demo 1: 简单的Socket通信,一人

Socket通信常用方法

使用tcp协议,链接服务器的方法 /// <summary> /// 连接使用tcp协议的服务端 /// </summary> /// <param name="ip">服务端的ip</param> /// <param name="port">服务端的端口号</param> /// <returns></returns> public static Socket Con