PHPIT课程分享PHP经验分享

Socket编程 之 Socket函数简介

2017-12-19  本文已影响135人  蓝桥云课

说明:文章截选自实验楼教程【PHP Socket编程】,该教程由用户“水煮牛肉”发布在实验楼上,未经允许,禁止转载;

Socket简介

许多第一次接触 Socket 编程的同学并不知道 Socket 是什么意思,就算知道它的翻译 “套接字” 也不明白这到底是个什么东西。其实 Socket 还有一个意思,就是 “插座”,根据这个意思来理解抽象的 “套接字” 会容易得多,创建 Socket 就是装一个插座,为电器提供电能服务,用各种电气标准把它们连接起来

先来一段程序跑起来, 再逐一解释每个函数的使用方法,及参数释义

// server.php
<?php 

$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

socket_bind($sock, "127.0.0.1", 80);

socket_listen($sock);

for ( ; ; ) {
    $conn = socket_accept($sock);
    
    $write_buffer = "HTTP/1.0 200 OK\r\nServer: my_server\r\nContent-Type: text/html; charset=utf-8\r\n\r\nhello!world";
    
    socket_write($conn, $write_buffer);
    
    socket_close($conn);
}

运行:

sudo php server.php

因为要使用80端口,必须使用root身份运行,运行成功后,打开浏览器,输入http://127.0.0.1,回车看到结果

Socket函数介绍

socket_create

函数原型: resource socket_create ( int $domain , int $type , int $protocol )

socket_bind

函数原型: bool socket_bind ( resource $socket , string $address [, int $port = 0 ] )

socket_listen

函数原型: bool socket_listen ( resource $socket [, int $backlog = 0 ] )

stream_socket_server

由于创建一个SOCKET的流程总是 socket、bind、listen,所以PHP提供了一个非常方便的函数一次性创建、绑定端口、监听端口

函数原型: resource stream_socket_server ( string $local_socket [, int &$errno [, string &$errstr [, int $flags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN [, resource $context ]]]] )

有了这个函数之后,上面的代码可以改写成:

// server.php
<?php 

$sock = stream_socket_server("tcp://127.0.0.1:80", $errno, $errstr);

for ( ; ; ) {
    $conn = stream_socket_accept($sock);
    
    $write_buffer = "HTTP/1.0 200 OK\r\nServer: my_server\r\nContent-Type: text/html; charset=utf-8\r\n\r\nhello!world";
    
    fwrite($conn, $write_buffer);
    
    fclose($conn);
}

需要注意的是,这里不能使用socket_accept,因为stream_socket_serversocket_create创建的不是同一种资源,stream_socket_server创建的是stream资源,这也是为什么可以用fwritefreadfclose操作该资源的原因. 而socket_create创建的是socket资源,而不是stream资源,所以socket_create创建的资源只能用socket_writesocket_readsocket_close来操作.

socket_accept

函数原型: resource socket_accept ( resource $socket )

stream_socket_accept

函数原型: resource stream_socket_accept ( resource $server_socket [, float $timeout = ini_get("default_socket_timeout") [, string &$peername ]] )

socket_write

函数原型: int socket_write ( resource $socket , string $buffer [, int $length ] )

socket_close

函数原型: void socket_close ( resource $socket )

这章我们介绍了一些最常用的socket相关函数,值得注意的是stream_socket_serversocket_create创建的资源不是同一种类型,针对这些资源的函数不能混用

最后

想要学习PHPSocket编程,点击教程【PHP Socket编程】即可,该教程共6个实验:

上一篇 下一篇

猜你喜欢

热点阅读