一.网络编程概述
1.计算机网络
将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件级网络通信协议的管理和协调,实现资源共享和信息传递的计算机系统。
2.网络编程
用来实现网络互联的不同计算机上运行的程序可以进行数据交换。
二.网络模型
1.概述:计算机网络之间以何种规则进行通信
2.OSI (open Syste lnterconnection)开发系统互连参考模型
(1)应用层
电脑屏幕上看到的东西——产生数据
(2)表示层
数据处理,加密与解密,压缩与解压缩,编码
(3)会话层
通过传输层建立数据传输的通路,发起会话和接收会话,在传输的过程中维持会话
(4)传输层
数据连接与传输,用一个寻址机制标识一个特定的应用程序(端口)
(5)网络层
基于网络地址(IP 地址)进行不同网络系统间的路径选择
(6)数据连接层
数据进行 MAC 地址(网卡地址)封装与解封装,使用接收系统的硬件地址或物理地址来寻址,承上启下
(7)物理层
物理设备:光纤,同轴电缆,双绞线,网卡,中断器,集线器等
3.TCP/IP 参考模型
(1)应用层(是 OSI 的应用层,表示层,会话层合并)
终端设备:Telnet,FTP,SMTP,DNS,HTTP
http : 超文本传输协议,web 服务器之间传输数据的协议
ftp : 文件传输协议
smtp : 简单邮件传输协议
pop : 邮件协议
Telnet : 远程登录协议
DNS : 域名系统,域名与 IP 地址之间的转换—— ip地址的名字
(2)传输层
终端设备 :
TCP:
通过三次握手协议建立稳定连接(类似于打电话)
应用数据分割成最合适的数据块发送
链接可靠,不易出现乱序、丢失等现象
连接和检验等都需要花不少时间,效率因此会降低
UDP:
一次性发送所有数据,无需建立连接(类似于发短信)
服务器可以同时发送给多个客户机
没有检验,容易会出现信息丢失
消耗资源小,处理速度快
(3)网络层
终端设备:
IP :网络中计算机的唯一标识,计算机只能识别二进制的数据,所有我们的 IP 地址应该是一个二进制的数据( ipv4:长度为32位,分为四段,每段八位,以点隔开,十进制标识。 ipv6:长度是 ipv4的四倍,以16进制标识,分为八段,每段以冒号隔开)
1.IP 地址的组成由网络号段和主机号段构成
2.特殊地址:
127.0.0.1 回环地址,标识本机
0.0.0.0 任意地址
3.DOS 命令:
ipconfig 查看 ip 地址
ping IP 地址——测试本机与指定 ip 地址之间的通信是否有问题
(4)数据连接层(是 OSI 的数据连接层,物理层合并)
三.网络协议
双方都要遵守相同的协议,才能正确的交流信息
四.端口
软件的身份证,标识符。用于区别一台不同的软件,网络服务器。
五.创建套接字
1.首先导入 socket 模块
import socket
2.为这一属性命名
server = socket.socket
3.查看属性
(1) 表示属性
(2)表示套接字ID
(3)表示 ipv4(AF_INET6,则表示 ipv6)
(4)表示 TCP( DGRAM 表示 UDP)
(5)表示 protocol 协议,通常是 0 tcp/ip 协议簇
(6)表示绑定服务器的 IP 地址(但这个没有绑定)
六.网络编程
1.服务端
(1)导包
import socket
(2)创建socket套接字
server = socket.socket()
(3)绑定 IP 地址和端口
server.bind(('127.0.0.1',8989))
(4)设置最大监听数量
server.listen(10)
(5)创建连接通道,获取对等连接套接字
conn,addr = server.accept()
2.客户端
(1)导包
import socket
(2)创建 socket 套接字
client = socket.socket()
(3)连接服务端
client.connect(('127.0.0.1',8989))
(4)发送数据( 需要是二进制数据(字节数据))
client.send(b'hello')
(5)接收数据(1024表示字节,可随意设置但不要小于一个字母的字节)
client.recv(1024)
>>> import socket
>>> client = socket.socket()
>>> client.connect(('127.0.0.1',8989))
>>> client.send(b'hello')
5
>>> client.recv(1024)
b'ok'
3.阻塞
当客户端没有连接,或者发送数据的时候,服务端执行 accept 和 recv 都会产生阻塞
附(今日学习):
服务端:
import socket
server = socket.socket() # 得到服务端套接字
server.bind(('127.0.0.1',8989)) # 绑定IP和端口
server.listen(10) # 最大监听数
conn,addr = server.accept() # conn,对等连接套接字,addr 客户端信息
print(str(conn.recv(1024),encoding='utf8')) # 1024指的是最大接收字节数
conn.send(b'ok')
conn.close() # 断开对等连接套接字
server.close() #断开服务器
客户端:
import socket
client = socket.socket()
client.connect(('127.0.0.1',8989))
info = input('请输入你要发送的数据:')
client.send(bytes(info,encoding='utf8')) #bytes(info,encoding='utf8' 将字符串转为字节
print(client.recv(1024))
client.close() #端口客户端