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 
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 
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()

你可能感兴趣的:(Python网络编程基础 ❶ 计算机网络基础 初用socket模块)