PHP 在云服务器部署Socket服务详细教程

要想把自己的云服务器作为服务端,首先需要获取的是云服务器的IP地址,注意不是通过镜像后的IP公网地址。

windows获取IP地址的方法:

通过cmd命令,输入ipconfig就可以获得IP地址,而这个IP地址是写在Socket服务端的IP。而客户端使用的是公网IP。这两个IP要看清楚。

Socket常用方法:

  • resource socket_create ( int $domain , int $type , int $protocol )   创建并返回套接字资源

一个典型的网络连接由两个套接字组成,一个执行客户端角色,另一个执行服务器角色。

  • bool socket_bind ( resource $socket , string $address [, int $port = 0 ] )   将ip和端口号绑定到特定的套接字上,需要在监听前完成。
  • bool socket_listen ( resource $socket [, int $backlog = 0 ] )   监听
  • resource socket_accept ( resource $socket )  此函数将接受该套接字上的传入连接。一旦连接成功,就会返回一个新的套接字资源,该资源可以用于通信。如果套接字上队列中有多个连接,将使用第一个连接。如果没有挂起的连接,socket_accept()将阻塞,直到出现连接。如果套接字使用socket_set_blocking()或socket_set_nonblock()使其非阻塞,则返回FALSE。
  • string socket_read ( resource $socket , int $length [, int $type = PHP_BINARY_READ])  从创建的套接字资源中读取数据。
  • int socket_write ( resource $socket , string $buffer [, int $length = 0 ] )   从给定的缓冲区向套接字写入内容。

服务端:

在对端口监听的时候,建议把端口值设大一点,避免和一些常用端口冲突。

<?php
set_time_limit(0);
$host = "127.0.0.1";
$port = 20000;
$tcp = getprotobyname("tcp");  
set_time_limit(0);
$socket = socket_create(AF_INET, SOCK_STREAM, $tcp) or die("Could not create socket\n");
$result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n");
$result = socket_listen($socket, 3) or die("Could not set up socket listener\n");
do{
	$spawn = socket_accept($socket) or die("Could not accept incoming connection\n");
	if($spawn !== false){
		do{
			if(false===($input = socket_read($spawn, 1024)))
				break;
			$input = trim($input);
			if($input=="")
				break;
			//这里对读取到的数据进行处理
		}while (true);
		socket_close($spawn);
	}
}while(true); 
	socket_close($sock);   
?>

 以上代码支持循环获取套接字资源,并且可以实现达到一次连接,多次接收数据的目的,也是一种简单的tcp长连接。

客户端:

<?php
set_time_limit(0);  
$host    = "127.0.0.1";
$port    = 20000;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("Could not create socket\n");
$result = socket_connect($socket, $host, $port) or die("Could not connect to server\n");
$message="";     
socket_write($socket, $message, strlen($message)) or die("Could not send data to server\n");
socket_close($socket);
?>

这里只是简单模拟了发送请求的过程。

猜你喜欢

转载自blog.csdn.net/ljcgit/article/details/81739091