网络基础 + 简单的 客户端和服务端 交互相关程序
1. 为什么会有网络基础?
两个python文件 a.py 和 b.py 分别运行会运行的很好,两个程序之间想要传递数据,要如何做?
a. 我们可以创建一个文件,把a.py想要传递的内容写到文件中,然后b.py从这个文件中读取内容就可以了。

b. 但是当你的a.py和b.py分别在不同电脑上的时候,你要怎么办呢?
类似的机制有计算机网盘,qq等等。我们可以在我们的电脑上和别人聊天,可以在自己的电脑上向网盘中上传、下载内容。这些都是两个程序在通信。这样就涉及到了网络基础。
软件架构
1. C/S 架构
C/S即:Client与Server ,中文意思:客户端与服务器端架构,这种架构也是从用户层面(也可以是物理层面)来划分的。
这里的客户端一般泛指客户端应用程序EXE,程序需要先安装后,才能运行在用户的电脑上,对用户的电脑操作系统环境依赖较大。

2. B/S 架构
B/S即:Browser与Server,中文意思:浏览器端与服务器端架构,这种架构是从用户层面来划分的。
Browser浏览器,其实也是一种Client客户端,只是这个客户端不需要大家去安装什么应用程序,只需在浏览器上通过HTTP请求服务器端相关的资源(网页资源),客户端Browser浏览器就能进行增删改查。

如何实现相互的通信
1. 编写两个软件,软件之间相互通信?
通过程序,写入文件中,从文件中进行读取。
2. 两台电脑之间相互通信?(网线)
两台电脑之间可以通过网线传输。
3. 教室之间相互通信? (交换机)
使用 IP 地址:ipconfig / ifconfig 在 cmd 命令行执行此命令获取电脑的 IP 地址。
同一个教室中: (张三和李四知道对方ip地址后可以进行连接,或发送消息)
张三: 192.168.13.155
李四: 192.168.13.25
海南的好友:(张三不能和小明连接,因为两人不在一个网内,如果想要进行连接,需要租公网IP)
小明: 192.168.13.43
4. 想要和海南的好友通信,
需要 交换机 + n*路由器
总结:
1. 相互通信本质发送 二进制 (00101010)
2. 交换机的作用
3. 通过 ipconfig 查看自己的内网IP
4. 公网 IP,需要花钱
基于 socket 模块 实现简单的网络通信
1. 为什么要网络通信发送的是字节,而不是字符串?
python3:send / recv 都是字节
python2: send / recv 都是字符串
2. socket 实现网络通信的时候,什么时候会出现阻塞?
服务端:
accept,阻塞:等待客户端来连接
recv,阻塞:等待客户端发来数据
客户端:
connect,阻塞:一直在连接,直到连接成功,才会往下运行。
recv,阻塞:等待服务端发来数据。
示例 1: 简单是实现服务和客户端的交互,(仅一次交互,对socket解释较详细)
# 服务端.py import socket # 创建服务端socket对象 server = socket.socket() # 绑定IP和端口 server.bind(('192.168.13.155',8000)) # 后边可以等5个人 server.listen(5) print('服务端准备开始接收客户端的连接') # 等待客户端来连接,如果没人来就傻傻的等待。 # conn是客户端和服务端连接的对象(伞),服务端以后要通过该对象进行收发数据。 # addr是客户端的地址信息。 # #### 阻塞,只有有客户端进行连接,则获取客户端连接然后开始进行通信。 conn,addr = server.accept() print('已经有人连接上了,客户端信息:',conn,addr) # 通过对象去获取(王晓东通过伞给我发送的消息) # 1024表示:服务端通过(伞)获取数据时,一次性最多拿1024字节。 data = conn.recv(1024) print('已经有人发来消息了',data) # 服务端通过连接对象(伞)给客户端回复了一个消息。 conn.send(b'stop') # 与客户端断开连接(放开那把伞) conn.close() # 关闭服务端的服务 server.close()
import socket client = socket.socket() # 创建自己的一个对象 # 向服务端发起连接请求(递伞) # 阻塞,去连接,直到连接成功后才会继续向下走。 client.connect(('192.168.13.155',8000)) # # 链接上服务端后,向服务端发送消息 client.send(b'hello') # 等待服务端给他发送消息 data = client.recv(1024) print(data) # 关闭自己 client.close()
示例 2:服务端和客户端进行交互,(可多次交互)
# 服务端.py
import socket server = socket.socket() # 创建服务端socket对象 server.bind(('192.168.13.155',8001)) #绑定服务器ip地址和端口 server.listen(5) # 设置等待连接人数为5 while True: conn,addr = server.accept() #阻塞,等待客户端连接,返回conn是客户端与服务端连接的对象,addr是客户端的地址信息 # 字节类型 while True: data = conn.recv(1024) # 阻塞,通过conn对象获取客户端发送的消息,接收到的消息是二进制 print(data.decode('utf-8')) if data == b'exit': break response = data + b' SB' conn.send(response) # 发送给客户端 conn.close() # 关闭与客户端的连接
# 客户端.py import socket sk = socket.socket() #创建客户端socket对象 sk.connect(('192.168.13.126',8001)) # 与服务端进行连接 while True: name = input("请输入内容:") sk.send(name.encode('utf-8')) # 字节 # 向客户端发送消息 if name == 'exit': break response = sk.recv(1024) # 字节 #接收客户端返回的消息 print(response.decode('utf-8')) #字节转化为utf-8 sk.close() # 关闭客户端

浙公网安备 33010602011771号