`
icrwen
  • 浏览: 269621 次
  • 性别: Icon_minigender_2
  • 来自: 济南
社区版块
存档分类
最新评论

转载php socket基础

    博客分类:
  • php
阅读更多
Socket 基础
PHP使用Berkley的socket库来创建它的连接。socket只不过是一个数据结构。你使用这个socket数据结构去开始一个客户端和服务器之间的会话。这个服务器是一直在监听准备产生一个新的会话。当一个客户端连接服务器,它就打开服务器正在进行监听的一个端口进行会话。这时,服务器端接受客户端的连接请求,那么就进行一次循环。现在这个客户端就能够发送信息到服务器,服务器也能发送信息给客户端。
产生一个Socket,你需要三个变量:一个协议、一个socket类型和一个公共协议类型。产生一个socket有三种协议供选择,继续看下面的内容来获取详细的协议内容。
定义一个公共的协议类型是进行连接一个必不可少的元素。下面的表我们看看有那些公共的协议类型。
表一:协议
名字/常量     描述
AF_INET 这是大多数用来产生socket的协议,使用TCP或UDP来传输,用在IPv4的地址
AF_INET6     与上面类似,不过是来用在IPv6的地址
AF_UNIX 本地协议,使用在Unix和Linux系统上,它很少使用,一般都是当客户端和服务器在同一台机器上的时候使用
表二:Socket类型
名字/常量     描述
SOCK_STREAM 这个协议是按照顺序的、可靠的、数据完整的基于字节流的连接。这是一个使用最多的socket类型,这个socket是使用TCP来进行传输。
SOCK_DGRAM 这个协议是无连接的、固定长度的传输调用。该协议是不可靠的,使用UDP来进行它的连接。
SOCK_SEQPACKET 这个协议是双线路的、可靠的连接,发送固定长度的数据包进行传输。必须把这个包完整的接受才能进行读取。
SOCK_RAW 这个socket类型提供单一的网络访问,这个socket类型使用ICMP公共协议。(ping、traceroute使用该协议)
SOCK_RDM 这个类型是很少使用的,在大部分的操作系统上没有实现,它是提供给数据链路层使用,不保证数据包顺序
表三:公共协议
名字/常量     描述
ICMP 互联网控制消息协议,主要使用在网关和主机上,用来检查网络状况和报告错误信息
UDP      用户数据报文协议,它是一个无连接,不可靠的传输协议
TCP 传输控制协议,这是一个使用最多的可靠的公共协议,它能保证数据包能够到达接受者那儿,如果在传输过程中发生错误,那么它将重新发送出错数据包。
现在你知道了产生一个socket的三个元素,那么我们就在php中使用socket_create()函数来产生一个socket。这个socket_create()函数需要三个参数:一个协议、一个socket类型、一个公共协议。socket_create()函数运行成功返回一个包含socket的资源类型,如果没有成功则返回false。
Resourece socket_create(int protocol, int socketType, int commonProtocol);
现在你产生一个socket,然后呢?php提供了几个操纵socket的函数。你能够绑定socket到一个IP,监听一个socket的通信,接受一个socket;现在我们来看一个例子,了解函数是如何产生、接受和监听一个socket。
<?php
$commonProtocol = getprotobyname(“tcp”);//使用公共协议名字来获取一个协议类型
$socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);//产生一个socket并且返回一个socket资源的实例
socket_bind($socket, ‘localhost’, 1337);//绑定socket到本地计算机
socket_listen($socket);//监听所有进来的socket连接
// More socket functionality to come
?>
上面这个例子产生一个你自己的服务器端。例子第一行,
$commonProtocol = getprotobyname(“tcp”);
使用公共协议名字来获取一个协议类型。在这里使用的是TCP公共协议,如果你想使用UDP或者ICMP协议,那么你应该把getprotobyname()函数的参数改为“udp”或“icmp”。还有一个可选的办法是不使用getprotobyname()函数而是指定SOL_TCP或SOL_UDP在socket_create()函数中。
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
例子的第二行是产生一个socket并且返回一个socket资源的实例。在你有了一个socket资源的实例以后,你就必须把socket绑定到一个IP地址和某一个端口上。
socket_bind($socket, ‘localhost’, 1337);
在这里你绑定socket到本地计算机(127.0.0.1)和绑定socket到你的1337端口。然后你就需要监听所有进来的socket连接。
socket_listen($socket);
在第四行以后,你就需要了解所有的socket函数和他们的使用。
表四:Socket函数
函数名      描述
socket_accept()    接受一个Socket连接
socket_bind()     把socket绑定在一个IP地址和端口上
socket_clear_error()   清除socket的错误或者最后的错误代码
socket_close()     关闭一个socket资源
socket_connect()    开始一个socket连接
socket_create_listen()   在指定端口打开一个socket监听
socket_create_pair()   产生一对没有区别的socket到一个数组里
socket_create()    产生一个socket,相当于产生一个socket的数据结构
socket_get_option()    获取socket选项
socket_getpeername()   获取远程类似主机的ip地址
socket_getsockname()   获取本地socket的ip地址
socket_iovec_add()    添加一个新的向量到一个分散/聚合的数组
socket_iovec_alloc()   这个函数创建一个能够发送接收读写的iovec数据结构
socket_iovec_delete()   删除一个已经分配的iovec
socket_iovec_fetch()   返回指定的iovec资源的数据
socket_iovec_free()    释放一个iovec资源
socket_iovec_set()    设置iovec的数据新值
socket_last_error()    获取当前socket的最后错误代码
socket_listen()     监听由指定socket的所有连接
socket_read()     读取指定长度的数据
socket_readv()     读取从分散/聚合数组过来的数据
socket_recv()     从socket里结束数据到缓存
socket_recvfrom()    接受数据从指定的socket,如果没有指定则默认当前socket
socket_recvmsg()    从iovec里接受消息
socket_select()     多路选择
socket_send()     这个函数发送数据到已连接的socket
socket_sendmsg()    发送消息到socket
socket_sendto()    发送消息到指定地址的socket
socket_set_block()    在socket里设置为块模式
socket_set_nonblock()   socket里设置为非块模式
socket_set_option()    设置socket选项
socket_shutdown()    这个函数允许你关闭读、写、或者指定的socket
socket_strerror()    返回指定错误号的详细错误
socket_write()     写数据到socket缓存
socket_writev()    写数据到分散/聚合数组
以上所有的函数都是PHP中关于socket的,使用这些函数,你必须把你的socket打开,如果你没有打开,请编辑你的php.ini文件,去掉下面这行前面的注释:
extension=php_sockets.dll
如果你无法去掉注释,那么请使用下面的代码来加载扩展库:
<?php
if(!extension_loaded(‘sockets’)) {
if(strtoupper(substr(PHP_OS, 3)) == “WIN”) {
dl(‘php_sockets.dll’);
}else{
dl(‘sockets.so’);
}
}
?>
如果你不知道你的socket是否打开,那么你可以使用phpinfo()函数来确定socket是否打开。你通过查看phpinfo信息了解socket是否打开。
查看phpinfo()关于socket的信息
◆ 产生一个服务器
现在我们把第一个例子进行完善。你需要监听一个指定的socket并且处理用户的连接。
<?php
$commonProtocol = getprotobyname("tcp");
$socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);
socket_bind($socket, 'localhost', 1337);
socket_listen($socket);
// Accept any incoming connections to the server
$connection = socket_accept($socket);
if($connection){
socket_write($connection, "You have connected to the socket... ");
}
?>
你应该使用你的命令提示符来运行这个例子。理由是因为这里将产生一个服务器,而不是一个Web页面。如果你尝试使用Web浏览器来运行这个脚本,那么很有可能它会超过30秒的限时。你可以使用下面的代码来设置一个无限的运行时间,但是还是建议使用命令提示符来运行。
set_time_limit(0);
在你的命令提示符中对这个脚本进行简单测试:
Php.exe example01_server.php
如果你没有在系统的环境变量中设置php解释器的路径,那么你将需要给php.exe指定详细的路径。当你运行这个服务器端的时候,你能够通过远程登陆(telnet)的方式连接到端口1337来测试这个服务器。

上面的服务器端有三个问题:1. 它不能接受多个连接。2. 它只完成唯一的一个命令。3. 你不能通过Web浏览器连接这个服务器。
这个第一个问题比较容易解决,你可以使用一个应用程序去每次都连接到服务器。但是后面的问题是你需要使用一个Web页面去连接这个服务器,这个比较困难。你可以让你的服务器接受连接,然后些数据到客户端(如果它一定要写的话),关闭连接并且等待下一个连接。
在上一个代码的基础上再改进,产生下面的代码来做你的新服务器端:
<?php
// Set up our socket
$commonProtocol = getprotobyname("tcp");
$socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);
socket_bind($socket, 'localhost', 1337); //socket_bind()     把socket绑定在一个IP地址和端口上
socket_listen($socket);
// Initialize the buffer
$buffer = "NO DATA";
while(true) {
// Accept any connections coming in on this socket
$connection = socket_accept($socket);//socket_accept()    接受一个Socket连接
printf("Socket connected ");
// Check to see if there is anything in the buffer
if($buffer != ""){
printf("Something is in the buffer...sending data... ");
socket_write($connection, $buffer . " "); //socket_write()     写数据到socket缓存
printf("Wrote to socket ");
}else {
printf("No Data in the buffer ");
}
// Get the input
while($data = socket_read($connection, 1024, PHP_NORMAL_READ))//socket_read()     读取指定长度的数据
{
$buffer = $data;
socket_write($connection, "Information Received ");
printf("Buffer: " . $buffer . " ");
}
socket_close($connection); //socket_close()     关闭一个socket资源
printf("Closed the socket ");
}
?>
这个服务器端要做什么呢?它初始化一个socket并且打开一个缓存收发数据。它等待连接,一旦产生一个连接,它将打印“Socket connected”在服务器端的屏幕上。这个服务器检查缓冲区,如果缓冲区里有数据,它将把数据发送到连接过来的计算机。然后它发送这个数据的接受信息,一旦它接受了信息,就把信息保存到数据里,并且让连接的计算机知道这些信息,最后关闭连接。当连接关闭后,服务器又开始处理下一次连接。
◆ 产生一个客户端
处理第二个问题是很容易的。你需要产生一个php页连接一个socket,发送一些数据进它的缓存并处理它。然后你有个处理后的数据在还顿,你能够发送你的数据到服务器。在另外一台客户端连接,它将处理那些数据。
下面的例子示范了使用socket:
<?php
// Create the socket and connect
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$connection = socket_connect($socket,’localhost’, 1337);
while($buffer = socket_read($socket, 1024, PHP_NORMAL_READ)) {
if($buffer == “NO DATA”) {
echo(“<p>NO DATA</p>”);
break;
}else{
// Do something with the data in the buffer
echo(“<p>Buffer Data: “ . $buffer . “</p>”);
}
}
echo(“<p>Writing to Socket</p>”);
// Write some test data to our socket
if(!socket_write($socket, “SOME DATA ”)){
echo(“<p>Write failed</p>”);
}
// Read any response from the socket
while($buffer = socket_read($socket, 1024, PHP_NORMAL_READ)){
echo(“<p>Data sent was: SOME DATA<br> Response was:” . $buffer . “</p>”);
}
echo(“<p>Done Reading from Socket</p>”);
?>
这个例子的代码演示了客户端连接到服务器。客户端读取数据。如果这是第一时间到达这个循环的首次连接,这个服务器将发送“NO DATA”返回给客户端。如果情况发生了,这个客户端在连接之上。客户端发送它的数据到服务器,数据发送给服务器,客户端等待响应。一旦接受到响应,那么它将把响应写到屏幕上。
分享到:
评论

相关推荐

    php_socket基础编程

    ### PHP Socket 基础编程知识点详解 #### 标题:PHP Socket 基础编程 此标题指的是一本适合初学者了解和学习 PHP Socket 编程的基础指南。 #### 描述:一本有利于刚开始接触 PHP Socket 编程的基础教程。 这本...

    Php_Socket基础

    ### PHP Socket 基础详解 #### 一、Socket 基础概念 在深入探讨 PHP 如何利用 Sockets 进行通信之前,首先需要理解 Socket 的基本概念。Socket 是一种用于不同计算机间通信的机制,它允许应用程序通过网络进行通信...

    Socket基础知识笔记

    Socket基础知识是计算机网络编程中的重要概念,主要用于实现进程间的通信,尤其在网络环境中,它使得不同计算机上的应用程序能够相互通信。以下是对Socket基础知识的详细解释: 1. **Socket定义**: Socket,又...

    PHP Socket开发基础

    【PHP Socket开发基础详解】 PHP Socket开发涉及到网络通信的基础,主要使用Berkley的socket库。Socket在PHP中被理解为一个数据结构,用于启动客户端和服务器之间的通信会话。服务器端持续监听特定端口,等待客户端...

    php socket聊天室

    在IT行业中,PHP Socket编程是一种常见且强大的技术,它允许服务器和客户端之间建立低级别的网络通信。本项目“php socket聊天室”显然旨在利用PHP的Socket功能创建一个实时的在线聊天平台,使得用户可以通过Web...

    PHP socket 构造POST与GET

    一、PHP Socket基础 1. PHP的socket_create()函数:这是创建一个Socket的入口点,它接受三个参数,分别是协议族(AF_INET用于IPv4,AF_INET6用于IPv6)、套接字类型(SOCK_STREAM用于TCP,SOCK_DGRAM用于UDP)和...

    php5 实现socket 通信

    ### PHP5 实现 Socket 通信知识点详解 #### 一、Socket 概述 在计算机网络中,Socket(套接字)是一种用于网络间进程通信的机制。它为应用程序提供了访问低层传输协议的能力,比如 TCP 和 UDP。在 PHP5 中,Socket...

    php socket简单实现源码

    在IT行业中,PHP Socket是一种强大的通信工具,它允许PHP应用程序与其他服务器进行低级网络通信。本文将深入探讨PHP Socket的工作原理、实现流程以及如何通过PHP编写简单的Socket程序。 首先,理解PHP Socket的基本...

    php socket编程实例详解

    在Web开发中,Socket编程是一种基础且强大的技术,它允许服务器和客户端之间进行低级别的通信。PHP作为一款广泛使用的服务器端脚本语言,也支持Socket编程,使得开发者能够创建高效、实时的网络应用程序。本文将通过...

    用php的socket跟flash的socket通信

    #### 一、PHP 的 Socket 编程基础 在本文档中,PHP 的 Socket 编程主要用于实现与 Flash 的 Socket 进行通信。PHP 的 Socket 编程相对较少被提及,但仍然是一种非常实用的技术。 - **创建 Socket**: - `socket_...

    socket基础知识

    ### Socket基础知识概述 在计算机网络通信领域中,`socket`是一种重要的编程接口,它使得不同计算机之间能够通过网络进行数据交换。本篇文章将基于提供的文件信息来深入探讨`socket`的基础概念及其在C#中的应用。 ...

    socket基础php

    【Socket基础PHP】是关于如何在PHP环境中使用Socket编程的知识点。Socket是网络通信中的一个基本概念,它在PHP中用于建立客户端与服务器之间的通信连接。Socket库通常基于Berkley套接字(Berkley Sockets)实现,...

    用php实现socket

    在PHP中实现Socket通信,我们可以创建服务器(Server)和客户端(Client)来完成进程间的交互。下面将详细介绍如何用PHP实现Socket以及相关的知识点。 1. **PHP Socket基本概念** PHP中的Socket功能是通过`socket`...

    socket编程基础

    下面我们将深入探讨socket编程的基础知识。 一、Socket概念 Socket起源于UNIX系统,它是一种接口,允许应用程序通过网络发送和接收数据。Socket分为两部分:服务器端socket和客户端socket。服务器端socket等待连接...

    PHP的Socket通信

    Socket作为网络通信的基础,其重要性不言而喻。无论是对于Web开发还是其他类型的网络应用程序,理解和掌握Socket的工作原理都是非常必要的。通过使用PHP等语言中的Socket函数,开发者能够轻松地构建出高效稳定的网络...

    PHP和SOCKET

    ### PHP与SOCKET编程 #### 一、PHP Socket编程简介 在现代互联网应用开发中,网络通信技术至关重要,其中PHP Socket编程就是一种重要的技术手段。Socket编程允许程序通过网络进行双向数据交换,使得不同计算机之间...

    socket-php文件分段上传

    在IT行业中,网络通信是至关重要的一个领域,而Socket编程是实现客户端与服务器之间通信的基础。本项目聚焦于“socket-php文件分段上传”,通过使用Socket接口与PHP服务端进行交互,实现大文件的高效、稳定传输。在...

    运行php socket

    在IT领域,PHP Socket编程是一种常见且强大的技术,它允许PHP程序与服务器进行低级别的通信,比如创建TCP/IP连接、监听网络端口等。本文将深入探讨“运行PHP Socket”这一主题,涵盖其基本概念、用途、实现方法以及...

    PHP版SOCKET模拟提交POST消息(源码)

    本文将详细讲解如何使用PHP中的SOCKET功能来模拟提交POST消息,并通过分析提供的源码`postn.php`进行深入理解。 首先,我们来看一下SOCKET的基本概念。SOCKET是网络编程中的一种接口,它允许应用程序通过网络发送和...

    php socket client class

    php socket client class 能多次发送信息, 有异常处理。

Global site tag (gtag.js) - Google Analytics