socket模块

实现简单的远程连接:

客户端:

  1. import socket
  2. client = socket.socket()#声明socket类型,同时生成socke连接t对象
  3. client.connect(('localhost',969)) #连接到localhost主机的6969端口上去
  4. while True:
  5. msg = input(">>:").strip()
  6. if len(msg) == 0:continue
  7. client.send(msg.encode('utf-8'))#把编译成utf-8的数据发送出去
  8. data = client.recv(512)#接收数据
  9. print("从服务器接收到的数据为:",data.decode())
  10. client.close()

服务器端:

  1. import socket
  2. import os
  3. server = socket.socket()#声明socket类型,并且生成socket连接对象
  4. server.bind(('localhost',969))#把服务器绑定到localhost6969端口上
  5. server.listen(5)#开始监听
  6. print("等待连接中……")
  7. while True:
  8. conn,addr = server.accept()#接收连接
  9. print("***连接成功***")
  10. while True:
  11. data = conn.recv(512)#接收客户发来的数据
  12. print("接收到的命令为:",data)
  13. if not data:
  14. print("客户断开连接")
  15. break
  16. com = os.popen(data.decode()).read()#read()读取内存地址的内容
  17. print(data.decode())#输出结果为字符串dir
  18. print(os.popen(data.decode()))#输出结果为一个内存地址
  19. #py3 里socket发送的只有bytes,os.popen又只能接受str,所以要decode一下
  20. conn.sendall(com.encode('utf-8'))
  21. server.close()

稍微加强了下的远程连接:

客户端:

  1. import socket
  2. client = socket.socket()#声明socket类型并生产连接对象
  3. client.connect(('localhost',9999))#发起连接
  4. #循环输入指令
  5. while True:
  6. cmd = input('>>:').strip()
  7. if len(cmd) == 0: continue#如果输入为空则跳过本次循环,重新返回输入指令
  8. client.send(cmd.encode("utf-8"))#把字符串编译成比特流发送
  9. cmd_res_size = client.recv(1024)#接收服务器发来的指令内容比特流大小
  10. print("命令结果大小:",cmd_res_size)
  11. received_size = 0#接收到的大小为0
  12. received_data = b''#接收到的数据内容为空
  13. #根据接收到的数据大小,循环接受数据使其生成完整的内容再跳出循环
  14. while received_size < int(cmd_res_size.decode()):
  15. data = client.recv(1024)
  16. received_size += len(data)
  17. received_data += data
  18. #跳出循环后执行
  19. else:
  20. print("cmd res receive done……",received_size)
  21. print(received_data.decode())
  22.  
  23. client.close()

服务器端:

  1. import socket ,os
  2. server = socket.socket()#声明socket类型并生产连接对象
  3. server.bind(('localhost',9999))#绑定ipport
  4. server.listen()#监听
  5. print('等待连接……')
  6. #循环接入
  7. while True:
  8. conn,addr = server.accept()
  9. print('new conn:',addr)
  10. #循坏等待指令
  11. while True:
  12. print("等待新指令")
  13. data = conn.recv(1024)#接收比特流数据
  14. #没有接收到比特流数据,则无数据在传输即断开连接
  15. if not data:
  16. print("客户已经断开")
  17. break
  18. print("执行指令:",data)
  19. cmd_res = os.popen(data.decode()).read()#把比特流数据转为str,再执行指令,最后读取到内存赋值给变量cmd_res
  20. print("before send:",len(cmd_res))
  21. #判断cmd_res是否为 0,popen函数执行失败返回 0
  22. if len(cmd_res) == 0:
  23. cmd_res = "cmd has no output..."
  24. #cmd_res为字符串,.encode()后变为比特流,再用len计算出比特流的大小,再把这个整数转为字符串,最后转为比特流发送出去
  25. conn.send( str(len(cmd_res.encode())).encode("utf-8") )
  26. #把指令执行内容编译成比特流发送出去
  27. conn.send(cmd_res.encode("utf-8"))
  28. print("send done")
  29. server.close()

ftp客户端:

  1. import socket
  2. import hashlib
  3. client = socket.socket()
  4. client.connect(('localhost',))
  5. while True:
  6. cmd = input(">>: ").strip()
  7. if len(cmd) == :continue
  8. if cmd.startswith("get"):
  9. client.send(cmd.encode())
  10. server_response = client.recv()
  11. print("server response: ",server_response)
  12. client.send(b"ready to recv file")
  13. file_total_size = int(server_response.decode())
  14. received_size =
  15. filename = cmd.split()[]
  16. f = open(filename + ".new","wb")
  17. m = hashlib.md5()
  18.  
  19. while received_size < file_total_size:
  20. if file_total_size - received_size > :
  21. size =
  22. else:
  23. size = file_total_size -received_size
  24. print("last received:",size)
  25.  
  26. data = client.recv(size)
  27. received_size += len(data)
  28. m.update(data)
  29. f.write(data)
  30. else:
  31. new_file_md5 = m.hexdigest()
  32. print("file recv done",received_size,file_total_size)
  33. f.close()
  34. server_file_md5 = client.recv()
  35. print("server file md5: ",server_file_md5)
  36. print("client file md5: ",new_file_md5)
  37. client.close()

