简单版

服务端

import socket
import struct
import json
import os server_dir = r'E:\Moudule_1\socket练习\server\server_file'
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('127.1.1.1',8808))
server.listen(5) print('setting...')
while True:
conn, client_addr = server.accept()
print(client_addr)
while True:
try:
#1.接收命令
data = conn.recv(1024)
print('客户端命令:',data) #2.接收报头长度
file_struct = conn.recv(4)
file_len = struct.unpack('i',file_struct )[0]
file_bytes = conn.recv(file_len)
file_json = json.loads(file_bytes) file_name = file_json['filename']
total_size = file_json['filesize'] #将从客户端接收的文件数据写入
with open('%s/%s' %(server_dir,file_name), 'wb') as f:
recv_size = 0
while recv_size < total_size:
line = conn.recv(1024)
f.write(line)
recv_size += len(line)
print('总大小:%s 已下载大小:%s' % (total_size, recv_size))
except:
exit()
conn.close()
server.close()

客户端

import socket
import struct
import json
import os client_dir = r'E:\Moudule_1\socket练习\client\download'
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.1.1.1',8808)) while True:
#1.发送命令
inp = input('>>:')
if not inp:continue
client.send(inp.encode('utf-8')) #将文件的以读的方式打开,将数据发送给server
#1.固定报头长度
filename = inp.split()[1]
filesize = os.path.getsize(os.path.join(client_dir, filename))
file_data = {
'filename' : filename,
'filesize' : filesize
} file_json = json.dumps(file_data)
file_bytes = file_json.encode('utf-8') file_struct = struct.pack('i', len(file_bytes))
#2.发送报头长度
client.send(file_struct)
#3.发送报头
client.send(file_bytes) #4.向server发送真实的数据
with open('%s/%s' %(client_dir, filename), 'rb') as f:
for line in f:
client.send(line) client.close()

优化版

服务端

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# Author:Mr.yang
import socket
import struct
import json
import os server_dir = r'E:\Moudule_1\socket练习\优化版\server\server_file'
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('127.1.1.1', 8808))
server.listen(5) def put(conn):
# 2.接收报头长度
file_struct = conn.recv(4)
file_len = struct.unpack('i', file_struct)[0]
file_bytes = conn.recv(file_len)
file_json = json.loads(file_bytes) file_name = file_json['filename']
total_size = file_json['filesize'] # 将从客户端接收的文件数据写入
with open('%s/%s' % (server_dir, file_name), 'wb') as f:
recv_size = 0
while recv_size < total_size:
line = conn.recv(1024)
f.write(line)
recv_size += len(line)
result = '总大小:%s 已上传大小:%s' % (total_size, recv_size)
conn.send(result.encode('utf-8')) def get(conn,data):
# 将文件的以读的方式打开,将数据发送给client
# 1.固定报头长度
filename = data.split()[1]
filesize = os.path.getsize(os.path.join(server_dir, filename))
file_data = {
'filename': filename,
'filesize': filesize
} file_json = json.dumps(file_data)
file_bytes = file_json.encode('utf-8')
file_struct = struct.pack('i', len(file_bytes))
# 2.发送报头长度
conn.send(file_struct)
# 3.发送报头
conn.send(file_bytes) # 4.向client发送真实的数据
with open('%s/%s' % (server_dir, filename), 'rb') as f:
for line in f:
conn.send(line) def run():
print('setting...')
while True:
conn, client_addr = server.accept()
print(client_addr)
while True:
try:
#1.接收命令
data = conn.recv(1024).decode('utf-8')
print('客户端命令:',data)
cmd =data.split()[0]
if cmd == 'put':
put(conn)
elif cmd == 'get':
get(conn,data)
except:
exit()
conn.close()
server.close() if __name__ == '__main__':
run()

