今日主要内容:
初识网络编程基本知识
实战
一,基本知识
# python基础
# 网络编程 _ 概念 4天
# 什么是网络 网络的基础概念 *****
# 由于不同机器上的程序要通信,才产生了网络
# socket
# TCP
# UDP
# 并发编程 _ 概念
# 一天
# 两个程序之间的通信可以分为两种:
# qq 微信 飞秋 网游 微博 歪歪 _基于应用的网络程序 应用类
# 百度 微博 知乎 博客园 网易 _基于浏览器的网络程序 Web类
# 网络编程中的 - C/S架构
# c client 客户端
# s server 服务端
# 客户端 是 我用的时候 我才使用服务
# 服务端 是 要一直运行 等待服务别人
# 网络编程中的 - B/S架构
# b broser 浏览器
# s server 服务端
# 不需要额外的安装客户端了,只需要一个网址就可以访问
# 轻量级 - 使用成本低
# 为什么wechat很火?
# 很成功的一点就是引入小程序。一种手机端的 B/S 架构
# 两种架构之间的关系:
# B/S架构是C/S架构的一种特殊形式
# 手机上 : 浏览器 app
'''
想要实现通信
网卡 and 网线
网卡上有全球唯一的mac地址
'''
# 两个py程序想要通信
# 写文件
# 在不同机器上的两个py程序之间想要通信
# 网络
# 网络的发展史
# 网卡\网口
# 两台机器之间 插上网线就可以通信
# 网卡上 - mac地址
# ip地址
# 是4个点分十进制 - ipv4协议
# 0.0.0.0 - 255.255.255.255
# 127.0.0.1 本机
# 内网字段 192.168.****
# 10.****
# 172.***
# 6个点分十进制 - ipv6协议(现在正在推广...)
# 0.0.0.0.0.0 - 255.255.255.255.255.255
# 交换机
# 广播
# 单播
# 组播
# arp协议 : 通过IP地址获取某一台机器的mac地址
# 子网掩码
# 子网掩码 和 ip地址进行 按位 与 运算 就能得出一个机器所在的网段
# 192.168.21.36
# 11000000.10101000.00010101.00100100
# 255.255.255.0 255.255.0.0
# 11111111.11111111.11111111.00000000
# 11000000.10101000.00010101.00000000
# 192.168.21.0 网段
# 网关地址 : 整个局域网中的机器能沟通过网关ip与外界通信
# 网段 : 子网掩码 和 ip地址进行 按位 与 运算
# 端口 : 0-65535
# 在计算机上,每一个需要网络通信的程序 都会开一个端口
# 在同一时间只会有一个程序占用一个端口
# 不可能在同一时间有两个程序 占用同一个端口
# IP + 端口 可以
# 8000-酷狗音乐 22-ssh 3306-mysql
# python 网络应用 8000
# ip地址+端口号 : 在全网找到唯一的一台机器+唯一的应用
# 我们选择端口 : 8000之后
# tcp协议
# 全双工的通信协议
# 一旦连接建立起来,那么连接两端的机器能够随意互相通信
# 面向连接的通信方式
# 数据安全不容易丢失
# 建立连接的 三次握手 ******
# 断开连接的 四次挥手 ******
二,实战
服务端:
'''
server.py
'''
import socket
sk = socket.socket() # 买手机
# 避免服务重启的时候避免:address already in use
sk.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# sk.bind(('ip', 'port'))
sk.bind(('127.0.0.1', 8080)) # 绑定手机卡
sk.listen() # 监听,等着有人给我打电话
conn, addr = sk.accept()
print(addr)
while True:
# ret = conn.recv(1024) # 听别人说话
# print(ret)
# conn.send(b'hi') # 和别人说话,必须传输一个bytes类型
# ret = conn.recv(1024)
# print(ret.decode('utf-8'))
# conn.send(bytes('牛肉拉面加个蛋!'.encode('utf-8')))
ret = conn.recv(1024).decode('utf-8')
if ret == 'bye':
break
print('收到新消息', ret)
info = input('服务端输入:')
conn.send(bytes(info, encoding='utf-8'))
conn.close() # 挂电话
sk.close() # 关手机
客户端:
'''
client.py
'''
import socket
sk = socket.socket() # 买手机
sk.connect(('127.0.0.1', 8080)) # 拨打别人的号码
while True:
# sk.send(b'hello')
# ret = sk.recv(1024)
# print(ret)
# sk.send(bytes('我们中午吃什么?', encoding='utf-8'))
# ret = sk.recv(1024)
# print(ret.decode('utf-8'))
info = input('客服端输入:')
sk.send(bytes(info, encoding='utf-8'))
ret = sk.recv(1024).decode('utf-8')
print('收到新消息:', ret)
if ret == 'bye':
sk.send(bytes('bye', encoding='utf-8'))
break
sk.close()