Python网络编程基础 ❶ 计算机网络基础 初用socket模块
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: 5978 源端口号 Destination Port: 8080 目的地端口号 Dequence Number: 146389907 序列号 Ack Numbers: 124205646 确认应答号 Offset: 5 头长度 Reserved: %000000 保留 总是被设置为零 Code: %011000 代码位 Ack is valid Push Request Window: 61320 窗口 Checksum: Ox61a6 校验和 Urgent Pointer: 0 紧急 No TCP Options 选项 TCP Data Area: 数据 vL.5.+.5.+ 5.+.5 76 4c 19 35 11 2b 19 35 11 2b 19 35 11 2b 19 35 +. 11 2b 19 Frame Check Sequence:Ox0d0000f
UDP 用户数据报协议
面向过程的,不需要确定是否收到的
OSI参考模型 是7层
编程关心的:5层模型
应用层
传输层 TCP UDP 四层交换机、四层路由器
网络层 IP 路由器、三层交换机
链路层 MAC arp rarp 网卡、交换机
物理层 电信号 网线、集线器、中继器
2、socket模块
1)基本使用
服务器端:
1 import socket 2 3 # 服务器端 流程 4 5 sk = socket.socket() # 类似买手机和手机卡 6 7 sk.bind(('127.0.0.1', 8080)) # 将手机卡绑定到手机上 8 9 sk.listen() # 听着手机是否有电话打来 10 11 conn, addr = sk.accept() # 接到电话,查看来电显示知道对方的地址 12 13 act = conn.recv(1024) # 接听电话 14 ''' 15 File "D:/python_bases/day30/server.py", line 13, in <module> 16 act = sk.recv(1024) # 接听电话 17 OSError: [WinError 10057] 由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址, 18 发送或接收数据的请求没有被接受。 19 ''' 20 print(act) 21 22 conn.send(b'hello python socket client! I have recv your msg!') # 打电话 23 24 conn.close() # 挂电话 25 26 sk.close() # 关手机 27 ''' 28 File "D:/python_bases/day30/server.py", line 26, in <module> 29 socket.close() # 关手机 30 AttributeError: module 'socket' has no attribute 'close'
客户端:
1 import socket 2 3 # 客户端 流程 4 5 sk = socket.socket() # 类似买手机 6 7 sk.connect(('127.0.0.1', 8080)) # 输入电话号码 8 9 sk.send(b'Hello Python Socket Server!') # 发送消息 10 11 act = sk.recv(1024) # 接收消息 12 print(act) 13 14 sk.close() # 关闭手机
2)进阶使用
服务器端:
1 import socket 2 3 sk = socket.socket() 4 sk.bind(('127.0.0.1', 8080)) 5 sk.listen() 6 conn, addr = sk.accept() 7 8 while 1: 9 rec = conn.recv(1024).decode(encoding='utf-8') 10 if rec == 'bye': 11 conn.send(b'bye') 12 break 13 print(rec) 14 ipt = input('>>>>>>>>').strip() 15 conn.send(bytes(ipt, encoding='utf-8')) 16 17 conn.close() 18 sk.close()
客户端:
1 import socket, time 2 3 sk = socket.socket() 4 sk.connect(('127.0.0.1', 8080)) 5 6 this_sec = time.time() 7 tm = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(this_sec)) 8 time.sleep(0.2) 9 rec = sk.send(bytes(tm, encoding='utf-8')) 10 11 while 1: 12 rec = sk.recv(1024).decode(encoding='utf-8') 13 if rec == 'bye': 14 sk.send(b'bye') 15 break 16 print(rec) 17 ipt = input('>>>>>>>>').strip() 18 sk.send(bytes(ipt, encoding='utf-8')) 19 20 sk.close()

浙公网安备 33010602011771号