php socket通信机制(附简单实例)

发表于2014-08-19 20:02  |  次阅读  |  0条评论  |   作者:admin

1、socket 是什么?
   简单的讲,Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。对用户来讲,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

2. 协议:

   TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的,面向连接的、可靠的协议。
   UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议,面向无连接、不可靠的协议。它是属于TCP/IP协议族中的一种(TCP/IP协议族包括网络接口层,网络层,传输层以及应用层)。

3.  具体工作层次分布:
    上图更清晰


4.  socket工作过程:
    如图:

服务器端:初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接;
客户端:初始化Socket,主动向服务端发起连接;
服务端:收到客户端的连接信息,并告诉客户端,消息已经收到;
客户端:接收服务端发送的确认消息,发送给服务端回应数据;
服务端:可以再次发送数据给客户端确认收到;
客户端:收到服务端的响应数据。
到此一个通信就完全建立了,数据传输完毕后,服务器端会断开socket通信,具体操作如下:

通信双方需要统一IP和端口,端口说明:
       1> 公认端口(Well Known Ports):从0到1023,它们紧密绑定(binding)于一些服务。通常这些端口的通讯明确表明了某种服务的协议,例如:80端口实际上总是HTTP通讯。

       2> 注册端口(Registered Ports):从1024到49151。它们松散地绑定于一些服务。也就是说有许多服务绑定于这些端口,这些端口同样用于许多其它目的。例如:许多系统处理动态端口从1024左右开始。

       3> 动态和/或私有端口(Dynamic and/or Private Ports):从49152到65535。理论上,不应为服务分配这些端口。实际上,机器通常从1024起分配动态端口。但也有例外:SUN的RPC端口从32768开始。
 

 <?
// 建立server端socket 
$tcp = getprotobyname("tcp"); 
$socket = socket_create(AF_INET, SOCK_STREAM, $tcp);//采用TCP协议
socket_bind($socket, '127.0.0.1', 10012); //绑定要监听的端口 
socket_listen($socket); //监听端口 
//初始化一个数据,和客户端通信 
$buffer = "connect"; 
while (true) { 
// 接受一个socket连接 
$connection = socket_accept($socket); 
     if(!$connection){ 
          echo "connect fail"; 
     }else{ 
          echo "Socket connected\n"; 
          // 向客户端传递一个信息数据 
          if ($buffer != "") { 
               echo "send data to client\n"; 
               socket_write($connection, $buffer . "\n"); 
               echo "Wrote to socket\n"; 
          } else { 
               echo "no data in the buffer\n" ; 
          } 
          // 从客户端取得信息 
          while ($data = socket_read($connection, 1024, PHP_NORMAL_READ)) { 
               printf("Buffer: " . $data . "\n"); 
               //取得信息给客户端一个反馈 
               socket_write($connection, "Information Received\n"); 
          } 
     } 
socket_close($socket);
//关闭 socket 
printf("Closed the socket\n"); 
} 
?>

  

 

 <?
// 建立客户端的socket连接 
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //采用TCP协议
$connection = socket_connect($socket, '127.0.0.1', 10012); //连接服务器端socket 
while ($buffer = socket_read($socket, 1024, PHP_NORMAL_READ)) { 
//服务端告诉客户端,自己的状态 
     if (preg_match("/not connect/",$buffer)) { 
          echo "don`t connect\n"; 
          break; 
     } else { 
          //服务器传来信息 
          echo "Buffer Data: " . $buffer . "\n"; 
          echo "Writing to Socket\n"; 
          // 将客户的信息写到通道中,传给服务器端 
          if (!socket_write($socket, "SOME DATA\n")) { 
               echo "Write failed\n"; 
          } 
          //服务器端收到信息后,给于的回应信息 
          while ($buffer = socket_read($socket, 1024, PHP_NORMAL_READ)) { 
      echo "sent to server: SOME DATA\n response from server was:" . $buffer . "\n"; 
          }
     } 
} 
socket_close($socket);
?>

   上述函数都是PHP中关于socket的,使用这些函数,你必须把你的socket打开,如果你没有打开,请编辑你的php.ini文件,去失底下这行前面的注释:

extension=php_sockets.dll
server端执行:


客户端执行:


不足之处还请大家指教。\(^o^)/~    

本站关键字:sunny90 web开发 数据库 移动开发 服务器 Nginx Mysql PHP
Copyright © sunny90版权所有 power by sunny90.com  
湘ICP备14012284号-1,粤公网安备 44030602000307号