网络基础 + 简单的 客户端和服务端 交互相关程序

 

 

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()
服务端.py 
import socket

client = socket.socket() # 创建自己的一个对象

# 向服务端发起连接请求(递伞)
# 阻塞,去连接,直到连接成功后才会继续向下走。
client.connect(('192.168.13.155',8000))

# # 链接上服务端后,向服务端发送消息
client.send(b'hello')

# 等待服务端给他发送消息
data = client.recv(1024)
print(data)

# 关闭自己
client.close()
客户端.py

 示例 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()  # 关闭客户端

 

posted @ 2018-09-03 16:21  葡萄想柠檬  Views(423)  Comments(0)    收藏  举报
目录代码