客户端

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# Author:Mr.yang
import socket
import struct
import json
import os upload_dir = r'E:\Moudule_1\socket练习\优化版\client\upload'
download_dir = r'E:\Moudule_1\socket练习\优化版\client\download'
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.1.1.1', 8808)) def put(inp):
# 将文件的以读的方式打开,将数据发送给server
# 1.固定报头长度
filename = inp.split()[1]
filesize = os.path.getsize(os.path.join(upload_dir, filename))
file_data = {
'filename': filename,
'filesize': filesize
} file_json = json.dumps(file_data)
file_bytes = file_json.encode('utf-8') file_struct = struct.pack('i', len(file_bytes))
# 2.发送报头长度
client.send(file_struct)
# 3.发送报头
client.send(file_bytes) # 4.向server发送真实的数据
with open('%s/%s' % (upload_dir, filename), 'rb') as f:
for line in f:
client.send(line)
result = client.recv(1024)
print(result.decode('utf-8')) def get():
file_struct = client.recv(4)
file_len = struct.unpack('i', file_struct)[0]
file_bytes = client.recv(file_len)
file_json = json.loads(file_bytes)
file_name = file_json['filename']
total_size = file_json['filesize'] # 将从server接收的文件数据写入
with open('%s/%s' % (download_dir, file_name), 'wb') as f:
recv_size = 0
while recv_size < total_size:
line = client.recv(1024)
f.write(line)
recv_size += len(line)
print('总大小:%s 已上传大小:%s' % (total_size, recv_size)) def run():
while True:
#1.发送命令
inp = input('>>:')
if not inp:continue
cmd = inp.split()[0]
client.send(inp.encode('utf-8')) if cmd == 'put':
put(inp)
if cmd == 'get':
get()
client.close() if __name__ == '__main__':
run()

面向对象版

服务端

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# Author:Mr.yang
import socket
import struct
import json
import os class MYTCPServer:
address_family = socket.AF_INET # 地址家族 socket_type = socket.SOCK_STREAM # 基于TCP协议的流水型 server_dir = r'E:\Moudule_1\socket练习\优化版\server\server_file' allow_reuse_address = False # 是否重复使用IP地址 max_packet_size = 8192 # 最大的数据包大小 request_queue_size = 5 # 允许链接的大小 def __init__(self,server_address, bind_and_activate=True):
self.server_address = server_address # 服务端地址
self.socket = socket.socket(self.address_family,self.socket_type) if bind_and_activate:
try:
self.server_bind()
self.server_activate()
except:
self.server_close()
raise def server_bind(self):
if self.allow_reuse_address: # 判断是否允许重用端口
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.socket.bind(self.server_address) # 绑定地址
self.server_address = self.socket.getsockname() def server_activate(self):
self.socket.listen(self.request_queue_size) # 设置最大接听数 def server_close(self):
self.socket.close() #关闭 def get_request(self):
return self.socket.accept() # 建立链接 def run(self,):
print('setting...')
while True:
self.conn, client_addr = self.get_request()
print(client_addr)
while True:
try:
#1.接收命令
data = self.conn.recv(1024).decode('utf-8')
print('客户端命令:',data)
cmd =data.split()[0]
if hasattr(self,cmd):
func = getattr(self,cmd)
func(data)
except:
exit() def put(self,data):
# 2.接收报头长度
file_result = self.conn.recv(self.max_packet_size).decode('utf-8')
if file_result == '':
file_struct = self.conn.recv(4)
file_len = struct.unpack('i', file_struct)[0]
file_bytes = self.conn.recv(file_len)
file_json = json.loads(file_bytes) file_name = file_json['filename']
total_size = file_json['filesize'] # 将从客户端接收的文件数据写入
with open('%s/%s' % (self.server_dir, file_name), 'wb') as f:
recv_size = 0
while recv_size < total_size:
line = self.conn.recv(1024)
f.write(line)
recv_size += len(line)
result = '总大小:%s 已上传大小:%s' % (total_size, recv_size)
self.conn.send(result.encode('utf-8'))
else:
print('文件不存在') def get(self,data):
# 将文件的以读的方式打开,将数据发送给client
# 1.固定报头长度
filename = data.split()[1]
filepath = os.path.join(self.server_dir, filename)
if os.path.exists(filepath):
self.conn.send(''.encode('utf-8'))
filesize = os.path.getsize(filepath)
file_data = {
'filename': filename,
'filesize': filesize
} file_json = json.dumps(file_data)
file_bytes = file_json.encode('utf-8')
file_struct = struct.pack('i', len(file_bytes))
# 2.发送报头长度
self.conn.send(file_struct)
# 3.发送报头
self.conn.send(file_bytes) # 4.向client发送真实的数据
with open('%s/%s' % (self.server_dir, filename), 'rb') as f:
for line in f:
self.conn.send(line)
else:
self.conn.send(''.encode('utf-8'))
print('文件不存在')
obj = MYTCPServer(('127.1.1.1', 8808))
obj.run()

