socketsocket
什么是socket?tcp
socket是应用层与TCP/IP协议族通讯的中间软件抽象层,它是一组接口,它把复杂的TCP/IP协议族隐藏在socket接口后面,对用户来讲,一组简单的接口就是所有。spa
为何使用socket?code
socket帮咱们把复杂的TCP/IP协议族封装好了,咱们只须要调用socket的接口。blog
怎么用?接口
基于tcp的套接字(socket):ip
服务端:服务端就至关于手机通讯过程utf-8
import socket #一、买手机 phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #tcp称为流式协议,udp称为数据报协议SOCK_DGRAM # print(phone) #二、插入/绑定手机卡 # phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) phone.bind(('127.0.0.1',8080)) #三、开机 phone.listen(5) # 半链接池,限制的是请求数 #四、等待电话链接 print('start....') conn,client_addr=phone.accept() #(三次握手创建的双向链接,(客户端的ip,端口)) # print(conn) print(client_addr) #五、通讯:收\发消息 data=conn.recv(1024) #最大接收的字节数 print('来自客户端的数据',data) conn.send(data.upper()) # import time # time.sleep(500) #六、挂掉电话链接 conn.close() #七、关机 phone.close()
客户端:客户端至关于找电话亭给他人打电话过程input
import socket #一、找电话亭 phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) print(phone) #二、拨电话 phone.connect(('127.0.0.1',8080)) # 指定服务端ip和端口 #三、通讯:发\收消息 phone.send('hello'.encode('utf-8')) # phone.send(bytes('hello',encoding='utf-8')) data=phone.recv(1024) print(data) # import time # time.sleep(500) #四、挂机 phone.close()
为服务端与客户端加上链接循环与通讯循环io
服务端:
import socket #一、买手机 phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #tcp称为流式协议,udp称为数据报协议SOCK_DGRAM #二、插入/绑定手机卡 # phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # 防止地址仍被占用时报错 phone.bind(('127.0.0.1',8080)) #三、开机 phone.listen(5) # 半链接池,限制的是请求数 #四、等待电话链接 print('start....') while True: # 链接循环 conn,client_addr=phone.accept() #(三次握手创建的双向链接,(客户端的ip,端口)) # print(conn) print('已经有一个链接创建成功',client_addr) #五、通讯:收\发消息 while True: # 通讯循环 try: print('服务端正在收数据...') data=conn.recv(1024) #最大接收的字节数,没有数据会在原地一直等待收,即发送者发送的数据量必须>0bytes # print('===>') if len(data) == 0:break #在客户端单方面断开链接,服务端才会出现收空数据的状况 print('来自客户端的数据',data) conn.send(data.upper()) except ConnectionResetError: break #六、挂掉电话链接 conn.close()
客户端
#一、买手机 phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # print(phone) #二、拨电话 phone.connect(('127.0.0.1',8080)) # 指定服务端ip和端口 #三、通讯:发\收消息 while True: # 通讯循环 msg=input('>>: ').strip() #msg='' if len(msg) == 0:continue phone.send(msg.encode('utf-8')) # print('has send----->') data=phone.recv(1024) # print('has recv----->') print(data)