python socket知识点
---恢复内容开始---
数据在网络上进行传播,需要通过一种通信协议。常见的通信协议有:HTTP,SMTP,DNS,FTP,SSH,SNMP,ICMP PING,DNCP.
OSI(Open System Interconnect)七层协议:(
在python中如何实现数据的传播呢?答案就是socket,Python将TCP/IP和UDP一起封装在了socket中。
在socekt实例中有两个很重要的参数 1 地址簇 2 协议类型。这两个参数将直接影响到通信的建立。
FAMILY ADDRESS
AF.INET ==> IPv4,
AF.INET6 ==> IPv6
AF.UNIX ==> local (不常用)
PROTOCOL TYPE
SOCK_STREAM ==> TCP/IP协议
SOCK_DGRAM ==> UDP
默认的实例建立为AF.INET,sock.SOCK_STREAM
首先建立两个端:服务器端(server)和客户端(client)。
先来看两个最简单的例子:
客户端:
#客户端 import socket#引入socket方法 client = socket.socket()#声明socket的类型,同时生成socket的连接对象 client.connect(('localhost',6969))#连接的端口号和端口名 client.send(b"Im client")#需要发送的数据 data = client.recv(1024)#默认最大接收的字节数 print('recv:',data)#打印接收到的数据 client.close()#关闭客户端
服务器端:
import socket server = socket.socket() server.bind(('localhost',6969))#绑定需要监听的端口 server.listen()#开始监听,括号内可设置最大的可监听数量 print('Im starting listening') conn,addr = server.accept()#等活动开始,accept 将返回两个值,分别送到conn和addr中,conn就是客户端对应在服务器端的连接实例 print("listened") data = conn.recv(1024)#赋值变量储存接接收客户端的数据,最大为1024byte print('recv:',data) conn.send(data.upper())#将从客户端收来的数据大写 server.close()
那么现在实现了一对一的单次交互,如果想实现一对一的多次交互呢?
使用while True循环:
客户端:
while True: msg = input('>>:'.strip()) client.send(msg.encode('utf-8'))#需要发送的数据 data = client.recv(1024)#默认最大接收的字节数 print('recv:',data)#打印接收到的数据
服务器端:
while True: print("listened") data = conn.recv(1024) print('recv:',data) conn.send(data.upper())
由以上可以看出不管是客户端还是服务器端均是将循环建立在已经确立连接端口之后,即不会重新建立新连接,使用同一端口进行循环通信,这是一对一同一对象进行循环交互的方法。
如果想要实现两个甚至多个客户端与服务器端进行交互怎么办呢?类似打电话,现在已经建立了连接,当有第二个客户打入的时候会提示说占线请等待。那么在python中应该如何实现呢?
同样也是while循环。
while True: conn,addr = server.accept()#等活动开始,conn就是客户端对应在服务器端的连接实例
此次循环加在接收端口号和地址的前面,表示每被客户端挂断一次便进行一次循环再次与第二个客户端建立通信,达到与多个客户端通信的需求。