网络编程
Python提供了两个级别访问的网络服务:
低级别的网络服务支持基本的Socket,它提供了标准的BSD Sockets API,可以访问底层操作系统Socket接口的全部方法。
高级别的网络服务模块SocketServer,它提供了服务器中心类,可以简化网络服务器的开发。
1,Scoket又称‘套接字’,应用程序通常通过‘套接字’向网络发出请求或者答应网络请求,使主机间或者一台计算机上的进程间可以通讯。
2,python用socket()函数来创建套接字,语法格式如:socket.socket([family[, type[, proto]]])
参数:
family: 套接字家族可以使用AF_UNIX 或者 AF_INET
type: 套接字类型可以根据面向连接的还是非连接分为SOCK_STREAM或SOCK_DGRAM
protocol:一般不填默认为0
3,例子
服务端代码
import socket import threading #服务器端 TCP面向连接 servessoket=socket.socket(socket.AF_INET,socket.SOCK_STREAM) servessoket.bind(('172.16.0.114',9999))#绑定服务地址和端口号 servessoket.listen(5)#监听,最多可连接5个客户端 print('正在等待客户端。。。') c=servessoket.accept()#等待接收客户端,c是元组表示得到客户端的地址和端口 print(c) def myrerv(c): while True: msg=c[0].recv(1024)#接收消息、 print(msg.decode())#decode解码 threading._start_new_thread(myrerv,(c,)) def myinput():#发送消息 while True: msg=input() c[0].send(msg.encode())#encode编码 threading._start_new_thread(myinput())
客户端代码
import socket import threading client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect(('172.16.0.113',9999)) print('客户端已连接。。。') def myrerv(c): while True: msg=c.recv(1024)#接收消息 print(msg.decode()) threading._start_new_thread(myrerv,(client,)) def myinput(): while True: msg =input() client.send(msg.encode()) threading._start_new_thread(myinput())4,函数a,s.recv()接收TCP数据,数据以字符串形式返回,bufsize指定要接收的最大数据量。flag提供有关消息的其它信息,通常可以忽略。
b, s.send()发送TCP数据,将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小
c, s.sendall()完整发送TCP数据,完整发送UDP数据。将string中的数据完整发送到连接的套接字,但在返回之前会尝试发送所有数据。成功返回None,失败则抛出异常d,s.connect()主动初始化TCP服务器连接,一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误
e, s.listen()开始TCP监听。backlog指定在拒绝之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设为5就可以了。
f, s.bind()绑定地址(host,port)到套接字,在AF_INET以下,以元组(host,port)的形式表示地址