基于网络类型的套接字家族
套接字家族的名字:AF_INET
(还有AF_INET6被用于ipv6,所有地址家族中,AF_INET是使用最广泛的一个,python支持很多种地址家族,但是由于我们只关心网络编程,所以大部分时候我么只使用AF_INET)
基于TCP的套接字工作过程
客户端
socket() —— 实例化套接字对象
客户端往外发数据就得调传输层而传输层用的是TCP协议就得先建立连接
应用层以下又都归套接字管,所以用套接字下得connect()建立连接
建立连接发生三件事:三次握手
send()——打包数据后发送给服务端
扫描二维码关注公众号,回复:
10999038 查看本文章
close()——关闭连接
服务端
socket() —— 实例化套接字对象
bind()—— 绑定IP和端口
listen—— 监听连接请求
accept()—— 从半连接池中取出请求后开始回包 ps : 和connact一起做了三次握手
close()——关闭连接
基于TCP协议
服务端
import socket
# 1.买手机
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #流式协议=》TCP协议
# 2.绑定手机
phone.bind(('127.0.0.1',8080))
# 3.开机
phone.listen(5) # 半连接池得大小
print('服务端启动完成,监听地址为:%s%s' %('127.0.0.1',8080)) #127.0.0.1 本地回环地址
# 4.等待电话连接请求
# 加上链接循环
while True:
conn,client_addr=phone.accept()
print('客户端的ip和端口:',client_addr)
# 5.通信收、发消息
while True:
try:
data=conn.recv(1024) # 最大接收得数据量为1024Bytes,收到得是bytes类型
if len(data)==0:break
print('客户端发来的消息:',data.decode('utf-8'))
conn.send(data.upper())
except Exception:
break
# 6.关闭电话连接conn
conn.close()
客户端
import socket
phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
phone.connect(('127.0.0.1',8080))
import time
time.sleep(5)
while True:
msg = input('请输入======>').strip()
if len(msg) == 0: continue
phone.send(msg.encode('utf-8'))
data=phone.recv(1024)
print(data.decode('utf-8'))
phone.close()
基于UDP协议
服务端
import socket
server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #流式协议=》TCP协议
server.bind(('127.0.0.1',8080))
while True:
data,client_addr=server.recvfrom(1024)
print(data.upper(),client_addr)
server.close()
客户端
import socket
client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
while True:
msg = input('请输入======>').strip()
client.sendto(msg.encode('utf-8'),('127.0.0.1',8080))
data,server_addr=client.recvfrom(1024)
print(data.decode('utf-8'))
client.close()