Python数据分析与可视化:实战案例解析
130
2023-10-25
【摘要】 本书摘自《零基础Python 从入门到精通》一书中第16章,第3.2节,编者是壹零快学。
16.3.2 服务端
上一小节介绍了一个简单的连接百度客户端的案例,本小节将会介绍一个简单的服务端。和客户端相比,服务端要复杂不少。
创建一个TCP服务端和客户端一样,也需要先创建一个socket对象。
动手写16.3.6
创建socket对象的方法和客户端一模一样。
接下来服务端需要绑定监听的IP地址和端口。用户可以从网上查阅相关资料了解本机的IP地 址, 也可以使用“0.0.0.0”这个特殊地址来监听本机上的所有IP地址,亦可以使用“ 127.0.0.1”这 个特殊地址来监听。需要注意的是,监听“ 127.0.0.1”意味着这个服务端只能被本机上的客户端访 问,而不能被别的计算机访问。上一小节连接百度客户端使用的是80端口,服务端也需要监听相 同的端口号, 才能被正常连接上。为了不和已经开启的应用程序服务监听的端口号发生冲突, 这
里以2018端口号作为示例:
动手写16.3.7
如果端口被占用,系统会抛出OSError错误,并出现类似“OSError: [WinError 10048]通常每个 套接字地址(协议/网络地址/端口)只允许使用一次”的错误信息(不同操作系统信息可能不一样,但是含义一样)。碰到这种错误就需要更换2018端口号了。
绑定端口之后就可以使用“listen”监听端口了。这里假设服务端支持同时连入五个客户端。
动手写16.3.8
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(("0.0.0.0", 2018))
sock.listen(5)
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import socket
import threading
def echo_server(client: socket.socket, address: tuple):
print("欢迎来自{}:{}的新客户端".format(address [0], address [1]))
client.send("Welcome from {}:{}\r\n".format(address [0], address [1]) .encode("utf-8")) while True:
content = client.recv(1024)
if content == b"exit":
break
elif content:
print(content.decode("utf-8"))
else:
break
print("客户端退出了!")
client.close()
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(("0.0.0.0", 2018))
sock.listen(5)
print("Server start! Listening 0.0.0.0:2018")
while True:
client, address = sock.accept()
t = threading.Thread(target=echo_server, args=(client, address))
t.start()
由于这里需要同时处理五个连接,所以每次请求程序都需要创建线程来处理用户的连接。否则后续的连接只能等待前面的连接退出之后才能处理。
同样,我们可以写个简单的客户端来测试服务端工作是否如期望的一样运行。
动手写16.3.9
客户端执行完就会退出,但是服务端会一直运行,等待新的连接。
016.4 UDP编程
上一节介绍了TCP编程,TCP用于建立可靠连接, 消息接收后需要返回ACK确认消息(不需要我们手动编程返回消息,因为系统底层的TCP协议实现已经帮我们自动完成了这些操作)。
与TCP编程相比,UDP编程则是面向无连接的协议,发出的消息并不需要对方确认。TCP就好比打电话的过程,需要先拨通对方的电话,等待对方应答才能相互交流;UDP就好比发送信件,无论对方能否收到,我们都能发送数据,并且也不需要对方的应答。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们 18664393530@aliyun.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~