目录
- 1、网络编程
 - 1.1网络介绍
 - 1.2IP地址
 - 1.3 ifconfig和ping命名
 - 1.4端口和端口号
 - 1.5端口号的分类
 - 1.6 socket介绍
 - 1.7 TCP介绍
 
- 2、TCP的网络应用程序开发
 - 2.1 python3编码转换
 - 2.2 TCP客户端程序开发流程
 - 2.3 TCP客户端程序开发
 - 2.4 TCP服务端程序开发流程
 - 2.5 TCP客户端程序开发
 - 2.6 TCP网络应用程序注意点
 - 2.7 案例:多任务版TCP服务端程序开发
 
1、网络编程
1.1网络介绍
网络:将具有独立功能的多台计算机通过通信线路和通信设备连接起来,在网络管理软件和网络通信协议下,实现资源共享和信息传递的虚拟平台
 学习网络的目的:能够编写基于网络通信的软件或程序,即网络编程
1.2IP地址
IP地址是分配给网络设备上网的数字标签,能够标识网络中唯一的一台设备
 IP地址的表现形式:IPV4(目前使用的IP地址),IPV6(未来使用的IP地址)
1.3 ifconfig和ping命名

 ping baidu.com 评一下百度,看运行是否正常
 查看网卡信息----ifconfig
 检查网络----ping
1.4端口和端口号
ip地址只能定位到电脑设备,但不能定位到程序(是微信还是QQ)
 通信流程:通过IP地址找到对应设备,通过端口号找到对应端口,通过端口把数据给到相应应用程序
端口:传输数据通道,是数据传输的必经之路
 端口号:用来管理区分不同端口的一个号码
1.5端口号的分类
按照一定的规定分为:知名端口号,动态端口号
 知名端口号是指众所周知的端口号,范围0到1023。(例如号码110)
 动态端口号:一般程序员开发应用程序使用的端口号,范围1024到65535。(例如我们每个人的号码)
1.6 socket介绍
socket套接字,程序之间通信的一个工具,类别知道了电话号码还需要电话才能进行通信。
 socket:程序间网络数据通信的工具
1.7 TCP介绍
数据不能随便发送,在发送之前要选择网络传输方式(传输协议),保证程序之间按照指定的传输规则进行数据的通信
 TCP:传输控制协议,它是一种面向连接的、可靠的、基于字节流的传输层通信协议
 TCP特点:1,面向连接,2,可靠的(TCP采样发送应答机制、超时重传、错误校验、流量控制和阻塞管理)
 TCP通信步骤:创建连接、传输数据、关闭连接
2、TCP的网络应用程序开发
2.1 python3编码转换
网络数据的传输:以二进制的数据进行传输
 encode编码–decode解码
 bytes.decode(encoding=‘utf-8’)
 str.encode(encoding=‘utf-8’)
2.2 TCP客户端程序开发流程
TCP网络应用程序开发分为:TCP客户端程序开发,TCP服务端程序开发
 客户端:运行在用户设备上的程序。主动发起建立连接请求
 服务端:运行在服务器上的程序,专门为客户端提供数据服务。等待接受连接请求
2.3 TCP客户端程序开发
开发TCP客户端程序流程:
- 创建客户端套接字对象
 - 和服务器套接字建立连接
 - 发送数据
 - 接收数据
 - 关闭客户端套接字
 
导入socket模块 —import socket
 
 
import socket
if __name__ =='__main__':
	#1. 创建客户端套接字对象
	tcp_client_socket = socket.socket(socket.AF_INET,socket.sock_STREAM)
	#2. 和服务器套接字建立连接
	tcp_client_socket.connect(('172.16.62.136',8080))
	#3. 发送数据
	tcp_client_socket.send('nihaome'.encode(encoding='utf-8'))
	#4. 接收数据 recv阻塞等待数据的到来
	recv_data = tcp_client_socket.recv(1024)
	print(recv_data.decode())
	#5. 关闭客户端套接字
	tcp_client_socket.close()
 

2.4 TCP服务端程序开发流程
- 创建服务端端套字对象
 - 绑定IP地址和端口号
 - 设置监听
 - 等待接受客户端的连接请求
 - 接收数据
 - 发送数据
 - 关闭套接字
 
