Python中P2P方式实现简单的udp打洞

原来是本人的毕业设计。现在拿出来共享下。先申明,作者是lust,老师如果在网上搜到这段代码可不要说我的毕业设计是网上copy滴哈。

用python做了一个P2P的简单实现,可以通过在服务端注册公网IP和端口后,直接和其它客户端进行通信。目前只能在完全对称NAT下成功实现,在window 2003 nat服务和vmware自带的nat下测试成功。用iptables的nat不可行。

初学Python,代码不是很完善,比如logout没有写,只供参考。

Server端代码:

#!/usr/bin/python
#coding:utf-8
import socket, sys, SocketServer, threading, thread, time
SERVER_PORT = 1234
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('', SERVER_PORT))
user_list = []    

def server_handle():
    while True:
        cli_date, cli_pub_add = sock.recvfrom(8192)
        now_user = []
        headder = []
        cli_str = {}
        headder = cli_date.split('\t')
        for one_line in headder:
            str = {}
            str = one_line
            args = str.split(':')
            cli_str[args[0]] = args[1]    

        if cli_str['type'] == 'login' :
            del cli_str['type']
            now_user = cli_str
            now_user['cli_pub_ip'] = cli_pub_add[0]
            now_user['cli_pub_port'] = cli_pub_add[1]
            user_list.append(now_user)
            toclient = 'info#%s login in successful , the info from server'%now_user['user_name']
            sock.sendto(toclient,cli_pub_add)
            print '-'*100
            print "%s 已经登录,公网IP:%s 端口:%d\n"%(now_user['user_name'],now_user['cli_pub_ip'],now_user['cli_pub_port'])
            print "以下是已经登录的用户列表"
            for one_user in user_list:
                        print '用户名:%s 公网ip:%s 公网端口:%s 私网ip:%s 私网端口:%s'%(one_user['user_name'],one_user['cli_pub_ip'],one_user['cli_pub_port'],one_user['private_ip'],one_user['private_port'])    

        elif cli_str['type'] == 'alive':
            pass

        elif cli_str['type'] == 'logout' :
            pass

        elif cli_str['type'] == 'getalluser' :
            print '-'*100
            for one_user in user_list :
                        toclient = 'getalluser#username:%s pub_ip:%s pub_port:%s pri_ip:%s pri_port:%s'%(one_user['user_name'],one_user['cli_pub_ip'],one_user['cli_pub_port'],one_user['private_ip'],one_user['private_port'])
                        sock.sendto(toclient,cli_pub_add)
if __name__ == '__main__':
    thread.start_new_thread(server_handle, ())
    print '服务器进程已启动,等待客户连接'
    while True:
        for one_user in user_list:
            toclient = 'keepconnect#111'
            sock.sendto(toclient,(one_user['cli_pub_ip'],one_user['cli_pub_port']))
            time.sleep(1)

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索socket
, cli
, 2 打洞 穿透
, 打洞  nat
, 打洞 UDP NAT穿透
, cli换行
公网
python stun udp p2p、python p2p udp nat、python实现简单爬虫、udp p2p 穿透、p2p udp,以便于您获取更多的相关知识。

时间: 2025-01-30 13:30:29

Python中P2P方式实现简单的udp打洞的相关文章

对于Python中线程问题的简单讲解_python

我们将会看到一些在Python中使用线程的实例和如何避免线程之间的竞争.你应当将下边的例子运行多次,以便可以注意到线程是不可预测的和线程每次运行出的不同结果.声明:从这里开始忘掉你听到过的关于GIL的东西,因为GIL不会影响到我想要展示的东西. 示例1 我们将要请求五个不同的url:单线程  import time import urllib2 def get_responses(): urls = [ 'http://www.google.com', 'http://www.amazon.co

python中TCP方式实现socket通讯

Server: # server import socket address = ('127.0.0.1', 31500) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # s = socket.socket() s.bind(address) s.listen(5) ss, addr = s.accept() print 'got connected from',addr ss.send('byebye') ra = ss.recv

python中mechanize库的简单使用示例_python

复制代码 代码如下: #!/usr/bin/env/ python#coding=utf-8import mechanizeimport cookielib # Cookie Jarcj = cookielib.LWPCookieJar() # Browserbr = mechanize.Browser()br.set_cookiejar(cj) # Browser optionsbr.set_handle_equiv(True)br.set_handle_gzip(True)br.set_ha

简单谈谈Python中的反转字符串问题_python

按单词反转字符串是一道很常见的面试题.在Python中实现起来非常简单. def reverse_string_by_word(s): lst = s.split() # split by blank space by default return ' '.join(lst[::-1]) s = 'Power of Love' print reverse_string_by_word(s) # Love of Power s = 'Hello World!' print reverse_stri

Python中各种方法的运作原理解析

         这篇文章主要介绍了深入理解Python中各种方法的运作原理,包括抽象方法和静态方法和类方法等之间异同的比较,需要的朋友可以参考下             方法在Python中是如何工作的         方法就是一个函数,它作为一个类属性而存在,你可以用如下方式来声明.访问一个函数: ? 1 2 3 4 5 6 7 8 >>> class Pizza(object): ... def __init__(self, size): ... self.size = size

Python中for循环详解_python

与其它大多数语言一样,Python 也拥有 for 循环.你到现在还未曾看到它们的唯一原因就是,Python 在其它太多的方面表现出色,通常你不需要它们. 其它大多数语言没有像 Python 一样的强大的 list 数据类型,所以你需要亲自做很多事情,指定开始,结束和步长,来定义一定范围的整数或字符或其它可重复的实体.但是在 Python 中,for 循环简单地在一个列表上循环,与 list 解析的工作方式相同. 1. for  循环介绍 复制代码 代码如下: >>> li = ['a'

Python中断言Assertion的一些改进方案_python

Python Assert 为何不尽如人意? Python中的断言用起来非常简单,你可以在assert后面跟上任意判断条件,如果断言失败则会抛出异常. >>> assert 1 + 1 == 2 >>> assert isinstance('Hello', str) >>> assert isinstance('Hello', int) Traceback (most recent call last): File "<input>

简单介绍Python中的RSS处理_python

RSS 是一个可用多种扩展来表示的缩写:"RDF 站点摘要(RDF Site Summary)"."真正简单的辛迪加(Really Simple Syndication)"."丰富站点摘要(Rich Site Summary)",也许还能用其他扩展来表示.在如此混乱的名称背后,您会发现和这样一个平凡的技术领域相关的故事多得令人吃惊.RSS 是用于分发 Web 站点上的内容的摘要的一种简单的 XML 格式.它能够用于共享各种各样的信息,包括(但不是

Python的Django中django-userena组件的简单使用教程

  这篇文章主要介绍了Python的Django中django-userena组件的简单使用教程,包括用户登陆和注册等简单功能的实现,需要的朋友可以参考下 利用twitter/bootstrap,项目的基础模板算是顺利搞定.接下来开始处理用户中心. 用户中心主要包括用户登陆.注册以及头像等个人信息维护.此前,用户的注册管理我一直使用django-registration.只是这个APP有些不思进取,09年发布了0.8alpha版后就一直没什么动静.这次决定尝试另外一个用户模块组件django-u