php socket

来源:互联网 发布:mac天津专柜地址 编辑:程序博客网 时间:2024/04/29 06:29
socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。说白了就是一种通信机制。它类似于银行,电信啊这些部分的电话客服部门。你打电话的时候,那边会分配置一个人回答你的问题,客服部门就相当于socket的服务器端了,你这边呢就相当于客户端了,在和你通话结束前,如果有人在想找和你通话的那个说话,是不可能的,因为你在和他通信,当然客服部门的电话交换机也不会重复分配。

Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。
 
Socket接口设计者最先是将接口放在Unix操作系统里面的。如果了解Unix系统的输入和输出的话,就很容易了解Socket了。网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。常用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。

socket是一个针对TCP和UDP编程的接口,你可以借助它建立TCP连接等等。而TCP和UDP协议属于传输层。
http是个应用层的协议,它实际上也是建立在tcp端口上的一种通信协议了,也是一种socket接口。

一个是发动机(Socket),提供了网络通信的能力
一个是轿车(Http),提供了具体的方式
其实http服务器内部的通讯连接是有socket来做的

简单说来,socket可以帮助不同的服务在不同的端口进行通信

Socket函数:
1、socket_create
作用:产生一个socket,相当于产生一个socket的数据结构
用法:socket_create ( int domain, int type, int protocol )
参数:domain,协议;type,类型;protocol,公共协议
返回:socket resource on success, or FALSE on error


2、socket_bind
作用:把socket绑定在一个IP地址和端口上
用法:socket_bind ( resource socket, string address [, int port] )
参数:socket,socket resource;address,ip地址;port,端口
返回:Boolean


3、socket_accept
作用:接受一个Socket连接
用法:socket_accept ( resource socket )
参数:socket,socket resource
返回:Returns a new socket resource on success, or FALSE on error.


4、socket_connect()
作用:开始一个socket连接
用法:socket_connect ( resource socket, string address [, int port] )
参数:socket,socket resource;address,ip地址;port,端口
返回:Boolean


5、socket_listen
作用:监听由指定socket的所有连接
用法:socket_listen ( resource socket [, int backlog] )
参数:socket,socket resource;
返回:Boolean


6、socket_read
作用:读取指定长度的数据
用法:socket_read ( resource socket, int length [, int type] )
参数:socket,socket resource;length,字符长度;type,PHP_BINARY_READ |PHP_NORMAL_READ
返回:string


7、socket_write
作用:写数据到socket缓存
用法:socket_write ( resource socket, string buffer [, int length] )
参数:socket,socket resource;buffer,字符;length,字符长度;
返回:Boolean


8、socket_send()
作用:这个函数发送数据到已连接的socket
用法:socket_send ( resource socket, string buf, int len, int flags )
参数:socket,socket resource;buf,字符;len,字符长度;
返回:Boolean


9、socket_last_error
作用:获取当前socket的最后错误代码
用法:socket_last_error ( [resource socket] )
参数:socket,socket resource;
返回:int


10、socket_strerror
作用:返回指定错误号的详细错误
用法:socket_strerror ( int errno )
参数:errno,socket_last_error no;
返回:string


11、socket_close
作用:关闭一个socket资源
用法:socket_close ( [resource socket] )
参数:socket,socket resource;

返回:null


简单实例:

服务端程序:

<?php set_time_limit(0);// 设置主机和端口$host = "127.0.0.1";$port = 12387;// 创建一个tcp流$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)     or die("socket_create() failed:" . socket_strerror(socket_last_error()));// 设置阻塞模式socket_set_block($socket)     or die("socket_set_block() failed:" . socket_strerror(socket_last_error()));  // 绑定到端口socket_bind($socket, $host, $port)     or die("socket_bind() failed:" . socket_strerror(socket_last_error()));// 开始监听socket_listen($socket, 4)     or die("socket_listen() failed:" . socket_strerror(socket_last_error()));echo "Binding the socket on $host:$port ... \n";while (true) {    // 接收连接请求并调用一个子连接Socket来处理客户端和服务器间的信息    if (($msgsock = socket_accept($socket)) < 0) {        echo "socket_accept() failed:" . socket_strerror(socket_last_error());    }else{        // 读数据        $out = '';        while($buf = socket_read($msgsock,8192)){            $out .= $buf;        }        // 写数据        $in = "数据是 $out";        socket_write($msgsock, $in, strlen($in));    }    // 结束通信    socket_close($msgsock);}socket_close($socket);

客户端程序:

set_time_limit(0);$host = "127.0.0.1";  $port = 12387;// 创建一个tcp流$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)     or die("socket_create() failed:" . socket_strerror(socket_last_error()));echo "try to connect to $host:$port...\n";$result = socket_connect($socket, $host, $port)    or die("socket_connect() failed:" . socket_strerror(socket_last_error()));$in = "hello \n";if(!socket_write($socket, $in, strlen($in))) {    echo "socket_write() failed:" . socket_strerror($socket);}else {    echo "发送成功!\n";}$out = '';while($buf = socket_read($socket, 8192)) {    $out .= $buf;}echo "接受内容为:$out \n";socket_close($socket);


0 0
原创粉丝点击