2.5 TCP客户端程序开发

import socket
if __name__ =='__main__':
	#1. 创建服务端端套字对象
	tcp_server_socket = socket.socket(socket.AF_INET,socket.sock_STREAM)
	#2. 绑定IP地址和端口号
	#tcp_server_socket.bind(('172.16.62.136',8080))
	#如果bind中的参数第一个IP地址元素设置为“”,默认为本机ip地址
	tcp_server_socket.bind(("",8080))
	#3. 设置监听128:代表服务端等待排队连接的最大数量
	tcp_server_socket.listen(128)
	#4. 等待接受客户端的连接请求
	conn_socket,ip_port = tcp_server_socket.accept()
	print('客户端地址:',ip_port)
	#5. 接收数据
	recv_data = conn_socket.recv(1024)
	print('接收到的数据:',recv_data.decode())
	#6. 发送数据
	conn_socket.send('客户端你的数据接收到了'.encode())
	#7. 关闭套接字
	conn_socket.close()
	tcp_server_socket.close()
 
 

2.6 TCP网络应用程序注意点
不管是recv还是send都不是直接接收数据和发送数据给对方的,发送数据会写入到发送缓冲区,接收数据是从缓冲区来读取,发送数据和接收数据最终是由操作系统控制网卡来完成的。
2.7 案例:多任务版TCP服务端程序开发
缺陷:目前开发的tcp服务端只能服务于一个程序
 修改:加一个while True
import socket
if __name__ =='__main__':
	#1. 创建服务端端套字对象
	tcp_server_socket = socket.socket(socket.AF_INET,socket.sock_STREAM)
	#设置端口复用
	tcp_server_socket.setsockopt(.socketSOL_SOCKET,socket.SO_REUSEADDR,True)
	#2. 绑定IP地址和端口号
	#tcp_server_socket.bind(('172.16.62.136',8080))
	#如果bind中的参数第一个IP地址元素设置为“”,默认为本机ip地址
	tcp_server_socket.bind(("",8080))
	#3. 设置监听128:代表服务端等待排队连接的最大数量
	tcp_server_socket.listen(128)
	while True:
		#4. 等待接受客户端的连接请求
		conn_socket,ip_port = tcp_server_socket.accept()
		print('客户端地址:',ip_port)
		#5. 接收数据
		recv_data = conn_socket.recv(1024)
		print('接收到的数据:',recv_data.decode())
		#6. 发送数据
		conn_socket.send('客户端你的数据接收到了'.encode())
		#7. 关闭套接字
		conn_socket.close()
	tcp_server_socket.close()
 
缺陷:目前开发的tcp服务端不能同时服务于多个程序
 修改:多任务
import socket
import threading
def handle_client(conn_socket):
	#5. 接收数据
	recv_data = conn_socket.recv(1024)
	print('接收到的数据:',recv_data.decode())
	#6. 发送数据
	conn_socket.send('客户端你的数据接收到了'.encode())
	#7. 关闭套接字
	conn_socket.close()
	
if __name__ =='__main__':
	#1. 创建服务端端套字对象
	tcp_server_socket = socket.socket(socket.AF_INET,socket.sock_STREAM)
	#设置端口复用
	tcp_server_socket.setsockopt(.socketSOL_SOCKET,socket.SO_REUSEADDR,True)
	#2. 绑定IP地址和端口号
	#tcp_server_socket.bind(('172.16.62.136',8080))
	#如果bind中的参数第一个IP地址元素设置为“”,默认为本机ip地址
	tcp_server_socket.bind(("",8080))
	#3. 设置监听128:代表服务端等待排队连接的最大数量
	tcp_server_socket.listen(128)
	while True:
		#4. 等待接受客户端的连接请求
		conn_socket,ip_port = tcp_server_socket.accept()
		print('客户端地址:',ip_port)
		#使用多线程去接收多个客户端的请求
		sub_thread = threading.Thread(target=handle_client,args=(conn_socket,))
		sub_thread.start()
	tcp_server_socket.close()
                ![[Android]序列化原理Parcelable](https://img-blog.csdnimg.cn/99a589e6f99a43c19b8bc47b8e19a2be.png)


















