Advertisement

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();

全部评论 (0)

还没有任何评论哟~