客户端

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# Author:Mr.yang
import socket
import struct
import json
import os
class MYTCPClient:
address_family = socket.AF_INET # 地址家族 socket_type = socket.SOCK_STREAM # 基于TCP协议的流水型 allow_reuse_address = False # 是否重复使用IP地址 max_packet_size = 8192 # 最大的数据包大小 request_queue_size = 5 # 允许链接的大小 upload_dir = r'E:\Moudule_1\socket练习\优化版\client\upload' download_dir = r'E:\Moudule_1\socket练习\优化版\client\download' def __init__(self,sever_address, connect=True):
self.server_address = sever_address
self.socket = socket.socket(self.address_family, self.socket_type)
if connect:
try:
self.client_connect()
except:
self.client_close
raise def client_connect(self):
self.socket.connect(self.server_address) # 创建双线管道链接 def client_close(self):
self.socket.close() def put(self,inp):
# 将文件的以读的方式打开,将数据发送给server
# 1.固定报头长度
filename = inp.split()[1]
filepath = os.path.join(self.upload_dir, filename)
if os.path.exists(filepath): # 判断文件是否存在
self.socket.send(''.encode('utf-8'))
filesize = os.path.getsize(filepath)
file_data = {
'filename': filename,
'filesize': filesize
} file_json = json.dumps(file_data)
file_bytes = file_json.encode('utf-8') file_struct = struct.pack('i', len(file_bytes))
# 2.发送报头长度
self.socket.send(file_struct)
# 3.发送报头
self.socket.send(file_bytes) # 4.向server发送真实的数据
with open('%s/%s' % (self.upload_dir, filename), 'rb') as f:
for line in f:
self.socket.send(line)
result = self.socket.recv(1024)
print(result.decode('utf-8'))
else:
self.socket.send(''.encode('utf-8'))
print('文件不存在') def get(self,inp): file_result = self.socket.recv(self.max_packet_size).decode('utf-8')
if file_result == '':
file_struct = self.socket.recv(4)
file_len = struct.unpack('i', file_struct)[0]
file_bytes = self.socket.recv(file_len)
file_json = json.loads(file_bytes)
file_name = file_json['filename']
total_size = file_json['filesize'] # 将从server接收的文件数据写入
with open('%s/%s' % (self.download_dir, file_name), 'wb') as f:
recv_size = 0
while recv_size < total_size:
line = self.socket.recv(1024)
f.write(line)
recv_size += len(line)
print('总大小:%s 已上传大小:%s' % (total_size, recv_size))
else:
print('文件不存在') def run(self):
while True:
#1.发送命令
inp = input('>>:')
if not inp:continue
cmd = inp.split()[0]
self.socket.send(inp.encode('utf-8'))
if hasattr(self, cmd):
func = getattr(self, cmd)
func(inp) obj = MYTCPClient(('127.1.1.1', 8808))
obj.run()