ftp服务器端:

  1. import socket,os
  2. import hashlib
  3. server = socket.socket()
  4. server.bind(('0.0.0.0',9999))
  5. server.listen(5)
  6. print("等待连接....")
  7. while True:
  8. conn,addr = server.accept()
  9. print("连接成功....")
  10. while True:
  11. print("等待指令")
  12. data = conn.recv(1024)
  13. if not data:
  14. print("客户端已断开")
  15. break
  16. cmd,filename = data.decode().split()
  17. print(filename)
  18. if os.path.isfile(filename):
  19. f = open(filename,"rb")
  20. m = hashlib.md5()
  21. file_size = os.stat(filename).st_size
  22. conn.send( str(file_size).encode() )
  23. conn.recv(1024)#wait for ack
  24. for line in f:
  25. m.update(line)
  26. conn.send(line)
  27. print("file md5",m.hexdigest())
  28. f.close()
  29. conn.send(m.hexdigest().encode())
  30. print("文件发送完毕....")
  31. server.close()


socketserver模块

实现简单的连接:

客户端:

  1. import socket
  2. client = socket.socket()
  3. client.connect(('localhost',9999))
  4. while True:
  5. cmd = input(">>:").strip()
  6. if len(cmd) == 0:continue
  7. client.send(cmd.encode('utf-8'))
  8. data = client.recv(10240)
  9. print("从服务器接受到的数据:",data.decode())
  10.  
  11. client.close()

服务器端:

  1. import socketserver
  2. class MyTCPHandler(socketserver.BaseRequestHandler):
  3. def handle(self):
  4. while True:
  5. try:
  6. self.data = self.request.recv(1024).strip()
  7. if not self.data:
  8. print("客户已断开")
  9. break
  10. print("{} wrote:".format(self.client_address[0]))
  11. print(self.data)
  12. self.request.send(self.data.upper())
  13. except ConnectionResetError as e:
  14. print("Error:",e)
  15. break
  16.  
  17. if __name__ == "__main__":
  18. HOST,PORT = "localhost",9999
  19. server = socketserver.TCPServer((HOST,PORT),MyTCPHandler)
  20. 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. nginx expires配置

    配置expiresexpires起到控制页面缓存的作用,合理的配置expires可以减少很多服务器的请求要配置expires,可以在http段中或者server段中或者location段中加入   1 ...

  2. MySQL大数据量分页性能优化

    mysql大数据量使用limit分页,随着页码的增大,查询效率越低下. 测试实验 1.   直接用limit start, count分页语句, 也是我程序中用的方法: select * from p ...

  3. Artech的MVC4框架学习——第一章初步认识ASP.NET MVC

    前言: Artech觉得掌握ASP.NET MVC具有三个层次. 第一层了解基本的编程模式,掌握Controller和View的定义方式,知道路由如何注册以及验证规则如何定义. 第二个层次要求我们对A ...

  4. 【转】Windows socket基础

    转自:http://blog.csdn.net/ithzhang/article/details/8448655 Windows socket 基础 Windows socket是一套在Windows ...

  5. 使用zsh 替换 bash

    摘自:http://macshuo.com/?p=676#wechat_redirect Shell是Linux/Unix的一个外壳,你理解成衣服也行.它负责外界与Linux内核的交互,接收用户或其他 ...

  6. 'cmd' 不是内部或外部命令,也不是可运行的程序 或批处理文件.

    添加path内容: %SystemRoot%\system32; %SystemRoot%; %SystemRoot%\System32\Wbem;

  7. [分布式系统学习]阅读笔记 Distributed systems for fun and profit 之三 时间和顺序

    这是阅读 http://book.mixu.net/distsys/time.html 的笔记,是该系列的第三章. 为什么时间和顺序很重要呢?为什么我们关系事件A发生在事件B之前? 因为分布式系统要解 ...

  8. JavaEE Servlet 学习笔记

    一.Servlet概述 1.什么是Servlet Servlet是一个运行在服务器端的Java小程序,通过HTTP协议用于接收来自客户端请求,并发出响应. 2.Servlet中的方法 public v ...

  9. 洛谷P2698 花盆Flowerpot【单调队列】

    题目描述 Farmer John has been having trouble making his plants grow, and needs your help to water them p ...

  10. Django数据库相关操作

    首先,在settings.py中加入应用的名称,让数据库知道使用的是哪个应用,然后给那个应用创建表. 在settings.py中配置数据库相关参数,默认使用sqlite3不用配置 编辑models.p ...