`
haoningabc
  • 浏览: 1483111 次
  • 性别: 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

分享到:
评论

相关推荐

    pythonsocket

    在Python标准库中,socket是进行网络通信的基础,通过它我们可以实现客户端和服务端的通信、数据传输等功能。此外,我们还会涉及select、asyncore、asynchat等高级网络编程模块的应用,这些模块能够帮助开发者更高效...

    python socket 石头剪刀布游戏_socket_python_MYSQL_

    在Python编程领域,Socket是用于网络通信的一种基础模块,它允许程序通过网络发送和接收数据。在这个项目中,我们利用Python的socket库构建了一个石头剪刀布(RPS,Rock-Paper-Scissors)游戏,同时结合了MySQL...

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

    总结来说,这个Python聊天室程序展示了如何使用`socket`模块和`select`函数实现基本的网络通信功能,特别是服务端如何处理多个并发的客户端连接。通过学习和理解这个示例,开发者可以进一步掌握Python在网络编程中的...

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

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

    Python基于select实现的socket服务器

    本文将详细介绍如何利用Python中的`select`模块来实现一个简单的Socket服务器,并深入探讨其工作原理和应用场景。 #### 二、基础知识回顾 1. **Socket简介**: - Socket是网络编程的基础,它为应用程序提供了网络...

    Python 中的 Socket 编程

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

    python网络应用开发-网页前端基础.docx

    Python 提供了多种网络编程库,包括 Socket 库、select 库、Twisted 库等。其中,Socket 库是最基础的网络编程库。 二、Socket 库 Socket 库是 Python 中的网络编程库之一,提供了基本的网络通信功能。Socket 库...

    Python 网络编程 python网络编程 socket

    Python 中有多种 socket 编程库,例如 socket 库、select 库等。这些库提供了不同的 socket 编程接口,方便开发者快速实现网络服务。 Python 网络编程的应用非常广泛,例如网络爬虫、网络游戏、社交媒体等。 ...

    python代码,用epoll处理socket并发(csdn)————程序.pdf

    在Python编程中,处理并发的网络连接通常会涉及到I/O多路复用技术,这里主要讲解的是使用`select.epoll()`来实现socket并发处理的方法。`epoll`是Linux内核提供的一种高效I/O事件通知机制,适用于大量并发连接的情况...

    python socket 通讯源码

    Python的socket库是进行网络通信的基础模块,它允许程序员创建自定义的网络协议,包括TCP(传输控制协议)和UDP(用户数据报协议)等。在这个案例中,我们有两个文件,`soc_server.py`和`soc_client.py`,分别代表...

    python_socket详解

    在深入了解 Python 的 `socket` 模块之前,我们先来回顾一下网络通信的基础概念。 ##### 1.1 Internet通信 互联网上的通信主要依赖于 IP 协议和 TCP/UDP 协议。IP 协议负责将数据包从一个主机发送到另一个主机,而...

    python_DB__SOCKET开源

    本项目主要关注于Python中的网络编程(Socket)和数据库操作(DB)两大方面。通过开源的方式,帮助开发者更好地理解和应用Python进行数据处理和网络交互。 ### 描述:Python_DB__SOCKET开源,主要针对数据的操作和...

    Python socket实现简单聊天室

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

    HP-Socket文档

    * 通用性:HP-Socket 提供 C/C++、C#、Delphi、E(易语言)、Java、Python 等编程语言接口,支持 Windows 和 Linux 平台。 HP-Socket 是一个功能强大、易用、高性能的通信框架,非常适合于各种不同应用场景的 TCP/...

    Python示例-从基础到高手PDF

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

    Python基于Socket实现简单聊天室

    1. **初始化设置**:首先导入必要的库`socket`和`select`,并定义服务器的IP(此处为空字符串代表所有可用的网络接口)和端口号7799。同时,创建两个空列表`inputs`用于存储输入流的套接字和`members`用于存储已连接...

    Python自学教程-05-socket的介绍.ev4.rar

    在Python中,还有一些高级的socket功能,如套接字选项(socket options)、多路复用(如select和poll)、套接字超时等,它们可以用来优化网络程序的性能和处理复杂情况。 最后,`Python自学教程-05-socket的介绍.ev...

    socket编程基础

    ### Socket编程基础知识点 #### 一、网络通信与Socket概念 - **Socket**:在网络通信中,Socket(套接字)是一种用于不同主机之间或同一主机上不同进程间通信的抽象概念。它允许应用程序通过网络进行通信,是TCP/...

    Python网络编程.pdf

    在 Python 中,创建一个套接字对象通常通过 `socket.socket()` 函数来完成。这个函数接受两个参数:地址族和套接字类型。常用的地址族包括 `AF_INET`(用于 IPv4 地址)和 `AF_INET6`(用于 IPv6 地址)。套接字类型...

Global site tag (gtag.js) - Google Analytics