我们终将上岸,阳光万里
—— 24.11.13
一、Socket
socket(简称 套接字)是进程之间通信一个工具,好比现实生活中的插座,所有的家用电器要想工作都是基于插座进行。进程之间想要进行网络通信需要socket。
Socket负责进程之间的网络数据传输,好比数据的搬运工。
二、客户端和服务端
2个进程之间通过Socket进行相互通讯,就必须有服务端和客户端
什么是客户端和服务端
Socket服务端:被动等待其它进程的连接、可接受发来的消息、可以回复消息
Socket客户端:主动连接服务端、可以发送消息、可以接收回复
示意图
三、Socket服务端编程
导包
import socket
1.创建socket对象
# 创建Socket对象
socket_server = socket.socket()
2.绑定socker_server到指定IP和地址
socket对象.bind(指定IP,指定端口)
# 绑定Ip地址和端口 要将主机地址和端口号组成一个元组作为参数传入
socket_server.bind(("localhost",8080))
3.服务端开始监听端口
listen(端口)
# 监听端口 listen方法内接受一个整数传参数,表示接受的链接数量
socket_server.listen(1)
4.等待接收客户端连接,获得链接对象
accept方法是阻塞方法,如果没有连接,会卡在当前这一行不向下执行代码
accept返回的是一个二元元组,可以使用上述形式,用两个变量接收二元元组的2个元素
# 等待客户端链接 accept方法返回的是二元元组(链接对象,客户端地址信息) accept是阻塞方法
result = socket_server.accept()
conn = result[0] # 客户端和服务端的连接信息
address = result[1] # 客户端的地址信息
'''
也可以写为:
conn,address = socket_server.accept()
'''
5.客户端连接后,通过recv方法,接收客户端发送的消息
可以通过 while True 无限循环来持续和客户端进行数据交互
可以通过判定客户端发来的特殊标记,如exit,来退出无限循环
# 接收客户端信息 要是有客户端和服务端的本次连接对象
data = conn.recv(1024).decode("utf-8")
6.通过conn(客户端当次链接对象),调用send方法可以回复消息
conn.send(msg.encode("utf-8"))
7. conn(客户端当此连接对象)和socket_server对象调用close方法,关闭连接
# 关闭链按
conn.close()
socket_server.close()
8.下载网络调试助手
9.一次通话聊天
'''
演示socket服务端开发
'''
import socket
# 创建Socket对象
socket_server = socket.socket()
# 绑定Ip地址和端口 要将主机地址和端口号组成一个元组作为参数传入
socket_server.bind(("localhost",8080))
# 监听端口 listen方法内接受一个整数传参数,表示接受的链接数量
socket_server.listen(1)
# 等待客户端链接 accept方法返回的是二元元组(链接对象,客户端地址信息) accept是阻塞方法
result = socket_server.accept()
conn = result[0] # 客户端和服务端的连接信息
address = result[1] # 客户端的地址信息
'''
也可以写为:
conn,address = socket_server.accept()
'''
print(f"接受了客户端的连接,客户端的信息是{address}")
# 接收客户端信息 要是有客户端和服务端的本次连接对象
data = conn.recv(1024).decode("utf-8")
# recv接受的参数是缓冲区大小,一般给1024即可
# recv方法的返回值是一个字节数组也就是bytes对象,不是字符串,可以通过decode方法通过UTF-8编码,将字节数组转换为字符串对象
print(f"客户端发送的信息是:{data}")
# 发送回复消息
msg = input("请输入您要回复的信息:")
# encode可以将字符串编码转换为字节数组
conn.send(msg.encode("utf-8"))
# 关闭链按
conn.close()
socket_server.close()
10.循环通话
将建立链接后的对话部分放进循环中,循环条件为True,无限循环下去,直到服务端说了exit则断开连接,退出通话
'''
演示socket服务端开发
'''
import socket
# 创建Socket对象
socket_server = socket.socket()
# 绑定Ip地址和端口 要将主机地址和端口号组成一个元组作为参数传入
socket_server.bind(("localhost",8080))
# 监听端口 listen方法内接受一个整数传参数,表示接受的链接数量
socket_server.listen(1)
# 等待客户端链接 accept方法返回的是二元元组(链接对象,客户端地址信息) accept是阻塞方法
result = socket_server.accept()
conn = result[0] # 客户端和服务端的连接信息
address = result[1] # 客户端的地址信息
'''
也可以写为:
conn,address = socket_server.accept()
'''
print(f"接受了客户端的连接,客户端的信息是{address}")
while True:
# 接收客户端信息 要是有客户端和服务端的本次连接对象
data = conn.recv(1024).decode("utf-8")
# recv接受的参数是缓冲区大小,一般给1024即可
# recv方法的返回值是一个字节数组也就是bytes对象,不是字符串,可以通过decode方法通过UTF-8编码,将字节数组转换为字符串对象
print(f"客户端发送的信息是:{data}")
# 发送回复消息
msg = input("请输入您要回复的信息:")
# encode可以将字符串编码转换为字节数组
conn.send(msg.encode("utf-8"))
# 关闭链按
conn.close()
socket_server.close()
四、Socket客户端编程
导包
import socket
1.创建Socket对象
# 创建socket对象
socket_client = socket.socket()
2.连接到服务端
# 连接到服务器 参数传元组:主机名,端口号
socket_client.connect(("localhost",8080))
3.发送消息(字节数组)
# 发送消息
socket_client.send(msg.encode("UTF-8"))
4.接收返回消息
# 接收返回消息 1024:缓冲区大小 recv方法同样是阻塞的
recv_data = socket_client.recv(1024)
5.关闭链接
# 关闭链接
socket_client.close()
先开启服务端,再有客户端链接
客户端服务端综合演示
注:
1.客户端先发送才能接收
2.服务端先接收才能回复
3.客户端只有一个socket对象
4.服务端对每个客户端进行单独的连接对象conn
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » Python学习从0到1 day28 Python 高阶技巧 ⑥ Socket服务端开发
发表评论 取消回复