day8-------socket网络编程
简单的socket 一个server同时只能处理一个链接 代码如下:
server端代码
#author = ruixin li import socket
server = socket.socket()
server.bind(("0.0.0.0",5000))
server.listen(5)
print("开始监听")
while True:
conn,addr = server.accept()
print("一个新连接")
print(conn,addr)
while True:
try:
data = conn.recv(1024)
print("收到的信息:",data)
conn.send(data.upper())
except ConnectionResetError as e:
print("客户端主动断开连接")
break
server.close()
客户端程序 import socket cli = socket.socket()
cli.connect(("localhost",5000))
while True:
inp = input("请输入指令:".strip())
if len(inp) == 0:
continue
else:
cli.send(inp.encode())
data = cli.recv(1024)
print(data)
python socket 实现简单的 ssh 命令
#author ruixin li import socket
import subprocess
ips = input("请输入绑定的IP:")
ports = int(input("请输入绑定的端口:"))
server = socket.socket()
server.bind((ips,ports))
server.listen(5)
print("开始监听")
while True:
print("跳到外部循环")
conn,addr = server.accept()
print("一个新连接")
print(conn,addr)
while True:
try:
date = conn.recv(1024)
if len(date) == 0:
print("收到0信息,服务器主动断开连接")
break
else:
print("收到的信息:",date)
msg = subprocess.Popen(date,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
data = msg.stdout.read()
print(data)
dataerr = msg.stderr.read()
print("err:",dataerr)
if len(data) == 0:
conn.send(dataerr)
else:
conn.send(data)
except ConnectionResetError as e:
print("客户端主动断开连接")
break
server.close() 客户端
import socket
ips = input("请输入要连接的IP:")
ports = int(input("请输入要连接的端口:")) cli = socket.socket()
cli.connect((ips,ports))
while True:
inp = input("请输入指令:".strip())
if len(inp) == 0:
continue
else:
cli.send(inp.encode())
data = cli.recv(1024)
print(data)
socket 实现简单的FTP上传下载功能
#客户端代码
#author : ruixin li import socket
import hashlib
import os
#ips = input("请输入要连接的IP:")
#ports = int(input("请输入要连接的端口:")) print("说明:下载服务器文件到当前路径")
cli = socket.socket()
cli.connect(("localhost",5000))
while True:
inp = input("请输入指令: 按Q退出: ".strip())
if len(inp) == 0:
continue
elif inp == "q":
exit()
elif inp.split()[0] == "get":
inp_file_name = inp.split()[1]
cli.send(inp.encode())
tmp = cli.recv(1024).decode()
print("文件大小",tmp)
print(type(tmp))
remote_file_size = int(tmp)
print("服务端返回文件总大小:",remote_file_size)
local_size = 0
cli.send("收到大小,请发文件内容".encode())
file_name = inp.split()[1]
f = open(file_name.split("/")[-1] + ".new","wb")
while local_size < remote_file_size:
#f = open(file_name + ".new","wb")
data = cli.recv(1024)
f.write(data)
local_size += len(data)
# f.close()
print("文件总大小:",remote_file_size,"接收到:",local_size)
else:
print("文件下载完成,文件总大小:",remote_file_size,"接收到:",local_size)
f.close()
cli.send("请发送MD5".encode())
remote_md5 = cli.recv(1024).decode()
print("接收到服务端的MD5:",remote_md5)
f = open(file_name.split("/")[-1] + ".new", "rb")
m2 = hashlib.md5()
for i in f:
m2.update(i)
print("本地文件MD5",m2.hexdigest())
f.close()
if m2.hexdigest() == remote_md5 :
print("文件校验成功")
else:
print("文件下载不完整")
elif inp.split()[0] == "put":
inp_file_name = inp.split()[1]
cli.send(inp.encode()) if os.path.isfile(inp_file_name): put_file_size = str(os.stat(inp_file_name).st_size).encode()
cli.send(put_file_size)
tmp = cli.recv(1024)
print("等待确认",tmp.decode())
f = open(inp_file_name,"rb")
for line in f:
cli.send(line)
f.close()
print("文件发送完毕") cli.close() #服务端代码 import socket
import subprocess
import os
import hashlib
#ips = input("请输入绑定的IP:")
#ports = int(input("请输入绑定的端口:"))
server = socket.socket()
server.bind(("localhost",5000))
server.listen(5)
print("开始监听")
while True:
print("跳到外部循环")
conn,addr = server.accept()
print("一个新连接")
print(conn,addr)
while True:
date = conn.recv(1024)
if len(date) == 0:
print("收到0信息,服务器主动断开连接")
break
else:
print("收到的信息:",date)
args1,file_name = date.split()
print("第一个参数",args1.decode(),"第二个参数",file_name.decode())
if args1.decode() == "get":
print("走下载")
if os.path.isfile(file_name.decode()):
file_total_size = str(os.stat(file_name.decode()).st_size).encode()
print(file_total_size)
print(type(file_total_size))
conn.send(file_total_size)
conn.recv(1024)
print("等待客户端ack应答")
f = open(file_name.decode(),"rb")
m = hashlib.md5()
for line in f:
conn.send(line)
m.update(line)
hash_md5 = (m.hexdigest())
print("文件MD5:",hash_md5)
f.close()
print("文件发送完毕")
tmp = conn.recv(1024)
print(tmp.decode())
conn.send(hash_md5.encode())
else:
print("文件不存在")
continue
elif args1.decode() == "put":
print("开始上传文件")
# if os.path.isfile(file_name.decode().split("/")[-1]):
# print("文件已存在")
# conn.send("文件已存在".encode()) remote_file_size = int(conn.recv(1024).decode())
print("收到客户端文件大小:",remote_file_size)
put_file_size = 0
conn.send("可以发送数据了".encode())
f = open(file_name.decode().split("/")[-1],"wb")
while put_file_size < remote_file_size:
recv_data = conn.recv(1024)
f.write(recv_data)
put_file_size += len(recv_data)
f.close()
print("文件总大小:",remote_file_size,"接收到的大小",put_file_size)
day8-------socket网络编程的更多相关文章
- Python之旅Day8 socket网络编程
socket网络编程 Socket是网络编程的一个抽象概念.通常我们用一个Socket表示“打开了一个网络链接”,而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可.soc ...
- Linux Socket 网络编程
Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...
- Python Socket 网络编程
Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...
- Python全栈【Socket网络编程】
Python全栈[socket网络编程] 本章内容: Socket 基于TCP的套接字 基于UDP的套接字 TCP粘包 SocketServer 模块(ThreadingTCPServer源码剖析) ...
- python之Socket网络编程
什么是网络? 网络是由节点和连线构成,表示诸多对象及其相互联系.在数学上,网络是一种图,一般认为专指加权图.网络除了数学定义外,还有具体的物理含义,即网络是从某种相同类型的实际问题中抽象出来的模型.在 ...
- Python之路【第七篇】python基础 之socket网络编程
本篇文章大部分借鉴 http://www.cnblogs.com/nulige/p/6235531.html python socket 网络编程 一.服务端和客户端 BS架构 (腾讯通软件:ser ...
- Socket网络编程-基础篇
Socket网络编程 网络通讯三要素: IP地址[主机名] 网络中设备的标识 本地回环地址:127.0.0.1 主机名:localhost 端口号 用于标识进程的逻辑地址 有效端口:0~65535 其 ...
- Socket网络编程--FTP客户端
Socket网络编程--FTP客户端(1)(Windows) 已经好久没有写过博客进行分享了.具体原因,在以后说. 这几天在了解FTP协议,准备任务是写一个FTP客户端程序.直接上干货了. 0.了解F ...
- windows下的socket网络编程
windows下的socket网络编程 windows下的socket网络编程 clinet.c 客户端 server.c 服务器端 UDP通信的实现 代码如下 已经很久没有在windows下编程了, ...
- windows下的socket网络编程(入门级)
windows下的socket网络编程 clinet.c 客户端 server.c 服务器端 UDP通信的实现 代码如下 已经很久没有在windows下编程了,这次因为需要做一个跨平台的网络程序,就先 ...
随机推荐
- request.getParameter()、request.getInputStream()和request.getReader()
大家经常 用servlet和jsp,但是对 request.getInputStream()和request.getReader()比较陌生.request.getParameter()request ...
- POI操作Excel
POI和Excel简介 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作 ...
- python之最强王者(8)——字典(dictionary)
1.Python 字典(Dictionary) 字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包 ...
- 5.1 JS中Object类型
1.Object类型是引用类型中的一种. 2.创建Object实例(对象)的方式: 方式1:使用new操作符,后面跟上Object构造函数.如: var obj = new Object();//创建 ...
- Android中使用Notification实现进度通知栏(Notification示例三)
我们在使用APP的过程中,软件会偶尔提示我们进行版本更新,我们点击确认更新后,会在通知栏显示下载更新进度(已知长度的进度条)以及安装情况(不确定进度条),这就是我们今天要实现的功能.实现效果如下: 在 ...
- iOS开发系列--无限循环的图片浏览器
--UIKit之UIScrollView 概述 UIKit框架中有大量的控件供开发者使用,在iOS开发中不仅可以直接使用这些控件还可以在这些控件的基础上进行扩展打造自己的控件.在这个系列中如果每个控件 ...
- iOS 隐藏状态栏
1.整个项目隐藏状态栏 在Targets->General->勾选中Hide status bar . 整个项目隐藏状态栏 2.单个界面隐藏状态栏,例如登录注册页面 1.首先在info.p ...
- ASP.NET MVC Routing、Areas、URLs
webForm页面运行起来url一般是这样的:localhost:****/index.aspx,这个过程就是当你运行页面的时候,vs开发工具自带的微型服务器会打开你存在硬盘上的这个文件然后显示在浏览 ...
- 实时跟踪log变化的工具Apachetop
作为一个网站管理员,我们经常会有需要知道当前什么人正在访问我们的网站,谁正在频繁的抓取我们网站的内容,什么搜索引擎正在抓取我们网站?面对这些问题,我们虽然可以去查看log日志文件,但是却不能让我们实时 ...
- 将现有MySQL数据库改为大小写不敏感
用过MySQL的应该都会注意到,默认情况下,Linux下安装的MySQL是大小写敏感的,也就是说Table1和table1可以同时存在.而Windows下的MySQL却是大小写不敏感的,所有表名和数据 ...