socket 套接字总结
简单版
服务端
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 套接字总结的更多相关文章
- java 25 - 3 网络编程之 Socket套接字
Socket Socket套接字: 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字. Socket原理机制: 通信的两端都有Socket. 网络通信其实就是Socket ...
- 进程、线程、socket套接字-资源大小 & 切换代价
另,进程 & 线程的很多知识可以看这里:http://www.cnblogs.com/charlesblc/p/6135666.html 今天查了一下进程和线程的资源占用. 比如问:栈和堆的大 ...
- linux网络环境下socket套接字编程(UDP文件传输)
今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...
- linux网络编程-(socket套接字编程UDP传输)
今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...
- socket套接字TCP API
socket套接字TCP API socket概念 socket又称"套接字",是计算机网络中进程间通信数据通道的一个端点.或称之为句柄.IP地址+port号就能够唯一确定一个so ...
- 进程间通信系列 之 socket套接字实例
进程间通信系列 之 概述与对比 http://blog.csdn.net/younger_china/article/details/15808685 进程间通信系列 之 共享内存及其实例 ...
- 进程间通信系列 之 socket套接字及其实例
进程间通信系列 之 概述与对比 http://blog.csdn.net/younger_china/article/details/15808685 进程间通信系列 之 共享内存及其实例 ...
- 一、网络编程-UDP传输协议及socket套接字使用
知识点基本介绍:1.网络通信协议一般就是UDP和TCP俩种传输协议,这一章先说UDP,UDP是一种比较简单的传输协议,如qq使用的就是UDP 2.ip:ip就是标记网络中中的一台电脑 ...
- 网络编程初识和socket套接字
网络的产生 不同机器上的程序要通信,才产生了网络:凡是涉及到倆个程序之间通讯的都需要用到网络 软件开发架构 软件开发架构的类型:应用类.web类 应用类:qq.微信.网盘.优酷这一类是属于需要安装的桌 ...
- 传输模型, tcp socket套接字
osi七层模型 tcp/ip四层模型 socket套接字 tcp 协议是可靠的 包括 三次握手 四次挥手 import socket # server server = socket.socket( ...
随机推荐
- [原]pomelo基础知识(一)
1.pomelo基本介绍 http://blog.gfdsa.net/2013/06/04/pomelo/pomelo_study_two/ 2.如何配置一个gate服务器 (1)首先 需要在game ...
- [IR] Open Source Search Engines
From:http://blog.csdn.net/xum2008/article/details/8740063 本文档是对现有的开源的搜索引擎的一个简单介绍 1. Lucene Lucene ...
- Android图片管理组件(双缓存+异步加载)
转自:http://www.oschina.net/code/snippet_219356_18887?p=3#comments ImageManager2这个类具有异步从网络下载图片,从sd读取本地 ...
- 在 VS Code 和 Chrome 中调试
先决条件 你必须安装好 Chrome 和 VS Code.同时请确保自己在 VS Code 中安装了 Debugger for Chrome 扩展的最新版本. 请通过 Vue CLI,遵循它的 REA ...
- Unity3D Shader 空气扭动效果
//预览图 //原理 一个摄像机CullingMask设置只可见"Distortion"的Layer(需要自己手动加),输入到一张RenderTexture,其实就是用于确定哪里要 ...
- Ubuntu-18.04设置开机启动脚本
参考:https://www.cnblogs.com/defifind/p/9285456.html http://www.cnblogs.com/airdot/p/9688530.html s ...
- {MySQL数据库初识}一 数据库概述 二 MySQL介绍 三 MySQL的下载安装、简单应用及目录介绍 四 root用户密码设置及忘记密码的解决方案 五 修改字符集编码 六 初识sql语句
MySQL数据库初识 MySQL数据库 本节目录 一 数据库概述 二 MySQL介绍 三 MySQL的下载安装.简单应用及目录介绍 四 root用户密码设置及忘记密码的解决方案 五 修改字符集编码 六 ...
- iOS ARC编译器规则和内存管理规则
iOS 开发当中,自动引用计数已经是标准的内存管理方案.除了一些老旧的项目或者库已经没有人使用手动来管理内存了吧. ARC无疑是把开发者从繁琐的保留/释放引用对象逻辑中解脱出来.但这并不是万事大吉了, ...
- day0321正则表达式
一.正则表达式 1.定义一个规则,检测某一段字符串是否符合规则,将符合规则的字符匹配出来. 2.只和字符串相关 3.字符组 描述一个字符位置的内容 3.1 [012345]检测0,1,2,3,4 ...
- [security] security engine things
1. luarock luarock 之于 lua,就好比 pip 之于 python https://luarocks.org/ 2. lua的库 [root@base package]# ls ...