原地址:http://blog.163.com/benben_long/blog/static/19945824320121225918434/

网络客户端:

1. 理解socket: socket是操作系统I/O系统的延伸部分,它扩展了操作系统的基本I/O到网络通信,使进程和机器之间的通信成为可能。建立 socket 需要通过调用 socket() 函数,并且还需要另外的调用来连接和激活它们( recv() 和 send() ) 。

2. 建立socket:首先需要建立一个实际的socket对象,其次需要把它连接到远程服务器上。建立socket对象的时候需要告诉系统两件事情:通信协议和协议家族。

通信协议:Internet通信类型基本上都是AF_INET,和 IPv4 对应。

协议家族:SOCK_STREAM ( TCP通信 ) 或 SOCK_DGRAM ( UDP通信 ) 。

TCP建立socket连接:

s = socket.socket( socket.AF_INET, socket.SOCK_STREAM )

UDP建立socket连接:

s = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )

3. 连接socket:一般需要一个tuple,包含远程主机名( 或IP地址) 和远程端口。

连接一个socket一般使用如下代码:

s.connect(( "www.example.com", 80))

由以上代码可看出,我们可以通过使用域名来连接远程主机,因为python为我们做了DNS解析。

http站点的的默认端口是80。python的socket库包含一个getservbyname()的函数可以自动查询服务器端口号列表。

该函数需要两个参数:协议名和端口名。

port = socket.getservbyname( "http", "tcp" )

注:getservbyname() 方法是直接调用操作系统API。

4. 从socket获取信息。

connect.py

 1 #!/usr/bin/env python
2 # Information Example
3  
4  import socket
5
6  print "Creating socket... "
7 s = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
8  print "Done!"
9
10  print "Looking up port number... "
11 port = socket.getservbyname( "http", "tcp" )
12  print "Done!"
13
14  print "Connecting to remote host on port %d..." % port
15 s.connect(( "www.google.com", port ))
16  print "Done!"
17
18  print "Connected from ", s.getsockname()
19  print "Connected to ", s.getpeername()

运行结果:

可以看到,本次连接系统分配的端口号为2728,每次运行该程序此端口号一般不相同。

5. 利用socket通信。

python提供了两种通信方法:socket对象和文件类对象。

socket 对象提供了操作系统的 send(), sendto(), recv(), recvfrom() 调用的接口。

文件类对象则提供了 read(), write() readline() 等python接口。

文件类对象一般只对TCP连接工作得很好,对UDP连接反而不是很发。

6. 处理错误与socket异常。

与一般I/O和通信问题有关的 socket.error;

与查询地址信息有关的 socket.gaierror;

与其他地址错误有关的 socket.herror;

与在一个socket上调用settimeout()后,处理超时有关的socket.timeout。

7. UDP客户端和TCP客户端的区别。

<1>. 当socket建立的时候,程序调用的是 socket.SOCK_DGRAM ,而不是 SOCK_STREAM 。这会向操作系统提示socket将使用UDP通信,而不是TCP。

<2>. 对socket.getsevbyname()的调用寻找的是UDP端口,而不是TCP的。不是协议可使用同一端口号。

<3>. 程序没有办法探测服务器什么时候发送完数据。这是因为这里其实没有什么实际的连接。对connect()的调用只是初始化了一些内在参数。同时,服务器也 许不会返回任何数据,或者数据也许在传输过程中丢失,程序并没有智能地判断这个问题,因此,当结束等待传来的信息包时,需要按下Ctrl-C 。

网络服务器

1. 服务器的特点是等待来自客户端的请求,发送应答。与客户端类似,使用的是和客户端同样的socket接口,但建立socket的细节却是不同的。

2. 准备连接。

<1>. 建立socket对象。可以使用和客户端中使用的同一个socket对象。

s = socket.socket( socket.AF_INET, socket.SOCK_STREAM )

<2>. 设置socket选项(可选)。

s.setsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR, 1 )

<3>. 绑定到一个端口(同样,也可以是一个指定的网卡)。bind()函数第一个参数是你要绑定的IP地址,通常为空,意思是可以绑定到所有的接口和地址。

s.bind(( host, port ))

<4>. 侦听连接。唯一参数指明了服务器实际处理连接的时候,允许有多少个未决(等待)的连接在队列中等待。

s.listen(5)

3. 接受连接。

通常服务器连续运行的办法是小心地设计一个无限循环。

server.py

 1 #!/usr/bin/env python
2 # Base Server
3  
4  import socket
5
6 host = ''
7 port = 51423
8
9 s = socket.socket( socket.AF_INET, socket.SOCK_STREAM)
10 s.setsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR, 1 )
11 s.bind((host, port))
12  print "Waiting for connections... "
13 s.listen(1)
14
15 while 1:
16 clientsock, cliendaddr = s.accept()
17 print "Got connection from ", clientsock.getpeername()
18 cliendsock.close()

这里的循环是:当你调用 accept() 的时候,它只在有一个客户端连接后才返回,同时程序会停止,并不使用任何CPU资源。

一个停止并等待输入或输出的程序称为被阻塞的程序。

测试此服务器程序可以使用操作系统的 telnet 指令。对于这个程序,先运行服务器,接着运行 telnet localhost 51423 。服务器程序会报告一个连接,并且 telnet 程序会立即终止。

