版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40667484/article/details/83617305
----------udp通信模型
是写信的模型
要填上ip 端口
特点:不太安全,容易丢包
飞q:edp
----------tcp通信模型
是打电话的模型,不需要填写ip和port
TCP:安全
在通信开始之前,一定要建立相关的链接,才能发送数据。
建立通道。
----------TCP通信需要经过创建连接,数据传送,终止连接三个步骤。
----------TCP采用了应答机制
-----------TCP和UDP的不同点
面向连接(确认有创建三方交握,连接已创建才作传输)
有序数据传输
重发丢失的数据包
舍弃重复的数据包
无差错的的数据传输
阻塞/流量控制
----------udp流程
----------tcp流程
-----------tcp客户端
-----------tcp客户端构建流程
import socket
def main():
# 创建套接字
tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 链接服务器
server_ip = input("请输入要链接的服务器的ip:")
server_port = int(input("请输入要链接的服务器的port:"))
server_addr = (server_ip,server_port)
tcp_socket.connect(server_addr)
# 发送数据
while True:
send_data = input("请输入要发送的数据:")
tcp_socket.send(send_data.encode("utf-8"))
if send_data == "exit":
break
# 关闭套接字
tcp_socket.close()
if __name__ == "__main__":
main()
-------------TCP服务器
------------------TCP服务器代码
import socket
def main():
# 买个手机(创建套接字)
tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 安装手机卡(绑定本地信息)
localaddr = ("",7788)
tcp_server_socket.bind(localaddr)
# 将手机设置为正常的 响铃模式(让默认的套接字由主动变为被动 listen)
tcp_server_socket.listen(128)
print("------1------")
while True:
# 等待别人的电话到来(等待客户端的链接 accept)
new_client_socket,client_addr = tcp_server_socket.accept()
print("--------2--------")
print(client_addr)
# 接收客户端发送过来的请求
recv_data = new_client_socket.recv(1024)
print(recv_data)
# 回送一部分数据给客户端
new_client_socket.send("1111".encode("utf-8"))
# 关闭套接字
new_client_socket.close()
tcp_server_socket.close()
if __name__ == "__main__":
main()
----------主要流程是:
总述: 一个客户端传送数据,一个服务器端接收数据
1.先是服务器端打开流,
2.到accept堵塞,等客户端解堵塞
3.再是客户端利用connect连接服务器端
4.接收客户端发送的信息
5.回送一部分数据给客户端以证明发送成功
6.关闭套接字(关闭连接)
循环为多个客户端服务
在accept前面加while True:
while True:
# 等待别人的电话到来(等待客户端的链接 accept)
new_client_socket,client_addr = tcp_server_socket.accept()
print("--------2--------")
print(client_addr)
# 接收客户端发送过来的请求
recv_data = new_client_socket.recv(1024)
print(recv_data)
# 回送一部分数据给客户端
new_client_socket.send("1111".encode("utf-8"))
# 关闭套接字
new_client_socket.close()
tcp_server_socket.close()
TCP——案例:文件下载器模型(抄作业模型)
什么叫下载:
1.在本地创建一个文件
2.然后收到一点数据,就写进去
----------文件下载器的客户端
1.打开套接字
2.绑定地址
3.链接服务器端
4.获取下载的文件名字
5.发送数据(一个文件名)
6.接收数据
7.把接收的数据写在文件内
8.关闭套接字
import socket
def main():
# 打开套接字
tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 绑定地址
localaddr = ("",7788)
tcp_socket.bind(localaddr)
# 链接服务器端
server_ip = input("请输入要链接的服务器的ip:")
server_port = int(input("请输入要链接的服务器的port:"))
server_addr = (server_ip, server_port)
tcp_socket.connect(server_addr)
# 获取下载的文件名字
download_file_name = input("请输入要下载的文件名字:")
# 发送数据(一个文件名)
tcp_socket.send(download_file_name.encode("utf-8"))
# 接收数据
recv_data = tcp_socket.recv(1024*1024)
# 把接收的数据写在文件内
with open("[新]" + download_file_name, "wb") as f:
f.write(recv_data)
# 关闭套接字
tcp_socket.close()
if __name__ == "__main__":
main()
----------文件下载器的服务器端
import socket
def main():
# 创建套接字
tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 绑定自身地址
localaddr = ("",5050)
tcp_server_socket.bind(localaddr)
# 换为接听
tcp_server_socket.listen(128)
# 接受客户端访问
new_client_socket,client_addr = tcp_server_socket.accept()
print(client_addr)
# 接受数据
recv_data = new_client_socket.recv(1024*1024)
print(recv_data)
# 发送数据
new_client_socket.send("dqwdq".encode("utf-8"))
# 关闭套接字
new_client_socket.close()
tcp_server_socket.close()
if __name__ == '__main__':
main()