02-网络编程
1.IP地址
-
IP 地址的概念:IP 地址就是标识网络中设备的一个地址,好比现实生活中的家庭地址。
-
IP 地址的表现形式:IP 地址分为两类: IPv4 和 IPv6
- IPv4 是目前使用的ip地址
- IPv6 是未来使用的ip地址
- IPv4 是由点分十进制组成
- IPv6 是由冒号十六进制组成
-
IP 地址的作用:IP 地址的作用是标识网络中唯一的一台设备的,也就说通过IP地址能够找到网络中某台设备
-
查看 IP 地址
-
Linux 和 mac OS 使用 ifconfig 这个命令
-
Windows 使用 ipconfig 这个命令
-
192.168.88.8是设备在网络中的IP地址
-
127.0.0.1表示本机地址,提示:如果和自己的电脑通信就可以使用该地址。
-
127.0.0.1该地址对应的域名是localhost,域名是 ip 地址的别名,通过域名能解析出一个对应的ip地址。
-
-
-
检查网络是否正常:检查网络是否正常使用 ping 命令
- ping www.baidu.com 检查是否能上公网
- ping 当前局域网的ip地址 检查是否在同一个局域网内
- ping 127.0.0.1 检查本地网卡是否正常
2.端口
- 端口:端口是传输数据的通道,是数据传输必经之路。作用:给运行的应用程序提供传输数据的通道。
- 端口号:操作系统为了统一管理这么多端口,就对端口进行了编号,这就是端口号。作用:用来区分和管理不同端口的,通过端口号能找到唯一个的一个端口。
- 端口和端口号的关系:端口号可以标识唯一的一个端口。
- 端口号的分类
- 知名端口号:知名端口号是指众所周知的端口号,范围从0到1023。
- 这些端口号一般固定分配给一些服务,比如21端口分配给FTP(文件传输协议)服务,25端口分配给SMTP(简单邮件传输协议)服务,80端口分配给HTTP服务。
- 动态端口号:一般程序员开发应用程序使用端口号称为动态端口号, 范围是从1024到65535。
- 如果程序员开发的程序没有设置端口号,操作系统会在动态端口号这个范围内随机生成一个给开发的应用程序使用。
- 当运行一个程序默认会有一个端口号,当这个程序退出时,所占用的这个端口号就会被释放
- 知名端口号:知名端口号是指众所周知的端口号,范围从0到1023。
3.TCP与socke
3.1.TCP
-
网络应用程序之间的通信流程
-
通过 IP 地址能够找到对应的设备,然后再通过端口号找到对应的端口,再通过端口把数据传输给应用程序,这里要注意,数据不能随便发送,在发送之前还需要选择一个对应的传输协议,保证程序之间按照指定的传输规则进行数据的通信, 而这个传输协议就是我们今天学习的 TCP。
-
TCP 的概念:
- TCP 的英文全拼(Transmission Control Protocol)简称传输控制协议,它是一种面向连接的、可靠的、基于字节流的传输层通信协议。
-
TCP 通信步骤:
- 创建连接——传输数据——关闭连接
- **说明:**TCP 通信模型相当于生活中的’打电话‘,在通信开始之前,一定要先建立好连接,才能发送数据,通信结束要关闭连接。
-
TCP 的特点:
- 面向连接:通信双方必须先建立好连接才能进行数据的传输,数据传输完成后,双方必须断开此连接,以释放系统资源。
- 可靠传输:
- TCP 采用发送应答机制
- 超时重传
- 错误校验
- 流量控制和阻塞管理
-
TCP总结:
- TCP 是一个稳定、可靠的传输协议,常用于对数据进行准确无误的传输,比如: 文件下载,浏览器上网。
3.2 socket
-
socket 的概念:
- ocket (简称 套接字) 是进程之间通信一个工具,好比现实生活中的插座,所有的家用电器要想工作都是基于插座进行,进程之间想要进行网络通信需要基于这个 socket。
-
socket 的作用:
- 负责进程之间的网络数据传输,好比数据的搬运工。
-
socket小结:
- 进程之间网络数据的传输可以通过 socket 来完成, socket 就是进程间网络数据通信的工具。
4.TCP 网络应用程序开发流程
-
TCP 网络应用程序开发流程的介绍
- TCP 网络应用程序开发分为:
- TCP 客户端程序开发
- TCP 服务端程序开发
- TCP 网络应用程序开发分为:
-
说明:客户端程序是指运行在用户设备上的程序 服务端程序是指运行在服务器设备上的程序,专门为客户端提供数据服务。
-
TCP 客户端程序开发流程的介绍
- 步骤说明:
- 创建客户端套接字对象
- 和服务端套接字建立连接
- 发送数据
- 接收数据
- 关闭客户端套接字
- 步骤说明:
-
TCP 服务端程序开发流程的介绍
- 步骤说明:
- 创建服务端端套接字对象
- 绑定端口号
- 设置监听
- 等待接受客户端的连接请求
- 接收数据
- 发送数据
- 关闭套接字
- 步骤说明:
-
小结
- TCP 网络应用程序开发分为客户端程序开发和服务端程序开发。
- 主动发起建立连接请求的是客户端程序
- 等待接受连接请求的是服务端程序
5.TCP 客户端程序开发与TCP服务端程序开发
5.1.TCP 客户端程序开发
-
开发 TCP 客户端程序开发步骤回顾
-
创建客户端套接字对象
-
创建客户端 socket 对象:socket.socket(AddressFamily, Type)
-
参数说明:
- AddressFamily 表示IP地址类型, 分为IPv4(socket.AF_INET)和IPv6(socket.AF_INET6)
- Type 表示传输协议类型
-
# 导入网络开发工具 import socket # 1、创建socke对象 socket.AF_INET 指定ip地址为ipv4的形式 socket.SOCK_STREAM指定通讯方式为TCP协议 client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
-
-
和服务端套接字建立连接
-
socke对象.connect((host, port)) :表示和服务端套接字建立连接, host是服务器ip地址,port是应用程序的端口号
-
# 2、连接服务器 socke对象.connect(ip地址,端口) client.connect(('127.0.0.1', 8008))
-
-
发送数据
-
socke对象.send(data) 表示发送数据,data是二进制数据
-
**b’hello server’**可以直接按照bytes类型传递数据
-
# 3、发送数据 socke对象.send(字节型数据) # b'hello server'直接按照bytes类型传递数据 while True: data = input('客户端:') client.send(data.encode('gbk'))
-
-
接收数据
-
socke对象.recv(buffersize) :表示接收数据, buffersize是每次接收数据的长度
-
将bytes类型转为字符串 recv_data.decode()
-
# 将字符串转化为bytes data.encode(): while True: data = input('客户端:') client.send(data.encode('gbk')) # 4、接受服务端返回数据 socke对象.recv(1024)需要指定接受数据的大小 # 将bytes类型转为字符串 recv_data.decode() recv_data = client.recv(5) str_data = recv_data.decode('gbk')
-
-
关闭客户端套接字
-
socke对象.close()
-
# 5、关闭客户端 client.close()
-
-
# 导入网络开发工具
import socket
# 1、创建socke对象 socket.AF_INET 指定ip地址为ipv4的形式 socket.SOCK_STREAM指定通讯方式为TCP协议
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print('微型QQ服务端启动(一人一句版)......')
# 2、连接服务器 socke对象.connect(ip地址,端口)
client.connect(('127.0.0.1', 8008))
# 3、发送数据 socke对象.send(字节型数据)
# b'hello server'直接按照bytes类型传递数据
# 将字符串转化为bytes data.encode():
while True:
data = input('客户端:')
client.send(data.encode('gbk'))
# 4、接受服务端返回数据 socke对象.recv(1024)需要指定接受数据的大小
# 将bytes类型转为字符串 recv_data.decode()
recv_data = client.recv(5)
# print(recv_data)
str_data = recv_data.decode('gbk')
print('服务器:',str_data)
if str_data == '关闭':
break
# 5、关闭客户端
client.close()
5.2 TCP服务端程序开发
-
开发 TCP 服务端程序开发步骤
-
创建服务端端套接字对象
-
创建服务端 socket 对象
socket.socket(AddressFamily, Type) -
参数说明:
- AddressFamily 表示IP地址类型, 分为IPv4和IPv6
- Type 表示传输协议类型
-
# 导入网络开发工具 import socket import threading # 1、创建服务端连接对象 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-
-
绑定端口号
-
服务端对象.bind((host, port)) : 表示绑定端口号, host 是 ip 地址,port 是端口号,ip 地址一般不指定,表示本机的任何一个ip地址都可以。
-
# 2、绑定ip和端口,方便后续监听是否有客户端请求服务端的ip和端口 server.bind(('192.168.88.8', 8050)) # 本地回环
-
-
设置监听
-
服务器对象.listen (backlog) : 表示设置监听,backlog参数表示最大等待建立连接的个数。
-
# 3、指定监听的数量 server.listen(5)
-
-
等待接受客户端的连接请求
-
服务器对象.accept() : 表示等待接受客户端的连接请求
-
server.accept()返回两个值:建立连接的客户端信息与客户端地址
-
# 让服务端持续接收客户端请求的数据 while True: # 4、等待客户端连接 clinet_sockt, addr = server.accept() print('客户端socket', clinet_sockt) print('客户端地址', addr)
-
-
接收数据
-
建立连接的客户端.recv(buffersize) :表示服务端接收来自客户端的数据, buffersize 是每次接收数据的长度
-
# 5、接受客户端传递的数据 recv_data = clinet_sockt.recv(1024) str_data = recv_data.decode('gbk') print('客户端:',str_data)
-
-
发送数据
-
建立连接的客户端.send(data) : 表示服务端发送给指定客户端的数据,data 是二进制数据
-
# 6、返回数据给客户端 data = input('服务端:') clinet_sockt.send(data.encode('gbk'))
-
-
关闭套接字
-
# 7、关闭服务端 server.close()
-
-
5.3多任务版TCP服务端程序的示例代码:
# 导入网络开发工具
import socket
import threading
# 封装处理客户端数据的方法
def client_data(clinet_sockt):
while True:
# 5、接受客户端传递的数据
recv_data = clinet_sockt.recv(1024)
str_data = recv_data.decode('gbk')
print('客户端:',str_data)
# 6、返回数据给客户端
data = input('服务端:')
clinet_sockt.send(data.encode('gbk'))
# 1、创建服务端连接对象
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2、绑定ip和端口,方便后续监听是否有客户端请求服务端的ip和端口
server.bind(('192.168.88.8', 8050)) # 本地回环
# 3、指定监听的数量
server.listen(5)
print('微型QQ服务端启动(一人一句版)......')
# 让服务端持续接收客户端请求的数据
while True:
# 4、等待客户端连接
clinet_sockt, addr = server.accept()
print('客户端socket', clinet_sockt)
print('客户端地址', addr)
# 创建线程处理每一个客户端的请求数据
t = threading.Thread(target=client_data,args=(clinet_sockt,))
t.start()
# 7、关闭服务端
server.close()
5.4. TCP网络应用程序的注意点介绍
- 当 TCP 客户端程序想要和 TCP 服务端程序进行通信的时候必须要先建立连接
- TCP 客户端程序一般不需要绑定端口号,因为客户端是主动发起建立连接的。
- TCP 服务端程序必须绑定端口号,否则客户端找不到这个 TCP 服务端程序。
- listen 后的套接字是被动套接字,只负责接收新的客户端的连接请求,不能收发消息。
- 当 TCP 客户端程序和 TCP 服务端程序连接成功后, TCP 服务器端程序会产生一个新的套接字,收发客户端消息使用该套接字。
- 关闭 accept 返回的套接字意味着和这个客户端已经通信完毕。
- 关闭 listen 后的套接字意味着服务端的套接字关闭了,会导致新的客户端不能连接服务端,但是之前已经接成功的客户端还能正常通信。
P 客户端程序想要和 TCP 服务端程序进行通信的时候必须要先建立连接 - TCP 客户端程序一般不需要绑定端口号,因为客户端是主动发起建立连接的。
- TCP 服务端程序必须绑定端口号,否则客户端找不到这个 TCP 服务端程序。
- listen 后的套接字是被动套接字,只负责接收新的客户端的连接请求,不能收发消息。
- 当 TCP 客户端程序和 TCP 服务端程序连接成功后, TCP 服务器端程序会产生一个新的套接字,收发客户端消息使用该套接字。
- 关闭 accept 返回的套接字意味着和这个客户端已经通信完毕。
- 关闭 listen 后的套接字意味着服务端的套接字关闭了,会导致新的客户端不能连接服务端,但是之前已经接成功的客户端还能正常通信。
- 当客户端的套接字调用 close 后,服务器端的 recv 会解阻塞,返回的数据长度为0,服务端可以通过返回数据的长度来判断客户端是否已经下线,反之服务端关闭套接字,客户端的 recv 也会解阻塞,返回的数据长度也为0。