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编程)的更多相关文章

  1. 转:Python 的 Socket 编程教程

    这是用来快速学习 Python Socket 套接字编程的指南和教程.Python 的 Socket 编程跟 C 语言很像. Python 官方关于 Socket 的函数请看 http://docs. ...

  2. Python 3 socket 编程

    Python 3 socket编程 一 客户端/服务器架构 互联网中处处是C/S架构 1.C/S结构,即Client/Server(客户端/服务器)结构 2.在互联网中处处可见c/s架构 比如说浏览器 ...

  3. 最基础的Python的socket编程入门教程

    最基础的Python的socket编程入门教程 本文介绍使用Python进行Socket网络编程,假设读者已经具备了基本的网络编程知识和Python的基本语法知识,本文中的代码如果没有说明则都是运行在 ...

  4. python之socket编程(一)

    socket之前我们先来熟悉回忆几个知识点. OSI七层模型 OSI(Open System Interconnection)参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标 ...

  5. Python:socket编程教程

    ocket是基于C/S架构的,也就是说进行socket网络编程,通常需要编写两个py文件,一个服务端,一个客户端. 首先,导入Python中的socket模块: import socket Pytho ...

  6. python学习------socket编程

    一 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构 互联网中处处是C/S架构 如黄色网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种) 腾讯作为服务端为你提供视频 ...

  7. Python基础socket编程

    Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 SocketServer, 它提供了服务器中心类,可以简化网络 ...

  8. Python(socket编程——1、理论)

    Socket的英文原义是“孔”或“插座”.作为BSD UNIX的进程通信机制,取后一种意思.通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机 ...

  9. Python基础-socket编程

    一.网络编程 自从互联网诞生以来,现在基本上所有的程序都是网络程序,很少有单机版的程序了. 计算机网络就是把各个计算机连接到一起,让网络中的计算机可以互相通信.网络编程就是如何在程序中实现两台计算机的 ...

  10. Python菜鸟之路:Python基础-Socket编程-2

    在上节socket编程中,我们介绍了一些TCP/IP方面的必备知识,以及如何通过Python实现一个简单的socket服务端和客户端,并用它来解决“粘包”的问题.本章介绍网络编程中的几个概念:多线程. ...

随机推荐

  1. java 程序运行的基础知识【Java bytecode】

    聊聊文字,写一篇关于 java 基础知识的博文. JVM 线程栈 到 函数运行 每一个JVM线程来说启动的时候都会创建一个私有的线程栈.一个jvm线程栈用来存储栈帧,jvm线程栈和C语言中的栈很类似, ...

  2. 【转】bit、byte、位、字节、汉字的关系

    UTF-8和UTF-16的区别?Unicode和UTF是什么关系?Unicode转义字符(\u+4个十六进制).遇到多个引号的时候转义? 解释: unicode是一种编码方式,和ascii是同一个概念 ...

  3. yii---模型的创建

    在 model/ 路径新建 Test.php 模型 我们类的名称一定要与数据表的名称相同. 继承 yii\db\ActiveRecord 类: 在模型类中 声明 tableName() 指定表名 // ...

  4. CvArr* to cv::Mat 转换

    OpenCV中的CvArr*的定义的一个空类型的指针,可以转换为其派生类CvMat和IplImage,那么如何将其转化为cv::Mat呢,其实很简单,只需要一行代码即可: // CvArr *_img ...

  5. Save vtkMatrix4x4 to a file 保存到文件

    vtkMatrix4x4是VTK中的一个表示4x4矩阵的一种数据结构,有时候我们想把其保存到一个文件中,那么可以使用如下的代码: void writeVtkMatrix4x4ToFile(const ...

  6. table中强制不换行

    总是一些文章说要强制换行,很少提到说如何不换行. 一般都会使用word-break: keep-all;使得强制不换行. HTML <!DOCTYPE html PUBLIC "-// ...

  7. TFS二次开发10——分组(Group)和成员(Member)

    TFS SDK 10 ——分组(Group)和成员(Member) 这篇来介绍怎样读取TFS服务器上的用户信息 首先TFS默认有如下分组(Group): SharePoint Web Applicat ...

  8. TFS二次开发04——工作区(Workspace)和映射(Mapping)

    在前面几节介绍了怎样读取TFS服务器上的项目以及文件的信息,这一节将介绍怎么建立服务器和本地的映射(Mapping). 引用命名空间 usingMicrosoft.TeamFoundation.Cli ...

  9. CSU 1804 - 有向无环图 - [(类似于)树形DP]

    题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1804 Bobo 有一个 n 个点,m 条边的有向无环图(即对于任意点 v,不存在从点 ...

  10. 关于matlab小记

    目录: 1.函数取整 2.数据显示格式 3.三角函数运算 4.矩阵运算 5.函数句柄 6.二维函数图像绘制 7.符号对象 8.关于微积分 9.关于逻辑语句 10.关于运算符 ───────────── ...