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. Word 2013无法启用Restrict Editing解决方法

    当前文档可能是Mail Merge Letter type document,MAILINGS -> Start Mail Merge -> Normal Word Document保存即 ...

  2. ASP.NET Cookie概念、CURD操作、原理、实际运用

    会话就WEB开发来说,一个会话就是你通过浏览器与服务器之间的一次通话,只不过这种通话是以用浏览器浏览的方式来实现的. 就会话的应用来说,一般会话是用来识别用户的,比如你可以使用会话级变量记录当前用户已 ...

  3. 解决-Dmaven.multiModuleProjectDirectory system property is not set. Check $M2_HOME environment variabl

    1.添加M2_HOME的环境变量 2.Preference->Java->Installed JREs->Edit 选择一个jdk, 添加  -Dmaven.multiModuleP ...

  4. CentOS 6安装并开启telnet服务

    一.安装telnet yum install telnet telnet-server //安装telnet server捎带手把客户端也装了 二.配置xinetd telnet server默认会安 ...

  5. undefined类型

    undefined类型 只有一个特殊的值 undefined   在使用var声明变量但未对其加以初始化,这个变量的值就是undefined 值是undefined的情况: 1.显示声明并初始化变量值 ...

  6. backBone.js初识

    一.单页面应用 1.单页面应用(single-page application :SPA),是指在浏览器中运行的应用,在使用期间不会重新加载页面. 2.它所有的活动局限于一个Web页面,仅在初始化加载 ...

  7. 远程服务器git搭建

    在远程服务器如:/var/www下创建hello.git 然后git init --bare hello.git cd hello.git会看到下面的目录和文件 然后创建可以访问git的用户 git ...

  8. PowerDesigner 把Comment/name 互转

    转载:https://www.cnblogs.com/cxd4321/archive/2009/03/07/1405475.html 在使用PowerDesigner对数据库进行概念模型和物理模型设计 ...

  9. 第九次CSP第四题 - 压缩编码

    给定一段文字,已知单词a1, a2, …, an出现的频率分别t1, t2, …, tn.可以用01串给这些单词编码,即将每个单词与一个01串对应,使得任何一个单词的编码(对应的01串)不是另一个单词 ...

  10. MySQL InnoDB的存储结构总结

    从物理意义上来讲,InnoDB表由共享表空间.日志文件组(redo文件组).表结构定义文件组成.若将innodb_file_per_table设置为on,则系统将为每一个表单独的生成一个table_n ...