人生苦短之我用Python篇(socket编程)
socket模块
实现简单的远程连接:
客户端:
import socket
client = socket.socket()#声明socket类型,同时生成socke连接t对象
client.connect(('localhost',969)) #连接到localhost主机的6969端口上去
while True:
msg = input(">>:").strip()
if len(msg) == 0:continue
client.send(msg.encode('utf-8'))#把编译成utf-8的数据发送出去
data = client.recv(512)#接收数据
print("从服务器接收到的数据为:",data.decode())
client.close()
服务器端:
import socket
import os
server = socket.socket()#声明socket类型,并且生成socket连接对象
server.bind(('localhost',969))#把服务器绑定到localhost的6969端口上
server.listen(5)#开始监听
print("等待连接中……")
while True:
conn,addr = server.accept()#接收连接
print("***连接成功***")
while True:
data = conn.recv(512)#接收客户发来的数据
print("接收到的命令为:",data)
if not data:
print("客户断开连接")
break
com = os.popen(data.decode()).read()#read()读取内存地址的内容
print(data.decode())#输出结果为字符串dir
print(os.popen(data.decode()))#输出结果为一个内存地址
#py3 里socket发送的只有bytes,os.popen又只能接受str,所以要decode一下
conn.sendall(com.encode('utf-8'))
server.close()
稍微加强了下的远程连接:
客户端:
import socket
client = socket.socket()#声明socket类型并生产连接对象
client.connect(('localhost',9999))#发起连接
#循环输入指令
while True:
cmd = input('>>:').strip()
if len(cmd) == 0: continue#如果输入为空则跳过本次循环,重新返回输入指令
client.send(cmd.encode("utf-8"))#把字符串编译成比特流发送
cmd_res_size = client.recv(1024)#接收服务器发来的指令内容比特流大小
print("命令结果大小:",cmd_res_size)
received_size = 0#接收到的大小为0
received_data = b''#接收到的数据内容为空
#根据接收到的数据大小,循环接受数据使其生成完整的内容再跳出循环
while received_size < int(cmd_res_size.decode()):
data = client.recv(1024)
received_size += len(data)
received_data += data
#跳出循环后执行
else:
print("cmd res receive done……",received_size)
print(received_data.decode()) client.close()
服务器端:
import socket ,os
server = socket.socket()#声明socket类型并生产连接对象
server.bind(('localhost',9999))#绑定ip和port
server.listen()#监听
print('等待连接……')
#循环接入
while True:
conn,addr = server.accept()
print('new conn:',addr)
#循坏等待指令
while True:
print("等待新指令")
data = conn.recv(1024)#接收比特流数据
#没有接收到比特流数据,则无数据在传输即断开连接
if not data:
print("客户已经断开")
break
print("执行指令:",data)
cmd_res = os.popen(data.decode()).read()#把比特流数据转为str,再执行指令,最后读取到内存赋值给变量cmd_res
print("before send:",len(cmd_res))
#判断cmd_res是否为 0,popen函数执行失败返回 0
if len(cmd_res) == 0:
cmd_res = "cmd has no output..."
#cmd_res为字符串,.encode()后变为比特流,再用len计算出比特流的大小,再把这个整数转为字符串,最后转为比特流发送出去
conn.send( str(len(cmd_res.encode())).encode("utf-8") )
#把指令执行内容编译成比特流发送出去
conn.send(cmd_res.encode("utf-8"))
print("send done")
server.close()
ftp客户端:
import socket
import hashlib
client = socket.socket()
client.connect(('localhost',))
while True:
cmd = input(">>: ").strip()
if len(cmd) == :continue
if cmd.startswith("get"):
client.send(cmd.encode())
server_response = client.recv()
print("server response: ",server_response)
client.send(b"ready to recv file")
file_total_size = int(server_response.decode())
received_size =
filename = cmd.split()[]
f = open(filename + ".new","wb")
m = hashlib.md5() while received_size < file_total_size:
if file_total_size - received_size > :
size =
else:
size = file_total_size -received_size
print("last received:",size) data = client.recv(size)
received_size += len(data)
m.update(data)
f.write(data)
else:
new_file_md5 = m.hexdigest()
print("file recv done",received_size,file_total_size)
f.close()
server_file_md5 = client.recv()
print("server file md5: ",server_file_md5)
print("client file md5: ",new_file_md5)
client.close()
ftp服务器端:
import socket,os
import hashlib
server = socket.socket()
server.bind(('0.0.0.0',9999))
server.listen(5)
print("等待连接....")
while True:
conn,addr = server.accept()
print("连接成功....")
while True:
print("等待指令")
data = conn.recv(1024)
if not data:
print("客户端已断开")
break
cmd,filename = data.decode().split()
print(filename)
if os.path.isfile(filename):
f = open(filename,"rb")
m = hashlib.md5()
file_size = os.stat(filename).st_size
conn.send( str(file_size).encode() )
conn.recv(1024)#wait for ack
for line in f:
m.update(line)
conn.send(line)
print("file md5",m.hexdigest())
f.close()
conn.send(m.hexdigest().encode())
print("文件发送完毕....")
server.close()
socketserver模块
实现简单的连接:
客户端:
import socket
client = socket.socket()
client.connect(('localhost',9999))
while True:
cmd = input(">>:").strip()
if len(cmd) == 0:continue
client.send(cmd.encode('utf-8'))
data = client.recv(10240)
print("从服务器接受到的数据:",data.decode()) client.close()
服务器端:
import socketserver
class MyTCPHandler(socketserver.BaseRequestHandler):
def handle(self):
while True:
try:
self.data = self.request.recv(1024).strip()
if not self.data:
print("客户已断开")
break
print("{} wrote:".format(self.client_address[0]))
print(self.data)
self.request.send(self.data.upper())
except ConnectionResetError as e:
print("Error:",e)
break if __name__ == "__main__":
HOST,PORT = "localhost",9999
server = socketserver.TCPServer((HOST,PORT),MyTCPHandler)
server.serve_forever()
人生苦短之我用Python篇(socket编程)的更多相关文章
- 转:Python 的 Socket 编程教程
这是用来快速学习 Python Socket 套接字编程的指南和教程.Python 的 Socket 编程跟 C 语言很像. Python 官方关于 Socket 的函数请看 http://docs. ...
- Python 3 socket 编程
Python 3 socket编程 一 客户端/服务器架构 互联网中处处是C/S架构 1.C/S结构,即Client/Server(客户端/服务器)结构 2.在互联网中处处可见c/s架构 比如说浏览器 ...
- 最基础的Python的socket编程入门教程
最基础的Python的socket编程入门教程 本文介绍使用Python进行Socket网络编程,假设读者已经具备了基本的网络编程知识和Python的基本语法知识,本文中的代码如果没有说明则都是运行在 ...
- python之socket编程(一)
socket之前我们先来熟悉回忆几个知识点. OSI七层模型 OSI(Open System Interconnection)参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标 ...
- Python:socket编程教程
ocket是基于C/S架构的,也就是说进行socket网络编程,通常需要编写两个py文件,一个服务端,一个客户端. 首先,导入Python中的socket模块: import socket Pytho ...
- python学习------socket编程
一 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构 互联网中处处是C/S架构 如黄色网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种) 腾讯作为服务端为你提供视频 ...
- Python基础socket编程
Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 SocketServer, 它提供了服务器中心类,可以简化网络 ...
- Python(socket编程——1、理论)
Socket的英文原义是“孔”或“插座”.作为BSD UNIX的进程通信机制,取后一种意思.通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机 ...
- Python基础-socket编程
一.网络编程 自从互联网诞生以来,现在基本上所有的程序都是网络程序,很少有单机版的程序了. 计算机网络就是把各个计算机连接到一起,让网络中的计算机可以互相通信.网络编程就是如何在程序中实现两台计算机的 ...
- Python菜鸟之路:Python基础-Socket编程-2
在上节socket编程中,我们介绍了一些TCP/IP方面的必备知识,以及如何通过Python实现一个简单的socket服务端和客户端,并用它来解决“粘包”的问题.本章介绍网络编程中的几个概念:多线程. ...
随机推荐
- 使用spring提供的ReflectionUtils简化项目中反射代码的复杂性
在项目中有时候我们会使用到反射的功能,如果使用最原始的方法来开发反射的功能的话肯能会比较复杂,需要处理一大堆异常以及访问权限等问题.spring中提供了ReflectionUtils 这个反射的工具类 ...
- “找女神要QQ号码”——java篇
题目就是这样的: 给了一串数字(不是QQ号码),根据下面规则可以找出QQ号码: 首先删除第一个数,紧接着将第二个数放到这串数字的末尾,再将第三个数删除,并将第四个数放到这串数字的末尾...... 如此 ...
- Unity3D笔记 GUI 四、实现选项卡三
一.代码: using UnityEngine; using System.Collections; /// <summary> /// 选项卡二 /// </summary> ...
- Penn Treebank
NLP中常用的PTB语料库,全名Penn Treebank.Penn Treebank是一个项目的名称,项目目的是对语料进行标注,标注内容包括词性标注以及句法分析. 语料来源为:1989年华尔街日报语 ...
- yii---获取当前sql语句
我们在用YII开发项目的时候,会查看当前执行的SQL语句来排查错误,那么YII该如何获取当前的SQL语句呢? $list = user::find()->where(['title'=>$ ...
- yii的安装
1.安装composer windows系统直接下载Composer-Setup.exe 运行安装. 2.安装Composer asset plugin composer安装完成后,在一个可通过web ...
- 7.19python昨日复习和多线程(2)
2018-7-19 21:39:49 我觉得这次的笔记是非常非常完美的!!!明天继续 睡觉去啦! 傍黑时候和晴宝打电话,她特能说,很喜欢这种感觉,有好多东西要和你分享! 1.复习! # !/usr/b ...
- 170816、nginx常用配置说明
#user nobody; #开启进程数 <=CPU数 worker_processes 1; #错误日志保存位置 #error_log logs/error.log; #error_log ...
- OpenCV学习笔记之课后习题练习2-5
5.对练习4中的代码进行修改,参考例2-3,给程序加入滚动条,使得用户可以动态调节缩放比例,缩放比例的取值为2-8之间.可以跳过写入磁盘操作,但是必须将变换结果显示在窗口中. 参考博文:blog.cs ...
- iOS常用基础框架
一,简述 1.1,IOS操作系统的层次架构 iOS为应用程序开发提供了许多可使用的框架,并构成IOS操作系统的层次架构,分为四层,从上到下依次为:Cocoa Touch Layer( ...