网游中的网络编程2:发送和接收数据包

本文介绍如何使用Python标准库socket进行UDP网络编程,包括发送和接收数据包、建立虚拟连接及实现可靠传输等内容。

原文:Game Networking系列,作者是Glenn Fiedler,专注于游戏网络编程相关工作多年。

概述

在之前的网游中的网络编程系列1:UDP vs. TCP中(推荐先看前面那篇),我们经过讨论得出:网游中传输数据应该使用UDP而不是TCP。我们选择UDP是为了不需要等待重发数据包,从而达到数据的实时性。

注意,因为接下来英文原文中所有的代码是C++写的,而我是个pythoner,我的计划是:通过理解文章,我用python实现UDP收发数据包、虚拟连接(原文后两章的内容),在前面的基础上,最后实现:在UDP上实现可靠、有序、避免阻塞的传输(当然,也可以直接看原文,连接已经在下面给出)。

所以,我重新规划了下文章的结构,后面的文章我就把它拆分成下面几章:

  1. 使用UDP发送和接收数据包
  2. 在UDP上建立虚拟连接
  3. 在UDP上实现可靠、有序、避免阻塞的传输。

一、发送和接收数据包

原文:Sending and Receiving Packets

在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文章

运行效果:
759200-20160506183311310-1594112049.gif

强调几点:

  1. udp socket发送数据包的时候,不保证数据包是否发送到目的计算机。也就是说:不运行UDPserver.py脚本,先运行UDPclient.py脚本,并不报错。

  2. udp socket 每次发送数据包的时候需要指定IP地址和端口

  3. udp socket 接收数据可以获得发送数据包的计算机的IP和端口

  4. udp socket 不会接收大于缓存区的数据包(所以注意:发送时数据包的大小)

最后,可以对照着初探socket中的tcp socket例子,思考上面说的几点。

参考

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值