python模块—socket
创建套接字:
socket.socket(family,type[,protocal])
使用给定的地址族、套接字类型、协议编号(默认为0)来创建套接字。
1. socket类型:
socket.AF_UNIX:只能够用于单一的Unix系统进程间通信
socket.AF_INET:服务器之间网络通信
socket.AF_INET6:IPv6
socket.SOCK_STREAM:流式socket,for TCP
socket.SOCK_DGRAM:数据报式socket,for UDP
socket.RAW:原始套接字。利用原始套接字:
- 可以处理普通的套接字无法处理的ICMP、IGMP等网络报文;
- 可以处理特殊的IPv4报文;
- 可以通过IP_HDRINCL套接字选项由用户构造IP头
socket.SOCK_SEQPACKET:可靠的连续数据包服务
例如:
创建TCP socket: s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
创建UDP socket: s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
2. socket函数
服务器函数:
s.bind(address):将套接字绑定到地址,在AF_INET下,以元祖(host,port)的形式表现地址
s.listen(backlog):开始监听TCP连接。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数。至少为1
s.accept():接收TCP连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发生数据。address是连接客户端的地址。
客户端函数:
s.connect(address):连接到address处的套接字。一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误
s.connect_ex(address):功能与connect(address)相同,但是成功返回0,失败返回errno的值
公共函数:
s.recv(bufsize[,flag]):接收TCP套接字的数据。数据以字符串形式返回,bufsize指定要接收的最大数据量。flag提供有关消息的其他消息,常忽略
s.send(string[,flag]):发送TCP数据。将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小
s.sendall(string[,flag]):完整发送TCP数据。将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常
s.recvfrom(bufsize[,flag]):接收UDP套接字的数据。与recv()类似,但返回值是(data,address)。其中data是包含接收数据的字符串,address是发送数据的套接字地址
s.sendto(string[,flag],adress):发送UDP数据。将数据发送到套接字,address是形式为(ipaddr,port)的元组,指定远程地址。返回值是发送的字节数
s.close():关闭套接字
3. 实例
Server:
1 #-*- coding: UTF-8 -*- 2 3 __author__ = '007' 4 __date__ = '2016/1/27' 5 6 import socket 7 8 HOST,PORT = '',8888 9 10 11 s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 12 #s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) 13 s.bind((HOST,PORT)) 14 s.listen(1) 15 print "Serving HTTP on host %s..." % HOST 16 print "Serving HTTP on port %s..." % PORT 17 18 while True: 19 client_conn,client_addr = s.accept() 20 request = client_conn.recv(1024) 21 print request 22 http_response = """ 23 HTTP/1.1 200 OK 24 25 Hello C! 26 """ 27 print client_conn.sendall(http_response) 28 29 client_conn.close()
运行:
E:\Py\testing>python module/sock-s.py Serving HTTP on host ...
Serving HTTP on port 8888..
WEB浏览器:
TCP连接成功,正常会话!
telnet会话:
telnet 127.0.0.1 8888
Client:
1 #-*- coding: UTF-8 -*- 2 3 __author__ = '007' 4 __date__ = '2016/1/27' 5 6 import socket 7 8 s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 9 10 s.connect(("127.0.0.1",8888)) 11 s.send("Hello S") 12 print s.recv(1024) 13 14 s.close()
运行:
E:\Py\testing>python module/sock-c.py HTTP/1.1 200 OK Hello C!