广告设计网站排行榜前十名有哪些,苏州自助建站模板,教务在线网站开发报告书,南充房产文章目录 网络协议概述 p164TCP协议与UDP协议的区别 p165TCP服务器端代码的编写 p166TCP服务器端流程 TCP客户端代码的编写 p167TCP客户端流程主机和客户端的通信流程 tcp多次通信服务器端代码 p168TCP多次通信客户端代码 p169UDP的一次双向通信 p170udp通信模型udp接收方代码u… 文章目录 网络协议概述 p164TCP协议与UDP协议的区别 p165TCP服务器端代码的编写 p166TCP服务器端流程 TCP客户端代码的编写 p167TCP客户端流程主机和客户端的通信流程 tcp多次通信服务器端代码 p168TCP多次通信客户端代码 p169UDP的一次双向通信 p170udp通信模型udp接收方代码udp发送方的代码 模拟客服咨询小程序 p171客服代码客户代码 本章总结及习题 p172windows系统查看端口号对应的进程pid 网络协议概述 p164
ipv4十进制点分制 ipv6十六进制冒号分隔 TCP协议与UDP协议的区别 p165
tcp协议的三次握手
udp协议又称为用户数据包协议User Datagram Protocol)它是面向无连接的协议只要知道对方的ip地址和端口就可以直接发送数据包由于是面向无连接的所以无法保证数据一定会到达接收方
tcp比喻成打电话udp比喻成发短信
tcp和udp都是传输层的协议 什么是端口号 区分计算机中的运行的应用程序的整数 端口号的取值范围是0到65535一共65536个其中80这个端口号分配给HTTP服务21这个端口号分配给了FTP服务1433是分给了SQL server数据库 TCP和UDP的区别
TCP协议UDP协议连接方面面向连接的面向无连接安全方面传输可靠不丢失不丢失按顺序到达无法保证不丢包传输效率方面传输效率相对较低传输效率高连接对象数量方面只能点对点 一对一支持一对一一对多多对多的交互通信 socket简介
描述ip地址和端口号 socket对象的常用方法
方法名称功能描述bind((ip,port))绑定ip地址和端口listen(N)开始TCP监听N表示操作系统挂起的最大连接数量取值范围1-5之间一般设置为5accept()被动接收TCP客户端连接阻塞式返回一个元组分别是客户端socket和客户端地址connect((ip,port))主动初始化TCP服务器连接recv(size)接收TCP数据返回值为字符串类型size表示要接收的最大数据量send(str)发送tcp数据返回值是要发送的字节数量sendall(str)完整发送tcp数据将str中的数据发送到连接的套接字返回之前尝试发送所有数据若成功为None失败抛出异常recvfrom()接收udp数据返回值是一个元组dataaddressdata表示接收的数据address表示发送数据的套接字地址sendto(data,(ip,port))发送udp数据返回值是发送的字节数close()关闭套接字
TCP服务器端代码的编写 p166
TCP服务器端流程
1、使用socket类创建一个套接字对象 2、使用bind((ip,port))方法绑定ip地址和端口号 3、使用listen()方法开始TCP监听 4、使用accept()方法等待客户端的连接 5、使用recv() / send() 方法接收和发送数据 6、使用close() 关闭套接字
代码示例
from socket import socket,AF_INET,SOCK_STREAM
# AF_INET用于internet之间的进程通信
# SOCK_STREAM表示TCP协议# 1、创建socket模块
server_socketsocket(AF_INET,SOCK_STREAM)
# print(type(server_socket)) # class socket.socket# 2、绑定ip地址和端口
ip127.0.0.1 # 表示连接本机
port8888 # 不要和已有的指定端口冲突比如sql服务的port是3306
server_socket.bind((ip,port)) # bind参数是一个元组# 3、使用listen()开始监听
server_socket.listen(5)
print(服务器已启动(客户端连接成功后服务器的代码才会向下执行))# 4、等待客户端的连接
client_socket,client_addrserver_socket.accept() # accept方法返回一个元组类型通过系列解包赋值分别赋值给左边
print(type(client_socket))
print(type(client_addr))# 5、接收来自客户端的数据
dataclient_socket.recv(1024) # 返回值是一个字符串类型最大值为1024
print(客户端发送过来的数据为,data.decode(UTF-8))# 6、关闭socket
server_socket.close()
TCP客户端代码的编写 p167
TCP客户端流程
1、使用socket类创建一个套接字对象 2、使用connect((host,port))设置连接的主机ip和主机设置的端口 3、使用 recv() / send() 方法接收/发送数据 4、使用close()关闭套接字
本电脑上已经有一个project在运行服务器端代码。 此时需要新建一个项目代表另一台电脑去跑客户端代码。 右上角 FIle 然后 new project 然后设置新project的路径 然后选择新窗口打开从而运行了两个Pycharm
代码示例
import socket# 1、创建socket对象
client_socketsocket.socket() # 服务器端要加参数客户端不需要# 2、通过ip和port连接服务器
ip127.0.0.1
port8888
client_socket.connect((ip,port))
print(客户端和服务器端的连接建立成功)# 3、发送数据
client_socket.send(welcome to Python world.encode(UTF-8))
# client_socket.send(welcome to Python world) 不能直接发送发送字符串 TypeError: a bytes-like object is required, not str
# 4、关闭
client_socket.close()
print(发送成功)主机和客户端的通信流程 tcp多次通信服务器端代码 p168
import socket # 这么写的话就要写socket模块名 from...import不需要写模块名# 1、创建socket对象
server_socketsocket.socket(socket.AF_INET,socket.SOCK_STREAM)# 2、绑定主机ip和port
server_socket.bind((127.0.0.1,8888))# 3、开始监听 最大监听数量设置为5
server_socket.listen(5)# 4、开始等待客户端的tcp连接
client_socket,cliet_addrserver_socket.accept()# 5、接收数据
infoclient_socket.recv(1024).decode(UTF-8) # 服务器端接收数据时要从client端socket去接
while info!bye:if info:print(接收到的数据为,info)# 准备回复的数据datainput(请输入要回复的数据)client_socket.send(data.encode(UTF-8)) # 发数据也是从client端去发if databye:breakinfo client_socket.recv(1024).decode(UTF-8)# 关闭两个socket对象
client_socket.close()
server_socket.close()TCP多次通信客户端代码 p169
import socket# 1、创建socket对象
client_socketsocket.socket() # 客户端这边不需要加参数AF_INETSOCK_STREAM这些参数只有服务器端要加# 2、连接主机的ip和port
ip127.0.0.1
port8888
client_socket.connect((ip,port)) # 注意参数是个元组
print(与服务器端建立连接)# 3、客户端先发送数据
info
while info!bye:send_datainput(请输入客户端要发送的数据)client_socket.send(send_data.encode(UTF-8))if send_databye:print(客户端发起结束)breakinfoclient_socket.recv(1024).decode(UTF-8)print(收到服务器的响应数据,info)client_socket.close()UDP的一次双向通信 p170
udp协议是面向无连接的只要知道对方的ip和端口号就可以发送数据包但是不保证数据包能一定送达
udp通信模型 udp接收方代码
# udp接收方的代码
import socket# 1、创建socket对象
recv_socketsocket.socket(socket.AF_INET,socket.SOCK_DGRAM)# 2、绑定ip地址和端口
recv_socket.bind((127.0.0.1,8888))# 3、接收来自发送方的数据
recv_data,addrrecv_socket.recvfrom(1024) # 注意返回对象是一个元组系列解包赋值
print(-*66)
print(接收到的数据为,recv_data.decode(UTF-8))
print(接收数据来自,addr) # 接收数据来自 (127.0.0.1, 59661)
print(-*66)# 4、准备回复对方的数据
datainput(请输入要回复的数据)# 5、回复
recv_socket.sendto(data.encode(UTF-8),addr)# 6、关闭
recv_socket.close()udp发送方的代码
# UDP发送方的代码
import socketAF_INET 表示网络间通信SOCK_STREAM 表示TCP
SOCK_DGRAM 表示UDP
# 1、创建socket对象
send_socketsocket.socket(socket.AF_INET,socket.SOCK_DGRAM)# 2、准备发送数据
datainput(请输入要发送的数据)# 3、指定接收方的ip和port
ip_port(127.0.0.1,8888)# 4、发送数据
send_socket.sendto(data.encode(UTF-8),ip_port)# 5、接收来自接收方的数据
recv_data,addrsend_socket.recvfrom(1024) # 注意recvfrom返回的是一个元组使用解包赋值
print(-*66)
print(接收到的数据为,recv_data.decode(UTF8))
print(接收数据的地址为,addr)
print(-*66)# 6、关闭socket对象
send_socket.close()模拟客服咨询小程序 p171
模拟udp编程
客服代码
# 客服人员
import socketrecv_socketsocket.socket(socket.AF_INET,socket.SOCK_DGRAM)recv_socket.bind((127.0.0.1,8888)) # 注意入参是一个元组while True:recv_data,addrrecv_socket.recvfrom(1024) #返回值是一个元组类型系列解包赋值recv_stringrecv_data.decode(UTF-8)print(客户说,recv_string)print(客户地址,addr)if recv_stringbye:print(服务器端即将推出)break# 服务器端回复客户端数据datainput(回复什么给客户端)recv_socket.sendto(data.encode(UTF-8),addr) # 注意udp发送数据接口为sendto参数2为addrrecv_socket.close()客户代码
# 客户咨询者
import socketsend_socketsocket.socket(socket.AF_INET,socket.SOCK_DGRAM) # udp协议收发数据都要加参数 tcp协议收发数据只有服务器端代码要加参数while True:datainput(客户说)send_socket.sendto(data.encode(UTF-8),(127.0.0.1,8888))if databye:print(客户端发起结束)breakrecv_data,addrsend_socket.recvfrom(1024)print(客户端接收数据,recv_data.decode(UTF-8))print(服务器端地址,addr)send_socket.close()本章总结及习题 p172
网上聊天软件一般是udp
QQ采用的通信协议以UDP为主辅以TCP协议。
windows系统查看端口号对应的进程pid
看这个