一、TCP服务TCP服务器我们看Swoole官方文档入门指南->快速入门->创建一个TCP服务器,运行一次文档的示例代码,并查看效果:server.phpset(['worker_num'=>8,//worker进程数是cpu的1-4倍'max_request'=>10000,]);//监听连接传入事件/***$fd客户端连接唯一标识*$reactor_id线程ID*/$serv->on('Connect',function($serv,$fd,$reactorId){echo"Client:{$reactorId}-{$fd}-Connect.\n";});//监听数据接收事件$serv->on('Receive',function($serv,$fd,$reactorId,$data){$serv->send($fd,"Server:{$reactorId}-{$fd}".$data);});//监听连接关闭事件$serv->on('关闭',函数ion($serv,$fd){echo"Client:Close.\n";});//启动服务器$serv->start();我们先启动服务,然后打开两个窗口通过telnet命令连接服务root@5ee6bfcc1310:/work/study/code/swoole/demo/server#phpserver.phpClient:0-1-Connect.Client:1-2-Connect.0客户端:root@5ee6bfcc1310:/#telnet127.0.0.19501Trying127.0.0.1...已连接到127.0.0.1。转义字符为“^]”。helloServer:0-1hello1client:root@5ee6bfcc1310:/#telnet127.0.0.19501Trying127.0.0.1...已连接到127.0。0.1.Escape字符为'^]'.helloServer:1-2helloTCPclienttcp_client.phpconnect("127.0.0.1",9501)){echo'连接错误';exit;}//phpcli常量fwrite(STDOUT,"Pleaseenteramessage");$msg=trim(fgets(STDIN));//向tcp服务器服务器发送消息$client->send($msg);//从服务器接收数据$res=$client->recv();echo$res;执行脚本:phptcp_client.php打印:root@5ee6bfcc1310:~#/work/study/soft/php/bin/php/work/study/code/swoole/demo/client/tcp_client.php请输入留言3Server:0-332.UDP服务UDP服务器不同于TCP服务器。UDP没有连接的概念。服务器启动后,客户端无需连接,直接向服务器监听的9502端口发送数据包即可。对应的事件是onPacket。我们看Swoole官方文档入门指南->快速入门->创建UDP服务器udp_server.phpon('Packet',function($serv,$data,$clientInfo){$serv->sendto($clientInfo['address'],$clientInfo['port'],"Server".$data);var_dump($clientInfo);});//启动服务器$serv->start();启动服务:phpudp_server.phpUDP服务器可以使用netcat-u来连接测试netcat-u127.0.0.19502helloServer:hello当客户端连接并发送数据时,服务器会打印出客户端的相关信息:#phpudp_server.phparray(4){["server_socket"]=>int(3)["server_port"]=>int(9502)["address"]=>string(9)"127.0.0.1"["port"]=>int(40627)}三、TCP和UDPTCP(TransmissionControlProtocol传输控制协议):是一种面向连接的、可靠的、基于字节流的传输通信协议。UDP(UserDatagramProtocol用户数据报协议):是一种无连接的传输层协议,提供面向事务的简单不可靠的信息传输服务。一、TCP和UDP的区别1.TCP是面向连接的(客户端和服务器之间传输数据之前必须建立连接),UDP是无连接的(发送数据之前不需要建立连接)2.TCP提供可靠的服务(通过TCP传输的数据。不出错、不丢失、不重复、按顺序到达);UDP提供简单且不可靠的面向事务的传输。3、UDP实时性更好,工作效率高于TCP。适用于高速传输和高实时性的通信或广播通信。随着网速的提高,UDP的使用越来越多。4.没有TCP连接只能是点对点的。UDP支持一对一、一对多和多对多的交互通信。5、TCP需要更多的系统资源,UDP需要更少的系统资源。6、UDP程序结构更简单。7、TCP是流模式,UDP是数据报模式。2、为什么UDP有时比TCP更有优势?UDP基于其简单、传输速度快等优点,在越来越多的场景中取代了TCP,比如实时游戏。(1)网速的提升为UDP的稳定性提供了可靠的网络保障,丢包率极低。如果采用应用层重传,可以保证传输的可靠性。(2)TCP为了实现网络通信的可靠性,采用了复杂的拥塞控制算法,建立了繁琐的握手过程。由于TCP内置系统协议栈,对其进行改进极其困难。使用TCP,一旦发生丢包,TCP会缓存后面的包,等前面的包重传接收后再继续发送,延时会越来越大,基于UDP严格的实时性要求,使用自定义的重传机制,最大程度减少丢包带来的延迟,最大限度减少网络问题对游戏玩法的影响。3、为什么TCP不适合实时传输?TCP影响实时性能并不是因为握手需要时间。一旦建立握手就可以了。一般来说,单位时间内传输的数据流量是比较顺畅的。TCP依靠滑动窗口进行流量控制。滑动窗口的大小是自适应的。影响滑动窗口的因素主要有两个。一是网络延迟,二是传输速率。成比例的。在给定的网络环境下,延迟可以认为是固定的,因此滑动窗口只与传输速率有关。在传输实时数据时,由于数据流相对固定,此时TCP上的滑动窗口会处于不稳定状态。大或小的固定值。这个值恰到好处,可以保证当前产生的数据实时传输给对方。当网络出现丢包时,根据TCP协议(快速恢复),滑动窗口会缩小到原来的一半,所以速率会立即减半,此时发送速率会小于数据产生速率,部分数据会卡在发送端,然后滑动窗口会不断增加,直到所有累积的数据发送完毕。上述过程是一个典型的TCP流量抖动过程,对实时传输影响很大,可能会造成较大的突发延时。从用户感知的角度来说,有时候比较流畅,但有时候会卡住(“抖动”,而且比较严重),所以实时传输通常不使用TCP。4、应用场景:如普通会议视频图像、音频、普通数据等。当然,UDP是首选。毕竟,丢失多少数据包并不重要。如果是传输文件等,不能丢包,用TCP。5、udp如何实现可靠传输?UDP不是连接协议,因此具有资源消耗低、处理速度快的优点。因此,UDP通常用于音频、视频和普通数据传输,因为即使偶尔丢失两个数据包,也不会对接收结果造成太大影响。传输层不能保证数据的可靠传输,只能通过应用层来实现。实现方法可以参考tcp可靠传输方法,但不是在传输层实现,而是中转应用层实现。相关文章TCP和UDP的区别、优缺点什么是TCP、UDP以及两者的区别
