UDP协议 (了解)
称之为数据包协议,又称不可靠协议。

特点:
  1) 不需要建立链接。
  2) 不需要知道对方是否收到。
  3) 数据不安全
  4) 传输速度快
  5)能支持并发
  6) 不会粘包
  7) 无需先启动服务端再启动客户端

优点:
  - 传输速度快
  - 能支持并发
  - 不会粘包

缺点:
  - 数据不安全, 容易丢失

应用场景: 早期的QQ聊天室。

# server端
import socket # socket.SOCK_DGRAM ---> UPD协议
server = socket.socket(type=socket.SOCK_DGRAM)
# 服务端需要绑定一个地址,让别人知道你在哪里
server.bind(
('127.0.0.1', 9002)
) while True: # 发送数据给服务端的用户地址
data, addr = server.recvfrom(1024)
print(addr)
print(data)
# msg = input('Server ---> Client:').encode('utf-8') # 无论服务端还是客户端,发送消息时,都必须知道对方是谁
# server.sendto(msg, addr)
# client端
import socket client = socket.socket(type=socket.SOCK_DGRAM) address = ('127.0.0.1', 9002) while True:
msg = input('Client ---> Server:').encode('utf-8') client.sendto(msg, address) # data, addr = client.recvfrom(1024)
#
# print(data)

- TCP协议(称为流式协议):

  优点:
    - 数据安全

  缺点:
    - 传输速度慢
    - 粘包

面试: TCP与UDP的区别, 简述优缺点即可。(*******)

TCP局域网客户端与服务端上传下载电影示例

文件夹位置:

