功能描述
用php语言实现tcp和udp服务和客户端,能进行互相通信
TCP和UDP简介
- TCP:可靠,传输大小无限制,但是需要时间来建立连接,差错控制开发大;主要用于文本、程序等可靠性高的数据传输。
- UDP:不可靠,传输大小限制在1472字节以下,不需要建立连接,差错控制开销小;主要用于类似图像、声音、网络游戏、视频会议等等对可靠性要求没有那么高的业务进行传输。
创建TCP服务
- 方案一: 用socket方式
/**
* socket tcp服务器创建
* @param string $ip IP地址
* @param string $port 端口号
* @param string $send_msg 返回给客户端的数据
* @param integer $recv_len 一次获取的数据长度
* @return void void
*/
function socket_tcp_server($ip='0.0.0.0', $port='6000', $send_msg='hello word', $recv_len=1024)
{
$serv = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or exit(socket_last_error()); //创建
socket_bind($serv, $ip, $port) or exit(socket_last_error()); //绑定
socket_listen($serv,4) or exit(socket_last_error()); //监听
while(true){
if ($cli = socket_accept($serv)) { //获取客户端连接
$data = ''; //接收数据
while($msg = socket_read($cli,$recv_len)){
$data .= $msg;
if (strlen($msg)<$recv_len || stripos($msg,'exit')!==false || stripos($msg,"\n")!==false) break; //数据边界处理
}
//socket_getpeername($cli, $cli_addr, $cli_port); //获取客户端socket信息
socket_getsockname($cli, $cli_addr, $cli_port); //获取客户端socket信息
echo "CLI: data:{$data},from:{$cli_addr},port:{$cli_port}".PHP_EOL; //处理数据
socket_write($cli, $send_msg, strlen($send_msg)); //向客户端发送数据
socket_close($cli);
} else {
usleep(1000);
}
die;
}
socket_close($serv);
}
//socket_tcp_server(); // 使用
- 方案二:用stream_socket_server
/**
* php socket tcp服务器创建
* @param string $ip IP地址
* @param string $port 端口号
* @param string $send_msg 返回给客户端的数据
* @param integer $recv_len 一次获取的数据长度
* @return void void
*/
function php_tcp_server($ip='0.0.0.0', $port='6000', $send_msg='hello word', $recv_len=1024)
{
$serv = stream_socket_server("tcp://{$ip}:{$port}", $errno, $error); //创建
$errno and exit($error);
while(true){
if ($cli = stream_socket_accept($serv)) { //接收客户端连接
$data = '';
while($msg = fread($cli, $recv_len)){ //读取客户端数据
$data .= $msg;
if (strlen($msg)<$recv_len || stripos($msg,'exit')!==false || stripos($msg,"\n")!==false) break; //数据边界处理
}
$peer = stream_socket_get_name($cli, true); //获取客户端信息
echo "CLI: data:{$data},peer:{$peer}".PHP_EOL;
fwrite($cli, $send_msg, strlen($send_msg)); //向客户端发送数据
//stream_socket_shutdown($cli, STREAM_SHUT_WR); //关闭客户端连接
fclose($cli);
} else {
usleep(1000);
}
}
//stream_socket_shutdown($serv, STREAM_SHUT_WR);
fcloe($serv);
}
//php_tcp_server();
TCP客户端
- 方案一: socket方式
/**
* socket tcp客户端
* @param string $ip IP地址
* @param string $port 端口号
* @param string $data 发送的数据
* @return string 传递过来的数据
*/
function socket_tcp_client($ip='127.0.0.1', $port='6000', $data='hello word')
{
$cli = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //创建
socket_connect($cli, $ip, $port); //链接
socket_write($cli, $data, strlen($data)); //发送数据
$msg = socket_read($cli, 1024); //读取服务端数据
socket_close($cli); //关闭
return $msg; //处理数据
}
//echo socket_tcp_client('127.0.0.1',6000,'nihao');
- 方案二:stream_socket_client
/**
* php socket tcp客户端
* @param string $ip IP地址
* @param string $port 端口号
* @param string $data 发送的数据
* @return string 传递过来的数据
*/
function php_tcp_client($ip='127.0.0.1', $port='6000', $data='hello word')
{
$cli = stream_socket_client("tcp://{$ip}:{$port}", $errno, $error);
$error and exit($error);
fwrite($cli, $data, strlen($data));
$recv_data = '';
while($msg = fread($cli, 1024)){
$recv_data .= $msg;
}
stream_socket_shutdown($cli, STREAM_SHUT_WR);
return $recv_data;
}
//echo php_tcp_client();
UDP服务端
- 方案一:用socket方式
/**
* socket udp服务器创建
* @param string $ip IP地址
* @param string $port 端口号
* @param string $send_msg 返回给客户端的数据
* @param integer $recv_len 一次获取的数据长度
* @return void void
*/
function socket_udp_server($ip='0.0.0.0', $port='6000', $send_msg='hello word', $recv_len=1024)
{
$serv = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP) or exit(socket_last_error());
socket_bind($serv, $ip, $port) or exit(socket_last_error());
while(true){
socket_recvfrom($serv, $data, $recv_len, 0, $from, $port); //获取客户端数据 data IP地址 from 端口号 port
echo "CLI: data:{$data},from:{$from},port:{$port}".PHP_EOL;
socket_sendto($serv, $send_msg, strlen($send_msg), 0, $from, $port); //向客户端发送数据
}
socket_close($serv);
}
//socket_udp_server('0.0.0.0',6001);
- 方案二:用stream_socket_server
/**
* php socket udp服务器创建
* @param string $ip IP地址
* @param string $port 端口号
* @param string $send_msg 返回给客户端的数据
* @param integer $recv_len 一次获取的数据长度
* @return void void
*/
function php_udp_server($ip='0.0.0.0', $port='6001', $send_msg='hello word', $recv_len=1024)
{
$serv = stream_socket_server("udp://{$ip}:{$port}", $errno, $error,STREAM_SERVER_BIND);
$errno and exit($error);
while(true){
$data = stream_socket_recvfrom($serv, 1024, 0, $peer);
echo "CLI: data:{$data},peer:{$peer}".PHP_EOL;
stream_socket_sendto($serv, $send_msg, 0, $peer);
}
stream_socket_shutdown($serv, STREAM_SHUT_WR);
}
//php_udp_server();
UDP客户端
- 方案一: socket方式
/**
* socket udp客户端
* @param string $ip IP地址
* @param string $port 端口号
* @param string $data 发送的数据
* @return string 传递过来的数据
*/
function socket_udp_client($ip='127.0.0.1', $port='6000', $data='hello word')
{
$cli = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP) or exit(socket_last_error());
socket_sendto($cli, $data, strlen($data), 0, $ip, $port) or exit(socket_last_error()); //发送数据
socket_recvfrom($cli, $data, 1024, 0, $ip, $port) or exit(socket_last_error()); //获取数据
socket_close($cli);
return $data;
}
//echo socket_udp_client('127.0.0.1',6001);
- 方案二: stream_socket_client
/**
* php socket udp客户端
* @param string $ip IP地址
* @param string $port 端口号
* @param string $data 发送的数据
* @return string 传递过来的数据
*/
function php_udp_client($ip='127.0.0.1', $port='6001', $data='hello word')
{
$cli = stream_socket_client("udp://{$ip}:{$port}", $errno, $error);
$error and exit($error);
fwrite($cli, $data);
$data = fread($cli, 1024);
//stream_socket_shutdown($cli, STREAM_SHUT_WR);
fclose($cli);
return $data;
}
//echo php_udp_client();