python网络编程【三】(网络服务器)
建立一个服务器需要以下4步:
1.建立socket对象。
2.设置socket选项(可选的)
3.绑定到一个端口(同样,也可以是一个指定的网卡)。
4.侦听连接。
下面代码片段可以实现这些功能:
1 host = '' 2 port = 51423 3 4 # 建立socket对象 5 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 6 7 #指定该socket被关闭或服务器进程终止后马上释放该服务器端口 8 s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 9 10 #绑定到一个端口号 11 s.bind((host, port)) 12 13 #监听5个连接 14 s.listen(5)
socket选项:
其他还有些与您操作系统相关的选项。下面程序可以给出您机器上安装的python所支持的socket选项列表:
1 #!/usr/bin/env python 2 3 import socket 4 5 solist = [x for x in dir(socket) if x.startswith('SO_')] 6 solist.sort() 7 for x in solist: 8 print x
UDP服务端
从客户端角度来看,使用UDP比TCP要困难,因为客户端必须要注意丢失信息包的问题,而另一方面,在服务器端使用UDP则容易得多,程序员在编写UDP服务器时候,不用考虑丢失信息包的问题,如果从客户端来的信息包一直没有到达的话,UDP服务器根本不会知道客户端曾经试图发送过请求。
下面是一个简单的UDP应答服务器:
1 #!/usr/bin/env python 2 3 import socket, traceback 4 5 host = '' 6 port = 51423 7 8 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 9 10 s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 11 s.bind((host, port)) 12 13 while 1: 14 try: 15 message, address = s.recvfrom(8192) 16 print "Got data from", address 17 s.sendto(message, address) 18 except(KeyboardInterrupt, SystemExit): 19 raise 20 except: 21 traceback.print_exc()
如果您的协议只包括一个短的请求和一个短的响应,没有其他东西,UDP或许是个更好的选择。