要想把自己的云服务器作为服务端,首先需要获取的是云服务器的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);
?>
这里只是简单模拟了发送请求的过程。