网游中的网络编程2:发送和接收数据包
2016-05-06 18:30
555 查看
概述
在之前的网游中的网络编程系列1:UDP vs. TCP中(推荐先看前面那篇),我们经过讨论得出:网游中传输数据应该使用UDP而不是TCP。我们选择UDP是为了不需要等待重发数据包,从而达到数据的实时性。注意,因为接下来英文原文中所有的代码是C++写的,而我是个pythoner,我的计划是:通过理解文章,我用python实现UDP收发数据包、虚拟连接(原文后两章的内容),在前面的基础上,最后实现:在UDP上实现可靠、有序、避免阻塞的传输(当然,也可以直接看原文,连接已经在下面给出)。
所以,我重新规划了下文章的结构,后面的文章我就把它拆分成下面几章:
使用UDP发送和接收数据包
在UDP上建立虚拟连接
在UDP上实现可靠、有序、避免阻塞的传输。
一、发送和接收数据包
在python中,内建标准库包含了socket,所以我们直接调用标准库socket,写两个脚本,Server代表服务器,Client代表客户端,代码如下:
UDPserver.py脚本
# coding:utf-8 import socket UDP_IP = '127.0.0.1' UDP_PORT = 10080 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.bind((UDP_IP, UDP_PORT)) print '准备接收内容。' while 1: data, addr = sock.recvfrom(1024) # 设置接收数据包的缓存区为1024byte,如果数据包大于这个值,则数据包不会接收大于缓冲区设定值的数据包。 print '从{ip}:{port},接收到内容:{data}'.format(ip=addr[0], port=addr[1], data=data)
UDPclient.py脚本
# coding:utf-8 import socket UDP_IP = '' UDP_PORT = 10080 MESSAGE = 'Hello, world!' print 'UDP 目标IP:', UDP_IP print 'UDP 目标端口:', UDP_PORT print '发送的内容:', MESSAGE sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))
上面的代码有不懂的地方,可以参照我写的初探socket文章
运行效果:
![](https://images2015.cnblogs.com/blog/759200/201605/759200-20160506183311310-1594112049.gif)
强调几点:
udp socket发送数据包的时候,不保证数据包是否发送到目的计算机。也就是说:不运行UDPserver.py脚本,先运行UDPclient.py脚本,并不报错。
udp socket 每次发送数据包的时候需要指定IP地址和端口
udp socket 接收数据可以获得发送数据包的计算机的IP和端口
udp socket 不会接收大于缓存区的数据包(所以注意:发送时数据包的大小)
最后,可以对照着初探socket中的tcp socket例子,思考上面说的几点。
参考
python wiki:UDP Communication相关文章推荐
- VMware Workstation环境下的Linux网络设置
- Nginx支持https訪問
- u-boot移植4:支持 网络
- TCP端口状态说明ESTABLISHED、TIME_WAIT
- Linux 下curl模拟Http 的get or post请求
- TCP socket
- Struts 2验证框架出错:403 for URL:http:////www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd
- 封装的HttpClient工具类
- Http与https的总结
- iOS网络编程TCP/IP应用篇(五)-发送数据及其它(加密,重连)
- iOS 网络编程之TCP/IP <四> 根据协议解析数据
- 微软下载http://www.itellyou.cn/,系统、MSDN等
- redis在win10中出现Creating Server TCP listening socket *:6379: bind: No such file or directory
- iOS 网络编程之TCP/IP <三> 协议的定制
- iOS 网络编程之TCP/IP <二> 框架的二次封装
- okhttp3与旧版本okhttp的区别分析
- 网络层协议之报文控制机协议ICMP
- 使用AFNetworking, SDWebimage和OHHTTPStubs
- gSOAP使用的网络模型
- iOS 网络编程之TCP/IP <一>框架介绍