'''  server
6.实现需求
- 准备一堆电影,存放在一个文件夹中。 - 需求:
- 1)客户端上传到服务端
1.让用户选择的上传的电影
2.服务端接收电影并保存 - 2)客户端下载服务端中的电影
1.客户端让服务端返回可下载电影
2.客户端选择下载的电影并下载
'''
import socket
import struct
import json
import os movie_path = r'D:\oldboy_edu\python课堂内容\day29\1 作业讲解\server_movie' def recv(conn):
headers = conn.recv(4)
bytes_len = struct.unpack('i', headers)[0]
json_data = conn.recv(bytes_len).decode('utf8')
back_dic = json.loads(json_data)
print('收到服务端数据: ', back_dic)
return back_dic def send(msg,conn):
json_bytes = json.dumps(msg).encode('utf8')
headers = struct.pack('i', len(json_bytes))
conn.send(headers)
conn.send(json_bytes) server = socket.socket()
server.bind(('127.0.0.1',9000))
server.listen(5) while True:
conn,addr = server.accept()
while True:
try:
# 1、接收客户端发送的消息
back_dic=recv(conn)
_type = back_dic.get('type') if _type == 'upload':
# 4.组织服务端存放上传电影的目录
movie_size = back_dic.get('movie_size')
movie_name = back_dic.get('movie_name')
download_path = r'D:\oldboy_edu\python课堂内容\day29\1 作业讲解\server_save_movie'
# 保存电影文件路径
movie_download_path = os.path.join(download_path,movie_name) recv_data = 0
with open(movie_download_path,'wb')as f:
# 一次性接收电影所有数据,有可能撑爆内存
# movie_data = conn.recv(movie_size)
# f.write(movie_data) # 一点一点接收
while recv_data < movie_size:
data = conn.recv(1024)
f.write(data)
recv_data+=len(data) elif _type == 'download':
movie_list = os.listdir(movie_path)
send_dic = {'movie_list':movie_list}
# 服务端发送给客户端的字典
send(send_dic, conn) # 服务端接收客户端发送过来的字典
back_dic=recv(conn) movie_name = back_dic.get('movie_name')
# 拼接需要下载的电影文件路径
movie_choose_path = os.path.join(movie_path,movie_name)
movie_size= os.path.getsize(movie_choose_path)
# 组织需要发送给客户端的电影数据
send_dic = {'movie_size':movie_size} send(send_dic,conn)
# json数据发送完毕后,紧接着发送真实电影数据
with open(movie_choose_path,'rb')as f:
for line in f:
conn.send(line) except Exception as e:
print(e)
break
conn.close()
# client
import socket
import struct
import json
import os client = socket.socket()
client.connect(('127.0.0.1',9000)) movie_path = r'D:\oldboy_edu\python课堂内容\day29\1 作业讲解\client_movie' def send(msg,client):
json_bytes = json.dumps(msg).encode('utf8')
headers = struct.pack('i', len(json_bytes))
client.send(headers)
client.send(json_bytes) def recv(client):
headers = client.recv(4)
bytes_len = struct.unpack('i', headers)[0]
json_data = client.recv(bytes_len).decode('utf8')
back_dic = json.loads(json_data)
print('收到服务端数据: ', back_dic)
return back_dic while True:
# 打印功能编号,让用户选择功能
print('''
1.上传
2.下载
q.退出
''')
choice = input('请输入功能编号:').strip()
if choice == 'q':
break
elif choice == '':
# 1) 组织报头数据,并打包
# 上传电影功能
movie_list = os.listdir(movie_path)
while True:
for index,movie_name in enumerate(movie_list):
print(index,movie_name)
choice = input('输入需要上传的电影编号:').strip()
if not choice.isdigit():
continue
choice = int(choice)
if not choice in range(len(movie_list)):
continue
movie_name = movie_list[choice]
# 拼接上传电影的路径
upload_movie_path= os.path.join(movie_path,movie_name)
# os.path.getsize(): 获取文件大小
movie_size = os.path.getsize(upload_movie_path)
# 客户端发送给服务端的字典
send_dic = {
'type':'upload',
'movie_name':movie_name,
'movie_size':movie_size
}
send(send_dic,client)
# 开始发送上传的电影
with open(upload_movie_path,'rb')as f:
# 一次性发送: 内存资源占用过大
# data = f.read()
# client.send(data) # 一点一点发送
for line in f:
client.send(line) elif choice == '':
# 下载电影功能
# 1.客户端发送消息给服务端
send_dic = {'type':'download'}
send(send_dic,client) # 2.客户端接收服务端返回的消息
back_dic=recv(client)
movie_list = back_dic.get('movie_list')
# 4.循环打印需要下载的电影列表
while True:
for index,movie_name in enumerate(movie_list):
print(index,movie_name)
choice = input('请输入上传电影编号:').strip()
if not choice.isdigit():
continue
choice = int(choice)
if choice not in range(len(movie_list)):
continue
movie_name = movie_list[choice]
# 发送需要下载电影的字典给服务端
send_dic = {'movie_name':movie_name}
send(send_dic,client) # 客户端接收服务单发送过来的电影字典
back_dic = recv(client)
# 接收电影的数据大小
movie_size = back_dic.get('movie_size') movie_save_path = os.path.join(movie_path,movie_name) recv_data = 0
# 开始接收真实电影数据
with open (movie_save_path,'wb')as f:
while recv_data < movie_size:
data = client.recv(1024)
f.write(data)
recv_data += len(data) client.close()

