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!
原文地址:https://www.cnblogs.com/andr01la/p/5158918.html