php udp发送和接收_php编写TCP和UDP
功能描述
用php语言实现tcp和udp服务和客户端,能进行互相通信
TCP和UDP简介
TCP:具有高度可靠性,在能够处理任意大小的数据块的前提下,在建立连接的过程中相对耗时;主要应用于那些对数据传输可靠性要求较高的文本和程序
UDP:无保证可靠传输;最大支持报文长度为1472字节;无需端到端建立连接;资源消耗有限;主要用于图像处理应用(如视频监控)、语音编码应用(如语音通话)、网络游戏(如MOBA游戏)以及视频会议等场景中。
创建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) || 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)
}
//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)
}
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); //捕获客户端数据 包含其IP地址 来自指定的端口号以及返回长度值
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); //发送数据
elseif (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();