网络编程 UDP协议 TCP局域网客户端与服务端上传下载电影示例的更多相关文章

  1. 编写Java程序,实现客户端向服务端上传文件的功能

    查看本章节 查看作业目录 需求说明: 实现客户端向服务端上传文件的功能 当启动服务端后,运行客户端程序,系统提示客户在客户端输入上传文件的完整路径.当客户在客户端输入完成后,服务端实现文件上传 实现思 ...

  2. socket网络编程登录实现及多客户端和服务端的数据交互

    一.TCP/IP 客户端 package com.demo.entity; import java.io.Serializable; public class UserInfo implements ...

  3. 网络编程UDP、TCP详解

    网络编程   网络编程主要用于解决计算机与计算机(手机.平板-)之间的数据传输问题. 1.InetAddress(IP类)   方法: 方法 描述 getLocalHost() 获取本机的IP地址对象 ...

  4. Java之网络编程UDP和TCP

    注*部分转来的 第1章 网络通信协议 通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,这就好比在道路中行驶的汽车一定要遵守交通规则一样.在计算机网 ...

  5. 网络编程——UDP协议和通信

    第1章 UDP与TCP协议 在介绍TCP/IP结构时,提到传输层的两个重要的高级协议,分别是UDP和TCP,其中UDP是User Datagram Protocol的简称,称为用户数据报协议,TCP是 ...

  6. 实验09——java基于TCP实现客户端与服务端通信

    TCP通信         需要先创建连接 - 并且在创建连接的过程中 需要经过三次握手        底层通过 流 发送数据 数据没有大小限制        可靠的传输机制 - 丢包重发 包的顺序的 ...

  7. 网络编程 - UDP协议

    UDP协议 服务端 ''' UDP 协议 又称 数据报协议 SOCK_DGRAM ''' from socket import * # 一般不这样做 会重名 但写socket可以这样写 因为要用到太多 ...

  8. Java网络编程(UDP协议:接收端)

    package WebProgramingDemo; import java.io.IOException; import java.net.DatagramPacket; import java.n ...

  9. Java网络编程(UDP协议:发送端)

    package WebProgramingDemo; import java.io.IOException; import java.net.DatagramPacket; import java.n ...

随机推荐

  1. [LeetCode] 285. Inorder Successor in BST 二叉搜索树中的中序后继节点

    Given a binary search tree and a node in it, find the in-order successor of that node in the BST. Th ...

  2. oracle--oracle18C DG搭建(二)

    配置清单 任务 数据库 创建主数据库数据文件的备份副本 主 为备用数据库创建控制文件 主 为备用数据库创建参数文件 主 将文件从主系统复制到备用系统 主 设置环境以支持备用数据库 备库 启动物理备用数 ...

  3. oracle--oracle18C DBCA建库(一)

    一,环境配置 克隆或者安装一台oracle18c 只需要安装软件即可 主机名 ip 角色 db_inique oracle18c 192.168.0.162 主 oracle oracle18c2 1 ...

  4. 【对不同形式矩阵的总结】WC 2009 最短路径问题(线段树+矩阵乘法)

    题意 ​ 题目链接:https://www.luogu.org/problem/P4150 ​ 一个 \(6\times n\) 的网格图,每个格点有一个初始权值.有两种操作: 修改一个格子的权值 求 ...

  5. 第23课 优先选用make系列函数

    一. make系列函数 (一)三个make函数 1. std::make_shared:用于创建shared_ptr.GCC编译器中,其内部是通过调用std::allocate_shared来实现的. ...

  6. Nodejs操作MySQL数据库

    https://github.com/mysqljs/mysql   如何用nodejs操作MySql数据呢,其实写法还是简单的, 1.开始在你的node项目中 npm install mysql - ...

  7. Python学习教程(一)自学资源分享

    Python 可以用来做什么? 在我看来,基本上可以不负责任地认为,Python 可以做任何事情.无论是从入门级选手到专业级选手都在做的爬虫,还是Web 程序开发.桌面程序开发还是科学计算.图像处理, ...

  8. Asp.Net、API 、MVC、 PUT/DELETE 报405错解决办法

    本地put/delete能正常运行,但是部署在服务器就 报webapi method not allowed 405的错误 解决方案就是在Web.config里面加入如下设置: <system. ...

  9. Composer 入门后,接下来该看看这篇文章了

    上篇文章,我们了解了 Composer 的包是如何开发的,过程中我们使用了 composer init. composer install. composerrequire. composer con ...

  10. gogs私有代码库上传项目

    https://blog.csdn.net/zhouxueli32/article/details/80538017 一.上传 在cmd命令里进入该项目 然后依次输入以下命令 git initgit ...