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. 分布式共识算法 (三) Raft算法

    系列目录 分布式共识算法 (一) 背景 分布式共识算法 (二) Paxos算法 分布式共识算法 (三) Raft算法 分布式共识算法 (四) BTF算法 一.引子 1.1 介绍 Raft 是一种为了管 ...

  2. java识别死亡或者存活的对象

    那些内存需要回收 内存回收是对运行时内存区域的内存回收,其中程序计数器.虚拟机栈.本地方法栈3个区域随线程而生,随线程而灭:栈中的栈帧随着方法的进入和退出而有条不紊的执行着出栈和入栈操作.每一个栈帧中 ...

  3. CSS3幸运大转盘最简单的写法

    点击开始 直接css动画 如果你要自己控制转到哪里 那就多写几个class 根据不同角度 运行不同的class..<pre>.zhuandong{ animation: zhuandong ...

  4. PHP curl cookie不识别

    PHP curl cookie不识别 所以curl的时候别用setcookie 用了也没用

  5. Linux内核中的并发与竞态概述

    1.前言 众所周知,Linux系统是一个多任务的操作系统,当多个任务同时访问同一片内存区域的时候,这些任务可能会相互覆盖内存中数据,从而造成内存中的数据混乱,问题严重的话,还可能会导致系统崩溃. 2. ...

  6. linux下发布项目

    查看端口

  7. POJ 3132 DP+素数筛

    Sum of Different Primes Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 3684   Accepted ...

  8. win10系统优化

    1.服务:关闭 windows update\ windows search \ windows 备份 2.系统:高级系统设置->性能最优,同事修改虚拟内存如下 3.任务管理器:关闭多余的启动项 ...

  9. Blend 设置通明窗体

    原文:Blend 设置通明窗体 这篇开始到下周周一 更新WPF blend 和MVVM模式的博客  因为新入职的公司主要去做WPF的工作 一边整理学习  一遍回顾   但是CSDN 限制每天10篇  ...

  10. WPF 精修篇 调用Win32Api

    原文:WPF 精修篇 调用Win32Api 栗子是 调用WIn32API 让窗口最前 后台代码 [DllImport("user32.dll")] private static e ...