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^)/~