简单版

服务端

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. android SQLite数据库的基本操作

    SQLite是Android使用的轻量级的数据库,开发Android应用是对数据库的操作自然是必不可少. Android提供了一个SQLiteOpenHelper类来可以很方便的操作数据库, 继承和扩 ...

  2. 【hive】 hive 加载数据

    1. insert 插入数据 要保证启动了jobhistory 否则会抛出异常 hdfs中查看内容 2. create table 表名字 select 字段... from  表名 hdfs查看数据 ...

  3. scala 模式匹配详解 2 scala里是怎么实现的?

    在这篇martin和另外两位模式匹配领域专家的论文里说了模式匹配的几种实现方式,以及scala是选择哪种方式来实现的.http://lampwww.epfl.ch/~emir/written/Matc ...

  4. 利用selenroid扩展uiautoamtor的webview解析能力

    uiautomator是一个非侵入式框架,但是webview解析能力很弱.为了改进webview的支持,可以考虑把webdriver或者selenroid整合进来. 具体接入可参考:http://se ...

  5. FastJson 自定义Serialize、Parser

    FastJson 自定义Serialize.Parser 今天在处理Json反序列化时,在C#传过来的JSON字符串中枚举类型为int类型,FastJson对于枚举的处理有两种类型,一种是字符串一种是 ...

  6. python使用selenium安装chromedriver的问题

    环境 win64位,python3.6, 问题与解决 说来也巧,今天无意中解决了两个多月前的问题,即用selenium调用chrome浏览器报错的问题:起因是在知乎中看到了一篇12306抢票的文章,用 ...

  7. 动态环境下的slam问题如何解决?

    作者:颜沁睿链接:https://www.zhihu.com/question/47817909/answer/107775045来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  8. web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例

    Django基础一之web框架的本质 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于Django实现的一个简单 ...

  9. SMB服务简介

      1.Samba简介 Samba是种自由软件,用来让UNIX系列的操作系统与微软Windows操作系统的SMB/CIFS(Server Message Block/Common Internet F ...

  10. spark application提交应用的两种方式

    bin/spark-submit --help ... ... --deploy-mode DEPLOY_MODE   Whether to launch the driver program loc ...