`
acen.chen
  • 浏览: 157351 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Python的网络编程(二)

阅读更多

三、使用低级的socket通信

尽管Python提供了一些封装,使得使用socket更容易,但是你也可以直接使用socket来工作。

1、创建和销毁socket

socket模块中的socket(family,type[,proto])函数创建一个新的socket对象。family的取值通常是AF_INET。type的取值通常是SOCK_STREAM(用于定向的连接,可靠的TCP连接)或SOCK_DGRAM(用于UDP):

>>> from socket import *
>>> s=socket(AF_INET,SOCK_STREAM)


family和type参数暗指了一个协议,但是你可以使用socket的第三个可选的参数(proto的取值如IPPROTO_TCP或IPPROTO_RAW)来指定所使用的协议。代替使用IPPROTO_XX变量,你可以使用函数getprotobyname:

>>> getprotobyname('tcp')
6
>>> IPPROTO_TCP
6


fromfd(fd,type[,proto])是一个很少被使用的函数,它用来从打开的一个文件描述符创建一个socket对象(文件描述符由文件的fileno()方法返回)。文件描述符与一个真实的socket连接,而非一个文件。socket对象的fileno()方法返回关于这个socket的文件描述符。

当你使用完工socket对象时,你应调用close()方法显式的关闭socket以尽快释放资源(尽管socket被垃圾回收器回收时将自动被关闭)。另外,你也可以使用shutdown(how)方法来关闭连接一边或两边。参数0阻止socket接收数据,1阻止发送,2阻止接收和发送。

2、连接socket

当两个socket连接时(例如使用TCP),一端监听和接收进来的连接,而另一端发起连接。临听端创建一个socket,调用bind(address)函数去绑定一个特定的地址和端口,调用listen(backlog)来临听进来的连接,最后调用accept()来接收这个新的,进来的连接,下面是在服务器端的代码:

>>> s=socket(AF_INET,SOCK_STREAM)
>>> s.bind(('127.0.0.1',44444))
>>> s.listen(1)
>>> q,v=s.accept() #返回socket q和地址v


注意:上面的代码将一直处于等待直到连接被建立。下面我们再打开另一个Python解释器,用作客户端;然后键入如下代码:
>>> from socket import *
>>> s=socket(AF_INET,SOCK_STREAM)
>>> s.connect(('127.0.0.1',44444) #发起连接


好了,我们验证一下连接是否建立了。我们在服务器端键入以下代码来发送一条信息:

>>> q.send('hello,i come from pythontik.com')
31 #发送的字节数


在客户端键入以下代码来接收信息:
>>> s.recv(1024)
'hello,i come from pythontik.com'


你传递给bind和connect的地址是一个关于AF_INET的socket的元组(ipAddress,port)。代替connect,你也可以调用connect_ex(address)方法。如果背后对C的connect的调用返回一个错误,那么connect_ex也将返回一个错误(否则返回0代表成功),代替引发一个异常。

当你调用listen时,你给了它一个参数,这个数值表示在等待队列中允许放置的进来的连接总数。当等待队列已满时,如果有更多的连接到达,那么远程端将被告知连接被拒绝。在socket模块中的SOMAXCONN变量表明了等待队列所能容纳的最大量。

accept()方法返回形如bind和connect的一个地址,代表远程socket的地址。下面显示变量v的值:

>>> v
('127.0.0.1', 1334)


UDP是不定向的连接,但是你仍然可以使用给定的目的地址和端口来调用connect去关联一个socket。

3、发送和接收数据

函数send(string[,flags])发送给定的字符串到远程socket。sendto(string[,flags],address)发送给定的字符串到一个特定的地址。通常,send方法用于可靠连接的socket,sendto方法用于不可靠连接的socket,但是如果你在一个UDP socket上调用connect来使它与一个特定的目标建立联系,那么这时你也可以使用send方法来代替sendto。

send和sendto都返回实际发送的字节数。当你快速发送大量的数据的时候,你可能想去确保全部信息已被发送,那么你可以使用如下的一个函数:

def safeSend(sock,msg):
    sent=0
    while msg:
        i=sock.send(msg)
        if i==-1: #发生了错误
            return -1
        sent+=i
        msg=msg[i:]
        time.sleep(25) 
    return  sent


recv(bufsize[,flags])方法接收一个进来的消息。如果有大量的数据在等待,它只返回前面的bufsize字节数的数据。recvfrom(bufsize[,flags])做同样的事,除了它使用AF_INET socket的返回值是(data,(ipAddress,port)),这便于你知道消息来自哪儿(这对于非连接的socket是有用的)。

send,sendto,recv和recvfrom方法都有一个可选的参数flags,默认值为0。你可以通过对socket.MSG_*变量进行组合(按位或)来建立flags的值。这些值因平台而有所不同,但是最通用的值如下所示:

MSG_OOB:处理带外数据(既TCP紧急数据)。
MSG_DONTROUTE:不使用路由表;直接发送到接口。
MSG_PEEK:返回等待的数据且不把它们从队列中删除。

例如,如果你有一个打开的socket,它有一个消息等待被接收,你可以接收这个消息后并不把它从进来的数据的队列中删除:

>>> q.recv(1024,MSG_PEEK)
'hello'
>>> q.recv(1024,MSG_PEEK) #因为没有删除,所以你可以再得到它。
'hello'


makefile([mode[,bufsize]])方法返回一个文件类对象,其中封装了socket,以便于你以后将它传递给要求参数为一个文件的代码(或许你喜欢使用文件的方法来代替send和recv)。这个可选的mode和bufsize参数的取值和内建的open函数一样。

分享到:
评论

相关推荐

    Python网络编程(Linux)_网络编程_python_linux网络编程_

    Python网络编程在Linux环境下是一个强大的工具,用于构建服务器端应用程序和服务。这个主题涵盖了多个关键知识点,包括基础概念、Python的网络库、套接字编程、并发处理以及在Linux系统中的应用。 1. **网络编程...

    python网络编程基础

    Python网络编程基础是入门Python网络应用开发的重要领域,它涵盖了从基本的网络概念到复杂的网络交互技术。在Python中,网络编程主要涉及TCP/IP协议、HTTP协议、套接字编程、Web服务API调用等多个方面。下面将详细...

    PYTHON网络编程基础

    PYTHON网络编程基础.pdfPYTHON网络编程基础.pdfPYTHON网络编程基础.pdfPYTHON网络编程基础.pdfPYTHON网络编程基础.pdfPYTHON网络编程基础.pdfPYTHON网络编程基础.pdf

    python网络编程第3版pdf

    Python是一种功能十分强大的面向对象编程语言,可以用于编写独立程序、快速脚本和复杂应用的原型。作为一种开源软件,Python可以自由获取,而且非常易学易用。本书是Python语言的经典入门读本,由两名顶尖的Python...

    PYTHON网络编程基础.pdf

    Python网络编程是现代软件开发中的重要组成部分,它允许开发者创建能够与互联网交互的应用程序,如Web服务器、客户端应用、数据抓取工具等。本资源"PYTHON网络编程基础.pdf"是针对初学者的一份详尽指南,旨在帮助...

    python网络编程(第三版)

    python网络编程,适用于网络编程方向的同学,书中采用的是python3的代码。

    python 网络编程和网络编程基础

    Python网络编程是现代软件开发中的重要组成部分,尤其在大数据、云计算和物联网等领域的应用日益广泛。本主题将深入探讨Python在网络编程方面的基础知识和实践技巧。 首先,Python的网络编程主要涉及套接字(socket...

    python网络编程.pdf

    python网络编程

    Python网络编程视频.rar

    Python网络编程视频讲解3 ICMP UDP.avi Python网络编程视频讲解10.phon实战avi Python网络编程视频讲解9数据库mp4 Python网络编程视频讲解8Na Python网络编程视频讲解5 SNMP Syslog NTP.avi Python网络编程视频拼解2...

    Python网络编程基础

    《Python网络编程基础》这本书是Python开发者学习网络编程的重要资源,尤其适合初学者入门。它涵盖了从基础到高级的各种主题,旨在帮助读者深入理解Python在处理网络通信时的各种技术和概念。 首先,书中会讲解...

    Python 网络编程 python网络编程 socket

    Python 网络编程_python网络编程_socket Python 网络编程是指使用 Python 语言进行网络通信编程,包括 socket 编程、网络通信协议等方面的内容。下面是对 Python 网络编程的详细介绍: 1. 网络通信的概念 网络...

    Python网络编程基础第二版 源代码

    Python网络编程基础第二版的源代码是一份宝贵的教育资源,它涵盖了Python在进行网络通信和数据交换方面的核心概念和技术。这份源代码提供了丰富的示例和练习,帮助初学者深入理解网络编程的基本原理。以下是对这份...

    python网络编程第三版(中文加英文,还附加网络编程攻略中文版)

    《Python网络编程第三版》是一本深入探讨Python网络编程的权威书籍,中文版与英文版双语对照,为读者提供了更多的学习选择。本书主要面向应用开发者,旨在介绍网络编程的基本概念、Python内置的网络编程模块以及一些...

    PYTHON网络编程基础pdf

    本资源"PYTHON网络编程基础pdf"提供了一个全面的指南,帮助初学者理解和掌握Python网络编程的基础知识。 网络编程主要包括两个方面:客户端编程和服务器端编程。客户端编程涉及创建能够访问网络资源(如网页或API)...

Global site tag (gtag.js) - Google Analytics