4. 使用UDP。

在服务器端使用UDP,可以像使用TCP一样建立一个socket, 设置选项,并调用 blind() 函数。然而,不必使用 listen() 或 accept() 函数,仅仅使用 recvfrom() 函数就可以了。这个函数实际上会返回两个信息:收到的数据,以及发送这些数据的程序地址和端口号。

5. 避免死锁。

死锁发生在当一个服务器和客户端同时试图往一个连接上写东西和同时从一个连接上读的时候。在这些情况下,没有进程可以得到任何数据(如果它们都正在 读)。因此,如果它们正在写,向外的buffer会被充满,结果它们就好像是被骗了,什么都做不了。(解决?确保客户端每次执行完send()后进行一次 recv();简单地使客户端发送较少的数据;使用多线程,使客户端可以同时发送和接收。)小心地设计协议并适当地使用超时,可以把死锁出现的频繁和影响 减至最小。

《转》python 网络编程的更多相关文章

  1. Python 网络编程(二)

    Python 网络编程 上一篇博客介绍了socket的基本概念以及实现了简单的TCP和UDP的客户端.服务器程序,本篇博客主要对socket编程进行更深入的讲解 一.简化版ssh实现 这是一个极其简单 ...

  2. Python 网络编程(一)

    Python 网络编程 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. ...

  3. Python学习(22)python网络编程

    Python 网络编程 Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的 ...

  4. Day07 - Python 网络编程 Socket

    1. Python 网络编程 Python 提供了两个级别访问网络服务: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口 ...

  5. python网络编程-01

    python网络编程 1.socket模块介绍 ①在网络编程中的一个基本组件就是套接字(socket),socket是两个程序之间的“信息通道”. ②套接字包括两个部分:服务器套接字.客户机套接字 ③ ...

  6. 《Python网络编程》学习笔记--使用谷歌地理编码API获取一个JSON文档

    Foundations of Python Network Programing,Third Edition <python网络编程>,本书中的代码可在Github上搜索fopnp下载 本 ...

  7. Python网络编程基础pdf

    Python网络编程基础(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1VGwGtMSZbE0bSZe-MBl6qA 提取码:mert 复制这段内容后打开百度网盘手 ...

  8. python 网络编程(Socket)

    # from wsgiref.simple_server import make_server## def RunServer(environ,start_response):# start_resp ...

  9. python 网络编程 IO多路复用之epoll

    python网络编程——IO多路复用之epoll 1.内核EPOLL模型讲解     此部分参考http://blog.csdn.net/mango_song/article/details/4264 ...

  10. 自学Python之路-Python网络编程

    自学Python之路-Python网络编程 自学Python之路[第一回]:1.11.2 1.3

随机推荐

  1. hdu 5015 大数量反复类似操作问题/ 矩阵高速幂

    题意: 给一个矩阵a,第一行是 0. 233,2333,23333.....第一列读入.列数<10^9.行数<=10. 先转化操作: m是大数量.必定每次向前推一列.就是每次乘一个矩阵T. ...

  2. C陷阱与缺陷代码分析之第2章语法陷阱

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 陷阱1 理解函数声明 作者提出一个问题:有一个首地址为0的函数,该函数返回值类型为void,没有参数.怎样用C语言的 ...

  3. Delphi控件下载网

    http://delphi-z.ru/index.php http://developer.team/delphi/

  4. Android-x86 4.4-r5 发布,PC 上的安卓系统

    Android x86 即运行于 x86 PC上的Android操作系统,目前已经支持大部分安卓程序. Android X86平台是由Beyounn和Cwhuang主持设计的.项目的主要目的在于为X8 ...

  5. [置顶] RFS的web自动化验收测试——常见问题指引

    引言:什么是RFS——RobotFramework+Selenium2library,本系列主要介绍web自动化验收测试方面. ( @齐涛-道长 新浪微博) 下面的内容还没整理好,先发个问题解决机制吧 ...

  6. 函数指针&amp;绑定: boost::functoin/std::function/bind

    see link: https://isocpp.org/wiki/faq/pointers-to-members function vs template: http://stackoverflow ...

  7. BZOJ 1305 CQOI2009 dance跳舞 二分答案+最大流

    题目大意:给定n个男生和n个女生,一些互相喜欢而一些不.举行几次舞会,每次舞会要配成n对.不能有同样的组合出现.每一个人仅仅能与不喜欢的人跳k次舞,求最多举行几次舞会 将一个人拆成两个点.点1向点2连 ...

  8. shell语法简单介绍

    一.基本的语法 1.1.shell文件开头 shell文件必须以以下的行開始(必须方在文件的第一行):  #!/bin/sh  符号#!用来告诉系统它后面的參数是用来运行该文件的程序.在这个样例中我们 ...

  9. ASP.NET - 记住滚动条的位置

    MaintainScrollPositionOnPostback ="true" 如果是滚动条在最下面,那么如果刷新页面,滚动条回到最上面. 使用这个属性之后,滚动条会在刷新之前的 ...

  10. Qt控件精讲一:按钮

    原地址:http://blog.csdn.net/yuxikuo_1/article/details/17397109 Qt Creater提供6种Button控件.如图1. Button控件介绍 控 ...