socket 套接字总结的更多相关文章

  1. java 25 - 3 网络编程之 Socket套接字

    Socket Socket套接字: 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字. Socket原理机制: 通信的两端都有Socket. 网络通信其实就是Socket ...

  2. 进程、线程、socket套接字-资源大小 & 切换代价

    另,进程 & 线程的很多知识可以看这里:http://www.cnblogs.com/charlesblc/p/6135666.html 今天查了一下进程和线程的资源占用. 比如问:栈和堆的大 ...

  3. linux网络环境下socket套接字编程(UDP文件传输)

    今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...

  4. linux网络编程-(socket套接字编程UDP传输)

    今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...

  5. socket套接字TCP API

    socket套接字TCP API socket概念 socket又称"套接字",是计算机网络中进程间通信数据通道的一个端点.或称之为句柄.IP地址+port号就能够唯一确定一个so ...

  6. 进程间通信系列 之 socket套接字实例

    进程间通信系列 之 概述与对比   http://blog.csdn.net/younger_china/article/details/15808685  进程间通信系列 之 共享内存及其实例   ...

  7. 进程间通信系列 之 socket套接字及其实例

    进程间通信系列 之 概述与对比   http://blog.csdn.net/younger_china/article/details/15808685  进程间通信系列 之 共享内存及其实例   ...

  8. 一、网络编程-UDP传输协议及socket套接字使用

    知识点基本介绍:1.网络通信协议一般就是UDP和TCP俩种传输协议,这一章先说UDP,UDP是一种比较简单的传输协议,如qq使用的就是UDP          2.ip:ip就是标记网络中中的一台电脑 ...

  9. 网络编程初识和socket套接字

    网络的产生 不同机器上的程序要通信,才产生了网络:凡是涉及到倆个程序之间通讯的都需要用到网络 软件开发架构 软件开发架构的类型:应用类.web类 应用类:qq.微信.网盘.优酷这一类是属于需要安装的桌 ...

  10. 传输模型, tcp socket套接字

    osi七层模型 tcp/ip四层模型 socket套接字 tcp 协议是可靠的  包括 三次握手 四次挥手 import socket # server server = socket.socket( ...

随机推荐

  1. [Full-stack] 网页布局艺术 - Less

    故事背景 一个过程: template/html ----> css ----> less ----> bootstrap/flex ----> Semantic-ui fle ...

  2. [Android] 基于 Linux 命令行构建 Android 应用(二):命令行管理项目

    创建 Android 项目 在命令行创建 Android 项目需要用到 android 工具(该工具由 Android SDK 提供,位于 <sdk>/tools/ 目录下.).它能自动生 ...

  3. java保存动态代理生成的类的class文件

    启动时加: -Dsun.misc.ProxyGenerator.saveGeneratedFiles=true

  4. play mp3 in c#

    using System; using System.Runtime.InteropServices; using System.Text; using System.IO; using System ...

  5. spring事务实现原理

    实现原理 本质 如果你用过Spring AOP,那么理解注解事务就十分简单了.事务注解本质上实在事务方法加入一个Around切面,在方法开始前开始事务,在抛出异常后回滚事务.使用简单伪代码可以简单理解 ...

  6. ROS rosrun 调用 sudo 命令

    https://blog.csdn.net/qq_16775293/article/details/81138904

  7. centos 安装教程 服务器配置教程 服务器中安装python 服务器中安装Django 安装MySQL 配置MySQL

    一 .解决python编译安装所需的软件依赖 yum install gcc patch libffi-devel python-devel  zlib-devel bzip2-devel opens ...

  8. [No0000143]Win10“卓越性能模式”

    从不久之前Win10更新1803以来,微软不仅带来了一些新功能(和BUG),还悄悄地加入了一个“卓越性能模式”,老张想了想,不对呀,以前就有了一个“高性能模式”,这怎么就还多出个新的性能模式来,难道会 ...

  9. [No0000E2]Vmware虚拟机安装 苹果系统 mac OS 10.12

    1.下载并安装Vmware:实验版本号:VMware-workstation-full-12.5.5-5234757:(忽略网上说的这个版本不行.可以装C盘,不过转C盘后后面都要用管理员权限运行其他软 ...

  10. phoenix技术(安装部署和基本使用)讲解

    1.phoenix简介 Apache Phoenix是构建在HBase之上的关系型数据库层,作为内嵌的客户端JDBC驱动用以对HBase中的数据进行低延迟访问.Apache Phoenix会将用户编写 ...