1.socket
套接字,本质上是一个模块,里面封装了一些网络通讯协议 是处于传输层和应用层之间的一个抽象层,实际在OSI中并不存在 也就是没有socket也能能够通讯 ,但是这样一来 我们必须完全按照OSI规定的各种协议来编码 这是一个重复,复杂的过程,为了提高开发效率,就出现了socket模块,专门帮我们封装了传输层以下的一堆协议 有socket模块之后 当我们需要编写网络通讯的程序时,就不需要在关心具体的协议细节,直接使用socket提供的功能接口即可
门面设计模式,隐藏复杂的内部细节,仅提供最简单的使用接口 本质就是封装
2.TCP通讯 网络通讯一定分为两端,服务器和客户端
import socket
server = socket.socket()
server.bind(("127.0.0.1",1688))
server.listen(1)
# back
while True:
# socket,addr一个元组 客户端的ip和port
client,addr = server.accept()
print("接到一个客人了!开始服务!")
# 循环收发数据
while True:
try:
data = client.recv(1024).decode("utf-8")
if not data:
break
print(data)
res = data[1:]
# client.send(res.encode("utf-8"))
except ConnectionResetError as e:
print("客户端了挂了!",e)
break
client.close()
#server.close()
客户端:
1.创建socket对象 client = socket.socket()
2.链接服务器 client.connect((ip,port))
3.收发数据 通常需要循环
send 发 只能发二进制数据
recv 收 收多少字节数
4.断开链接 client.close()
import socket
client = socket.socket()
try:
client.connect(("127.0.0.1",1688))
print("链接成功!")
while True:
msg = input(":")
if msg == "q": break
if not msg: continue
client.send(msg.encode("utf-8"))
data = client.recv(1024)
print(data.decode("utf-8"))
client.close()
except ConnectionRefusedError as e:
print("链接服务器失败了!",e)
except ConnectionResetError as e:
print("服务器挂了!", e)
client.close()
3.常见的异常
1.一方异常下线,另一方还要收发数据 :ConnectionResetError 在send recv的地方 加上try 客户端也需要异常处理
2.端口占用异常 重复运行服务器 之前的进程没有正确关闭 关闭和打开端口 都是操作系统负责 在一些极端情况下 可能应用程序已经正确接收并且通知了操作系统要关闭端口 但是操作系统 没及时处理
2.1 更换端口
2.2 查后台进程 杀掉它
2.3 重启服务器电脑