`
haoningabc
  • 浏览: 1444298 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

socket基础和select(python)

阅读更多
上接
c语言的socket基础http://haoningabc.iteye.com/blog/2305026
使用python

一言不合上代码
server.py
import socket
s = socket.socket()
host = socket.gethostname()
port = 1234
s.bind((host,port))
s.listen(5)
while True:
    c, addr = s.accept()#阻塞
    print 'Got connection from', addr
    print c.recv(1024)#阻塞
    c.close()

客户端
client.py
import socket,sys
s = socket.socket()
host = socket.gethostname()
port = 1234
s.connect((host,port))
#hi=raw_input('hello? ') 
hi=sys.stdin.readline()[:-1]
s.send(hi)


代码效果一样
accept阻塞等待客户端
一个客户单就会建立一个c(connection)

最终服务端会变成
一个socket和多个connection

但是还是有顺序,阻塞问题

换上select解决阻塞
import socket,select

s = socket.socket()

host = socket.gethostname()
port = 1234
s.bind((host,port))

s.listen(5)
inputs = [s]
#print str(s)
while True:
    #rs=[]
    print "while starting....."
    rs, ws, es = select.select(inputs,[],[])
    #print("rs:"+str(rs))
    print("rs len:"+str(len(rs)))
    for r in rs:
        if r is s:
            c, addr = s.accept()
            print 'print Got connection from', addr
            inputs.append(c)
        else:
            #print "r is not sssssssssssssss"
            try:
                data = r.recv(1024)
                disconnected = not data
            except socket.error:
                disconnected = True

            if disconnected:
                print "print " ,r.getpeername(), 'disconnected'
                inputs.remove(r)
            else:
                print "print ",data

每次accept第一次阻塞完成取得connection后,就放到一个select监控数组里面

下一次循环的时候进入recv阻塞
使
所有的connection都变成recv
最终,任何一个client有数据接收都会马上收到相应,不会阻塞到某一个连接上,
相当于同时开了多个connection

一个好玩的tunproxy,使用select写的
http://www.secdev.org/projects/tuntap_udp/
把tun设备和socket用select关联起来
http://www.secdev.org/projects/tuntap_udp/files/tunproxy.py

分享到:
评论

相关推荐

    Python socket实现多对多全双工通信的方法

    import select# import signal#用于捕获中断信号 import cPickle#将python对象进行序列化:dumps将python对象序列化保存为字符串,loads与之相反 from socket import * HOST = '' def send(channel,*args):#发送数据 ...

    Python 中的 Socket 编程

    Python 中的 Socket 编程 说明 译者注 授权 开始 Socket API 概览 TCP Sockets 客户端 / 服务器echo 程序 echo 程序的服务端 echo 程序的客户端 运行echo 程序的客户端和服务端 查看 socket 状态 通信流程的分解 ...

    Python基于select实现的socket服务器

    主要介绍了Python基于select实现的socket服务器,实例分析了Python基于select与socket模块实现socket通信的相关技巧,需要的朋友可以参考下

    Python socket实现简单聊天室

    客户端由于select在Windows下只能对socket使用,所以使用了多线程来实现对客户端输入和socket连接的同时监控。注意这里的socket设置为了非阻塞。这样就实现了在一个线程中同时进行socket的接收和发送。 服务器代码:...

    python写的socket聊天室程序,包括客户端和服务端

    服务端可以接受多个客户端连接 客户端,服务端可以进行双向通信,双向发信息。 采用select函数,实现多客户连接. 该文件是自己写的,有不好的见谅,

    Python基于Socket实现简单聊天室

    本文实例为大家分享了Python基于Socket实现简单聊天室,供...import socket,select\nhost='' port=7799 addr=(host,port) inputs=[] members={} #配置服务端 def start_Server(): server=socket.socket(socket.AF_INET

    Python示例-从基础到高手PDF

    第 23 章 python 实现 select 和 epoll 模型 socket 网络编程 第 24 章 对 Python-memcache 分布式散列和调用的实现 第 25 章 Parallel Python 实现程序的并行多 cpu 多核利用【pp 模块】 第 26 章 关于 python ...

    第10周-第16章节-Python3.5-Select解析Socket通信3.avi

    第10周-第16章节-Python3.5-Select解析Socket通信3.avi

    第10周-第17章节-Python3.5-Select解析Socket通信4.avi

    第10周-第17章节-Python3.5-Select解析Socket通信4.avi

    第10周-第15章节-Python3.5-Select解析Socket通信2.avi

    第10周-第15章节-Python3.5-Select解析Socket通信2.avi

    第10周-第14章节-Python3.5-Select解析Socket通信1.avi

    第10周-第14章节-Python3.5-Select解析Socket通信1.avi

    Python网络编程使用select实现socket全双工异步通信功能示例

    本文实例讲述了Python网络编程使用select实现socket全双工异步通信功能。分享给大家供大家参考,具体如下: 在前面一篇《Python网络编程之TCP套接字简单用法》中,我们实现了tcp客户端与服务器的通信,但是功能十分...

    python select.select模块通信全过程解析

    select()方法接收并监控3个通信列表, 第一个是所有的输入的data,就是指外部发过来的数据,第2个是监控和接收所有要发出去的data(outgoing data),第3个监控错误信息 在网上一直在找这个select.select的参数解释, 但...

    Python中使用select模块实现非阻塞的IO

    通常也称作”套接字”,用于描述IP地址和端口,是一个通信链的句柄。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。...

    python3.6.5参考手册 chm

    Python参考手册,官方正式版参考手册,chm版。以下摘取部分内容:Navigation index modules | next | Python » 3.6.5 Documentation » Python Documentation contents What’s New in Python What’s New In ...

    深入理解python中的select模块

    Python中的select模块专注于I/O多路复用,提供了select poll epoll三个方法(其中后两个在Linux中可用,windows仅支持select),另外也提供了kqueue方法(freeBSD系统) select方法 进程指定内核监听哪些文件描述符...

    Python313道企业面试题集锦(附答案).pdf

    第一部分 Python 基础篇.(1-80题) 第二部分 网络编程和并发.(81-112题) 第三部分 数据库和缓存.(113 -158 题) 第四部分 前端、框架和其他(155 题) 81.简述 OSI 七层协议。 82.什么是 C/S 和 B/S 架构?. ...

    Beginning Python (2005).pdf

    Single-Threaded Multitasking with select 348 Other Topics 350 Miscellaneous Considerations for Protocol Design 350 Trusted Servers 350 Terse Protocols 350 The Twisted Framework 351 Deferred ...

Global site tag (gtag.js) - Google Analytics