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( ...
随机推荐
- [Python] 02 - String
字符串 string 一.基本性质 不变性 Immutability 要变就 --> list --> string 二.功能函数 功能函数 S = 'Spam" S.find( ...
- Spring 整合 Junit4 进行单元测试
1. pom.xml 引入JAR依赖: <dependency> <groupId>junit</groupId> <artifactId>junit& ...
- Eclipse的Project Facets属性
Project Facets 1. 'Project Facets'可理解为:项目的特性,主流 IDE (Eclipse IDEA) 都提供了 facet 的配置. 'Project Facets' ...
- JS 对象的深拷贝和浅拷贝
转载于原文:https://www.cnblogs.com/dabingqi/p/8502932.html 这篇文章是转载于上面的链接地址,觉得写的非常好,所以收藏了,感谢原创作者的分享. 浅拷贝和深 ...
- 整型数字转utf8
static std::string codePointToUTF8(unsigned int cp){ std::string result; // based on description fro ...
- JAVA学习资源整理
构建 这里搜集了用来构建应用程序的工具. Apache Maven:Maven使用声明进行构建并进行依赖管理,偏向于使用约定而不是配置进行构建.Maven优于Apache Ant.后者采用了一种过程化 ...
- Xshell登录Ubuntu12.04
Ubuntu安装ssh服务: sudo apt-get install openssh-server 打开Xshell,选择“新建”,“连接”设置里选择SSH,主机填入需要连接的主机的IP地址.在“用 ...
- redis(二)--用Redis作MySQL数据库缓存
用Redis作MySQL数据库缓存,必须解决2个问题.首先,应该确定用何种数据结构存储来自mysql的数据:在确定数据结构之后,还要考虑用什么标识作为该数据结构的键. 直观上看,Mysql中的数据都是 ...
- Flask web开发之路七
今天写SQLAlchemy数据库 首先介绍ORM的概念: ORM,Object类,Relationship:关系,Mapping:映射,也就是模型关系映射 flask-sqlalchemy是一套ORM ...
- Linux下部署多个Tomcat(完整)
Linux下部署多个Tomcat 1.环境:1.1.Centos 5.01.2.apache-tomcat-6.0.18 2.需要解决一下几个问题2.1.不同的tomcat启动和关闭监听不同的端口2. ...