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( ...
随机推荐
- [React] 04 - Intro: mongoDB becomes popular
Ref: Linux平台安装MongoDB - 菜鸟教程 安装:sudo apt-get install mongodb 安装完毕产生: ls /etc/init.d/mongodb 配置:vim / ...
- (转)使用 CJSON 在C语言中进行 JSON 的创建和解析的实例讲解
使用 CJSON 在C语言中进行 JSON 的创建和解析的实例讲解 本文用代码简单介绍cjson的使用方法,1)创建json,从json中获取数据.2)创建json数组和解析json数组 1. 创 ...
- E - TOYS
来源 poj 2318 Calculate the number of toys that land in each bin of a partitioned toy box. Mom and dad ...
- 网络通信协议三之TCP/IP模型详解
TCP/IP模型 注:PDU:Protocol Date Unit:表示对等层之间传递的数据单位 TCP:Transmission Control Protocol:传输控制协议 UDP:User D ...
- JavaScript----特效代码
1.不同时间段显示不同问候语 <Script Language="JavaScript"> <!-- var text=""; day = n ...
- 树剖||树链剖分||线段树||BZOJ4034||Luogu3178||[HAOI2015]树上操作
题面:P3178 [HAOI2015]树上操作 好像其他人都嫌这道题太容易了懒得讲,好吧那我讲. 题解:第一个操作和第二个操作本质上是一样的,所以可以合并.唯一值得讲的点就是:第二个操作要求把某个节点 ...
- sql的sp存储过程详解
store procedure (存储过程) http://www.cnblogs.com/xiangzhong/p/5038338.html 调优的几个关键的步骤--sp_lock,sp_who h ...
- eclipse安装Hadoop-0.20.2插件
因为在使用Hadoop-0.20.2这个古董,需要使用它自带的eclipse插件,而我最初安装的是现代的eclipse4.10.0. 在经历两天,以及以下种种尝试之后,均以失败告终: 1.网上找适合的 ...
- 自动化运维工具-pdsh工具安装配置及简单使用讲解
1.先决条件: 安装pssh工具的主机针对远程主机需要配置免秘钥认证: ssh-keygen -t rsa ssh-copy-id [remotehost] 2.下载pssh工具安装介质: https ...
- shell脚本之使用sed和awk进行文本处理
Shell这种脚本语言特点是,结果松散,场景复杂,针对于一些参数都有特殊意义.针对于大部分工程师而言,使用中的情况是你可能会经常忘记参数或其意义,使你不得不查阅man或网上寻求帮助.此篇文档作用就是在 ...