socket(family,type[,protocal])
family是使用地址族,常用的协议族有AF_INET、AF_INET6、AF_LOCAL(或称AF_UNIX、UNIX域Socket)、AF_ROUTE等。默认值为socket.AF_INET。
type用来指明Socket类型,这里有三个值可以使用: SOCK_STREAM(TCP类型,保障数据顺序和可靠性)、SOCK_DGRAM(UDP类型,不保证数据连接顺序,非可靠连接)、SOCK_RAW(原始类型,允许对底层协议如IP或ICMP进行直接访问)。默认值为SOCK_STREAM。
protocal是使用的协议,参数可选。通常赋值’0’,由系统自动选择。
初始化TCP类型:
s=socket.socket()
或s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
初始化UDP类型:
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
2.Socket常用的函数
2.1 服务器端函数:
bind():将之前创建的Socket与指定I的P地址和端口进行绑定。如果之前使用了AF_INFT初始化Socket,可以使用元组(host,port)的形式表示地址。例如:s.bing(('127.0.0.1',8080)) #绑定本机的8080端口
listen():使用TCP的服务端开启监听模式。使用参数指定可以挂起的最大连接数量,最小为1,一般为5。例如:
s.listen(5)
accept():在使用TCP的服务端接收连接,一般是阻塞态。接收TCP连接并返(conn,address),conn是新的套接字对象,可用来接收和发送数据;address连接客户端地址。
2.2 客户端函数:
conncet():在使用TCP的客户端去连接服务器地址。使用参数是一个元组,形式为(host,port)。例如:s.connect(("127.0.0.1",8080)) #连接本地的8080端口
2.3 客户端和服务器都可以使用的函数:
send():使用TCP时发送数据。形式为send(string[,flag]),返回值是发送字节的数量。但可能未将指定的内容全部发送。 sendall():与send()类似,形式为sendall(string[,flag])。与send()的区别是完整发送TCP数据。将string中的数据发送到连接的套接字,但返回之前会尝试发送所有数据。成功返回None,失败则抛出异常。例如:s.sendall(bytes(" Hello python ! "),encoding = "utf-8")
recv():使用TCP时接收数据。完整形式为recv(bufsize[,flag]),接收Socket的数据。数据以字符串形式返回,bufsize指定最多接收的数量,flag参数一般不使用。例如:
odj.recv(1024) #接收一段长度为1024的字符Socket
sendto():使用UDP时发送数据,完整形式为sendto(string[,flag],address),返回值是发送的字节数。其中,address是形式为(ipaddr , port)的元组,指定远程地址。
recvfrom():UDP专用,接收数据,返回数据远端的IP地址和接口,但返回值是(data , address)。其中,data是包含接收数据的字符串,address是发送数据的套接字地址。
close():关闭socket。
使用Socket编写一个简单的服务端和客户端
服务端程序:
import socket
s2 =socket.socket() #初始化一个TCP类型的socket
s2.bind(("127.0.0.1",8080)) #绑定到本地8080端口
s2.listen(5) #使用TCP的服务端开启监听模式
while 1:
conn,address = s2.accept() #接收TCP连接并返回(conn,address),conn是新的套接字,用来接收和发送数据;address连接客户端地址
print ("a new connect from " + str(address))
conn.sendall("Hello world") #发送数据
conn.close()
客户端程序:
import socket #导入socket库
s1 = socket.socket() #初始化一个TCP类型的socket
s1.connect(("127.0.0.1",8080)) #连接目标127.0.0.1的8080端口(测试使用本机地址),使用参数是一个元组,形式为(host,port)
data = s1.recv(1024) #连接成功,发送数据
s1.close() #关闭连接
print('Received ' + repr(data)) #输出服务器发送的数据