Socket网络编程,当不涉及底层的东西时十分简单。Python的Socket编程比C语言更加的简单,举例,C语言要建立TCP时需要知道IP地址和端口号,不能直接按照域名和端口号进行。但是Python却可以,Python自带DNS解析部分,可以直接利用URL和端口号建立连接。代码:

操作系统往往都有一个一个服务器端口号的列表,Unix系统中,在/etc/service目录下找到这个列表。Python的socket库中包含一个getservicebyname()的函数,可以自动查询协议的端口号。举例代码如下:

一旦建立了一个Socket连接,您就可以从它那里得到有用的信息,代码:

利用Socket能够做很多事情,比如建立简单的通信机制,进行发送和接受数据。Python提供的两种方法都很好用,一种是Socket对象一种是文件的类对象,Socket对象提供了操作系统的Send()、Sendto()、recv()、recvfrom()的调用接口。文件类对象提供了read()、write()、readline()这些典型的Python接口。当您有一些特殊要求的时候,Socket对象十分有用。例如:读写数据时,加入需要协议可以详细的控制,使用二进制传送固定大小的文件时,数据超时需要特殊处理时;再或者是任何不只需要的简单读写时。当您编写UDP程序的时候,Socket对象同样很好用。文件类对象一般用于面向线性的协议,因为它能通过提供readline()函数自动处理大量解析的工作,文件类对象一般对TCP连接工作的很好,对UDP连接反而不是很好。因为TCP连接可以保证数据完整,TCP的传输是像文件一样通过字节流进行的。而UDP是一种基于信息包的通信。文件类对象没有办法操作每个基本的信息包。
在网络通信中出现异常是不可避免的。不稳定的通信环境都会造成异常。例如:服务器关机、连接中断等。下面一个程序是简单的HTTP请求,包括了一些异常的处理。在这个程序中,异常处理只是简单地打印出一个友好的信息并终止运行。并捕获所有在这个例子中可能产生的和网络相关的异常。python的sockets模块实际上定义了4种可能出现的异常:
* 与一般I/O和通信问题有关的Socket.error;
* 与查询地址信息有关的Socket.gaierror;
* 与其他地址错误有关的Socket.herror(和C语言中的h_error相关)
* 与在一个Socket上调用settimeout()后,处理超时有关的Socket.timeout()

以上的错误处理机制还不够,在客户端向服务器进行写操作之后,还应该关闭连接。使用shutdown()函数:

再举一个使用makefiel()和shutdown()处理异常的函数。文件类对象由于缓冲器引起的错误可能比较容易出错,因为无法控制具体是什么时候产生发送数据的尝试。避免在文件类对象中使用缓冲器。对flush()的调用,因为makefile()的调用没有制定缓冲(buffer)。这个调用不是必须的,但是当使用了缓冲器时,则需要使用。

使用UDP通信从来不使用文件类型对象,因为不能为数据提供一定稳定性和控制。先来一个基本的UDP客户端程序:

值得一提的时候,UDP程序有时候根本不调用Connect函数。这个程序是RFC868上定义的简单时间协议的示范,程序向time.nist.gov的服务器发送了一个空字符,并未建立connect。程序如下:

2014.10.11—Mac下ssh翻墙

今天闲来无事,研究了一下mac下的翻墙。VPN,goagent,ssh。亲测之后还是觉得ssh是最方便的。由于mac自带的Unix解释器。因此本身就支持ssh命令。当你有一个免...

阅读全文

2014.8.26—Python网络编程(四):域名系统

域名系统(DNS)是一个分布式数据库,用来把主机名编程IP地址,DNS以及想关系统之所以存在,有以下两个原因:域名例如www.jevylee.com比IP地址例如222.11.111.2...

阅读全文

2014.7.25—Python网络编程(三):网络服务器

服务器的特点是等待请求,返回应答。对于客户端来说,一般只需要两步。建立Socket对象调用connect()来建立一个和服务器的连接。对于服务器,这个过程需要4步...

阅读全文

欢迎留言

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据