Python网络编程基础 ❶ 计算机网络基础 初用socket模块
2024-10-20 06:25:28
1、计算机网络基础
C/S 客户端/服务器端
B/S 浏览器端/服务器端
mac地址,ip地址,子网掩码,与计算得到网段,端口号
每台计算机的网卡都有全球唯一的地址,在生产时已经写进去了。 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地址
将mac地址解析为ip地址,方便使用;RARP协议则是将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 8000-酷狗音乐 22-ssh 3306-mysql
python 网络应用 8000
ip地址+端口号 : 在全网找到唯一的一台机器+唯一的应用
我们选择端口 : 8000之后 ip地址分为几类:公有地址、私有地址(192.168.0.0 172.10.0.0)
ip地址是为了计算机的唯一标识,端口号是应用程序的标识,
ip + port就是网络上的唯一地址定位 tcp协议
TCP是全双工的、面向连接的,可靠的并且是精确控制的协议。 一旦连接建立起来,那么连接两端的机器能够随意互相通信
面向连接的通信方式
数据安全不容易丢失
建立连接的 三次握手 ******
断开连接的 四次挥手 ****** tcp的数据段格式:
TCP - Transport Control Protocol
Source Port: 源端口号
Destination Port: 目的地端口号
Dequence Number: 序列号
Ack Numbers: 确认应答号
Offset: 头长度
Reserved: % 保留 总是被设置为零
Code: % 代码位
Ack is valid
Push Request
Window: 窗口
Checksum: Ox61a6 校验和
Urgent Pointer: 紧急
No TCP Options 选项
TCP Data Area: 数据
vL..+..+ .+. 4c 2b 2b
2b +. 2b
Frame Check Sequence:Ox0d0000f
UDP 用户数据报协议
面向过程的,不需要确定是否收到的 OSI参考模型 是7层 编程关心的:5层模型
应用层
传输层 TCP UDP 四层交换机、四层路由器
网络层 IP 路由器、三层交换机
链路层 MAC arp rarp 网卡、交换机
物理层 电信号 网线、集线器、中继器
2、socket模块
1)基本使用
服务器端:
import socket # 服务器端 流程 sk = socket.socket() # 类似买手机和手机卡 sk.bind(('127.0.0.1', )) # 将手机卡绑定到手机上 sk.listen() # 听着手机是否有电话打来 conn, addr = sk.accept() # 接到电话,查看来电显示知道对方的地址 act = conn.recv() # 接听电话
'''
File "D:/python_bases/day30/server.py", line , in <module>
act = sk.recv() # 接听电话
OSError: [WinError ] 由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,
发送或接收数据的请求没有被接受。
'''
print(act) conn.send(b'hello python socket client! I have recv your msg!') # 打电话 conn.close() # 挂电话 sk.close() # 关手机
'''
File "D:/python_bases/day30/server.py", line , in <module>
socket.close() # 关手机
AttributeError: module 'socket' has no attribute 'close'
客户端:
import socket # 客户端 流程 sk = socket.socket() # 类似买手机 sk.connect(('127.0.0.1', )) # 输入电话号码 sk.send(b'Hello Python Socket Server!') # 发送消息 act = sk.recv() # 接收消息
print(act) sk.close() # 关闭手机
2)进阶使用
服务器端:
import socket sk = socket.socket()
sk.bind(('127.0.0.1', ))
sk.listen()
conn, addr = sk.accept() while :
rec = conn.recv().decode(encoding='utf-8')
if rec == 'bye':
conn.send(b'bye')
break
print(rec)
ipt = input('>>>>>>>>').strip()
conn.send(bytes(ipt, encoding='utf-8')) conn.close()
sk.close()
客户端:
import socket, time sk = socket.socket()
sk.connect(('127.0.0.1', 8080)) this_sec = time.time()
tm = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(this_sec))
time.sleep(0.2)
rec = sk.send(bytes(tm, encoding='utf-8')) while 1:
rec = sk.recv(1024).decode(encoding='utf-8')
if rec == 'bye':
sk.send(b'bye')
break
print(rec)
ipt = input('>>>>>>>>').strip()
sk.send(bytes(ipt, encoding='utf-8')) sk.close()
最新文章
- nginx 499 状态码优化
- 一款免费的js图表工具--morris
- Socket实现仿QQ聊天(可部署于广域网)附源码(2)-服务器搭建
- HIbernate的脏数据检测和延缓加载
- HealthKit开发教程之HealthKit的复合数据
- Linq实例
- 如何采集所有QQ群成员?
- 在Visual Studio 的 “一般处理程序 ” .ashx 文件中如何创建Session 对象
- 清理SQL多余登录信息
- Stack的三种含义(转载--阮一峰)
- 【.NET Core项目实战-统一认证平台】第十二章 授权篇-深入理解JWT生成及验证流程
- 动态加载机Servlet容器加载器
- 自学zabbix集锦
- 性能测试监控工具nmon详解和分析
- Java -- JDBC 学习--获取数据库链接
- hibernate和struts实现分页
- Android 编译参数 LOCAL_MODULE_TAGS
- MySQL联合多表更新和删除
- Mac设置Root密码
- Docker - CentOS 安装 Docker 和 Docker-Compose