项目源码地址:https://github.com/zxf20180725/pygame-jxzj,求赞求星星~
工作太忙啦,没啥时间更新博客,大家有什么疑问,欢迎加q群讨论,刚创的:812095339
快两个月没更新啦。这段时间因为换工作,一直很忙没时间写文章。现在工作稳定啦,继续继续~
1.什么是网络编程
在之前的文章中,我们都是写的单机程序。从本章开始,我们将正式进入到网络编程部分啦。在我们的教程里,并不会去深入讲解网络编程,因为这个水实在太深了。我们这只讲最简单的,能实现我们的功能即可。
想必大家都听过客户端和服务端这两个词吧。像我们电脑里装的软件几乎都是客户端,比如QQ、微信、英雄联盟等等。而服务端就是为客户端提供数据和服务的。
好了,废话不多说,先来写一个helloworld,直接在代码里感受吧。
2.服务端
新建一个server.py:
import socket
# 创建socket对象,使用TCP协议
server = socket.socket()
# 绑定本机ip和端口号
server.bind(('127.0.0.1', 8712))
# 开始监听
server.listen(5)
# 接收客户端(阻塞线程),client也是socket对象
client, address = server.accept()
print('有客户端连接啦!', address)
# 发送消息给客户端
client.send(b'I am server.HelloWorld')
# 接收客户端返回的消息(阻塞线程)
data = client.recv(1024) # 返回的数据类型是bytes
# 由于是字节数组类型,所以需要解码成字符串
str_data = data.decode()
print(str_data)
client.close()
server.close()
第4行,创建一个socket对象,socket.socket()没用任何参数,默认是使用TCP协议的。什么是socket呢,百度百科里的解释比较详细,我就简单说一下,socket就是一套对tcp/ip协议族的封装,就是一套api。不理解没关系,并不影响我们目前的开发。
第13行,server.accept()是会阻塞线程的,通俗点讲,就是代码会卡在这一句,不继续往下执行。当有客户端连进来的时候才会继续执行下面的代码。这个语句会返回一个socket对象和客户端的地址。
第18行,给客户端发送消息,send的参数必须是bytes类型,所以我在字符串前面加了个b,也可以这样写:client.send('I am server.HelloWorld'.encode())
第21行,接收客户端消息,这里也会阻塞线程,如果客户端一直没回复消息的话,代码会一直卡在这里,不会继续向下执行。1024是一次性能接收的数据大小,最多接收1024字节,也就是1kb,如果客户端一次发过来的数据大于1kb的话,那得多次调用recv能完整接收客户端数据。
第24行,由于recv的返回值是bytes类型,咱们得用decode解码,转换成字符串。
3.客户端
新建一个client.py:
import socket
# 创建socket对象
client = socket.socket()
# 连接服务端
client.connect(('127.0.0.1', 8712))
# 接收服务端发送过来的数据
data = client.recv(1024)
str_data = data.decode()
print(str_data)
client.send(b'I am client.Hello!')
client.close()
客户端就相对简单啦
4.运行效果
先运行server.py,再运行client.py
服务端截图:
客户端截图: