IP地址
联网设备(电脑)每次介入网络,都会按照网络的规则,分配身份证号码,每个IP地址对应一个设备。
每次进入网络IP地址未必相同。
查看电脑IP地址windows :ipconfig
IP地址就是IP协议提供和的一种统一的地址格式,为互联网上每一个主机和每一个网络分配的逻辑地址
每个IP地址包括两个识别码(ID)就是网络id以及主机id
IP地址 = 网络id + 主机id
A类地址:8位网络id(0开头)+24位主机id,范围:1.0.0.0 - 126.255.255.255
B类地址:16位网络号(10开头)+16位主机号,范围:128.0.0.0 - 191.255.255.255
C类地址:24位网络号(110开头)+8位主机/号,范围:192.0.0.0 - 223.255.255.255
..........
端口号
每台电脑里的应用程序和其他设备互联,需要一个端口号。端口号对应应用程序,就像ip对应设备。
就像微信联系,光知道网络中的ip地址确定了设备还不行,还要安排一个端口号给微信。
用来区别应用。
- 一共65536个端口号
- 0-1023 是知名端口号,众所周知的应用,比如80给http服务。
- 1024-65536 是动态端口号 ,由系统随机分配
TCP协议
数据传输需要准守一个协议,就是TCP协议。此协议可以保证数据的安全传输。
socket
在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。
通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。
看不懂,管他的,反正数据传输需要他。
网络编程流程
服务端基础流程
import socket
# 1.创建socket对象,就像是买手机
soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 参数默认如此可以不填,
# 前者是IP4(网络地址类型),后边是流式套接字(套接字的类型)
# 2.绑定IP和端口 ,注册微信
soc.bind(('192.168.0.108', 8080)) # 参数必须是元组,而且IP数据是字符串,端口是数字
# IP可以不指定,表示本机IP
# 3.设置监听模式,设定连接数
soc.listen(5)
# 4.接受连接 ,
'''
accept返回值一个是 连接 客户端的套接字对象
一个是 连接 客户端的地址
也就是服务端套接字创建了新的套接字和客户端专门连接
'''
client_soc,client_ip = soc.accept()
# print(client_soc) # <socket.socket fd=312, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('192.168.0.108', 8080), raddr=('192.168.0.108', 58986)>
# print('客户端的IP和端口号为:',client_ip) # ('192.168.0.108', 58986) 端口号是系统分配的,因为没有指定端口号
# print(soc) # <socket.socket fd=308, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('192.168.0.108', 8080)>
# 5.接受消息
data = client_soc.recv(1024) # 最大可接受1024字节,
data_decoded = data.decode(encoding='utf-8') # 解码消息
print(data_decoded) # 打印出已经解码的消息
# 6.发送消息
mes = '你好。这是服务端发送的消息。'
client_soc.send(mes.encode('utf-8')) # 发送数据,必须编码,而且必须要用客户端套接字发,
# 7.发完就可以结束了
client_soc.close() # 关闭客户端套接字
soc.close() # 关闭服务端的套接字
客户端基本流程
import socket
# 1.创建套接字,服务端说过了,参数科可以省略,所以就没填
client_soc = socket.socket()
# 2.连接服务器,需要服务器的IP和端口号
client_soc.connect(('192.168.0.108', 8080))
# 3.发送消息
client_soc.send('你好,我是客户端。'.encode('utf-8'))
# 4.接受消息
data = client_soc.recv(1024)
print(data.decode('utf-8'))
# 5.关闭套接字
client_soc.close()