1.socketserver模块:

  socketserver,它提供了服务器中心类,可简化网络服务器的开发,内部使用IO多路复用以及“多线程”和“多进程”,从而实现并发处理多个客户端请求的socket服务端。即,每个客服端请求连接到服务器时,socket服务端都会在服务器上创建一个“线程”或“进程”专门负责处理当前客户端的所有请求。

2.socketserver的ThreadingTCPServer类:

  ThreadingTCPServer实现的socket服务器内部会为每个client创建一个“线程”,该线程用来和客户端就行交互

  使用方法
  1、创建一个继承socketserver.BaseRequestHandler的类
  2、类中必须重写一个名为handler的方法
  3、实例化一个服务器类,传入服务器地址和请求处理程序类
  4、调用serve_forever()事件循环监听

3.socketserver代码示例:

  1. import socketserver
  2.  
  3. class Myserver(socketserver.BaseRequestHandler):
  4.  
  5. def handle(self): # 必须有handle方法
  6. while 1:
  7. from_client_msg = self.request.recv(1024) # self.request 相当于conn连接通道
  8. print(from_client_msg.decode('utf-8'))
  9. server_msg = input('服务端>>>').encode('utf-8')
  10. self.request.send(server_msg)
  11.  
  12. if __name__ == '__main__':
  13. ip_port = ('127.0.0.1',8086)
  14.  
  15. # server是socketserver模块的ThreadingTCPServer类的实例化对象
  16. server = socketserver.ThreadingTCPServer(ip_port,Myserver) # 固定写法 ip_port和上面创建的类
  17. server.serve_forever() # server对象调用一个serve_forever方法循环监听

服务端

  1. import socket
  2. import time
  3.  
  4. client = socket.socket()
  5. client.connect(('127.0.0.1',8086))
  6.  
  7. while 1:
  8. msg = input('客户端>>>')
  9. # time.sleep(1)
  10. client.send(msg.encode('utf-8'))
  11.  
  12. from_server_msg = client.recv(1024).decode('utf-8')
  13. print(from_server_msg)
  14.  
  15. client.close()

客户端

4.socket的方法补充:

  1. '''
  2. 服务端套接字函数
  3. s.bind() 绑定(主机,端口号)到套接字
  4. s.listen() 开始TCP监听
  5. s.accept() 被动接受TCP客户的连接,(阻塞式)等待连接的到来
  6.  
  7. 客户端套接字函数
  8. s.connect() 主动初始化TCP服务器连接
  9. s.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常
  10.  
  11. 公共用途的套接字函数
  12. s.recv() 接收TCP数据
  13. s.send() 发送TCP数据
  14. s.sendall() 发送TCP数据
  15. s.recvfrom() 接收UDP数据
  16. s.sendto() 发送UDP数据
  17. s.getpeername() 连接到当前套接字的远端的地址
  18. s.getsockname() 当前套接字的地址
  19. s.getsockopt() 返回指定套接字的参数
  20. s.setsockopt() 设置指定套接字的参数
  21. s.close() 关闭套接字
  22.  
  23. 面向锁的套接字方法
  24. s.setblocking() 设置套接字的阻塞与非阻塞模式
  25. s.settimeout() 设置阻塞套接字操作的超时时间
  26. s.gettimeout() 得到阻塞套接字操作的超时时间
  27.  
  28. 面向文件的套接字的函数
  29. s.fileno() 套接字的文件描述符
  30. s.makefile() 创建一个与该套接字相关的文件
  31. '''

5.ftp简易上传练习:

  1. import socket
  2.  
  3. def send_file_client(new_conn,client_addr):
  4. # 接收客户端要下载的文件名
  5. file_name = new_conn.recv(1024).decode('utf-8')
  6. print("客户端%s需要下载的文件是:%s"%(str(client_addr),file_name))
  7.  
  8. # 打开文件读取数据
  9. file_content = None
  10. try:
  11. with open(file_name,"rb") as f:
  12. file_content = f.read()
  13.  
  14. except Exception as e:
  15. print('没有要下载的文件%s' % file_name)
  16.  
  17. # 发送文件数据给客户端
  18. if file_content:
  19. new_conn.send(file_content)
  20. return
  21.  
  22. def main():
  23. file_server = socket.socket()
  24. ip_port = ('127.0.0.1',8086)
  25. file_server.bind(ip_port)
  26. file_server.listen()
  27.  
  28. while 1:
  29. new_conn,client_addr = file_server.accept()
  30. # 调用发送文件函数
  31. send_file_client(new_conn,client_addr)
  32. new_conn.close()
  33.  
  34. file_server.close()
  35.  
  36. if __name__ == '__main__':
  37. main()

server

  1. import socket
  2.  
  3. def main():
  4. file_client = socket.socket()
  5. # 获取ip port
  6. server_ip = input('请输入服务器ip:')
  7. server_port = input('请输入下载的port:')
  8. # 连接服务器
  9. file_client.connect((server_ip,int(server_port)))
  10.  
  11. # 获取文件名 发给服务器
  12. down_file_name = input("请输入要下载的文件名字:")
  13. file_client.send(down_file_name.encode('utf-8'))
  14.  
  15. # 接收发来的数据写入新文件
  16. content = file_client.recv(1024*1024).decode('utf-8')
  17. with open('new'+down_file_name,'w') as f:
  18. f.write(content)
  19.  
  20. file_client.close()
  21.  
  22. if __name__ == '__main__':
  23. main()

client

第二十九天- socketserver模块 ftp上传的更多相关文章

  1. python 网络编程粘包解决方案2 + ftp上传 + socketserver

    一.struct 神奇的打包工具 struct 代码: import struct num = 156 #将int类型的数据打包成4个字节的数据 num_stru = struct.pack('i', ...

  2. 网络编程----socketserver多并发实现、FTP上传多并发、udp协议套接字多并发

    一.socketserver多并发                                                              基于tcp的套接字,关键就是两个循环,一个 ...

  3. 网络编程4 网络编程之FTP上传简单示例&socketserver介绍&验证合法性连接

    今日大纲: 1.FTP上传简单示例(详细代码) 2.socketserver简单示例&源码介绍 3.验证合法性连接//[秘钥加密(urandom,sendall)(注意:中文的!不能用)] 内 ...

  4. 孤荷凌寒自学python第二十九天python的datetime.time模块

     孤荷凌寒自学python第二十九天python的datetime.time模块 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) datetime.time模块是专门用来表示纯时间部分的类. ...

  5. 在附件管理模块中增加对FTP 上传和预览的支持

    在之前介绍的附件管理模块里面<Winform开发框架之通用附件管理模块>以及<Winform开发框架之附件管理应用>,介绍了附件的管理功能,通过对数据库记录的处理和文件的管理, ...

  6. python之模块ftplib(实现ftp上传下载代码)

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python之模块ftplib(实现ftp上传下载代码) #需求:实现ftp上传下载代码(不含错误处理) f ...

  7. python socketserver ftp上传功能

    一.socketserver用于多个客户端访问同一个服务端 客户端 import socket client = socket.socket() ip_port = ('127.0.0.1',8001 ...

  8. FTP上传文件到服务器

    一.初始化上传控件. 1.我们这里用dropzone.js作为上传控件,下载地址http://www.dropzonejs.com/ 2.这里我们使用一个div元素作为dropzone载体. < ...

  9. JAVA 实现FTP上传下载(sun.net.ftp.FtpClient)

    package com.why.ftp; import java.io.DataInputStream; import java.io.File; import java.io.FileInputSt ...

随机推荐

  1. powerDesigner 把name项添加到注释(comment)

    第一次写博客,分享一点经验吧,平时大家用powerDesigner的时候,pd是不会把name项默认添加到comment的,所以生成的数据库表里面也没有中文字段的注释. 我在网上查了一下.有解决方案了 ...

  2. 不同Mesh技术的比较-总结版

    引言 在过去的几年里,Mesh 网络逐渐变得流行,随之会有越来越多的无线产品面世.Mesh 网络技术作为一种无线自组网技术是物联网的核心技术.物联网的概念现在也逐渐贴近人们的生活, 据预测 2011 ...

  3. Liferay开发实战(2):Service Builder生成持久化层,及开发服务层

    本文Liferay适用版本:v6.2.ce-ga6版 Liferay的插件体系是:模型-视图-控制器的portlet MVC框架.MVC是一个伟大的用于Web应用程序的设计模式,在实际应用中还应处理持 ...

  4. 基于cytoscape.js 、 d3.js实现的关系图谱初级版本

    前面的文章已经介绍了cytoscape.js . d3.js的安装及简单demo,现在展示从html页面转移到vue项目下的最初版的demo 效果图: 代码如下: <template> & ...

  5. javascript数据结构与算法--高级排序算法(快速排序法,希尔排序法)

    javascript数据结构与算法--高级排序算法(快速排序法,希尔排序法) 一.快速排序算法 /* * 这个函数首先检查数组的长度是否为0.如果是,那么这个数组就不需要任何排序,函数直接返回. * ...

  6. 使用Dump转储文件排查线上环境服务未知问题

    利用Dump转储文件获取正式环境程序堆栈状态 服务异常找不到原因时,我们通常通过重新启动服务来尝试解决问题,但是在决定重启之前,请不要立刻重启Windows服务或站点 重启服务会让当前案发现场的内存证 ...

  7. 继承extends、super、this、方法重写overiding、final、代码块_DAY08

    1:Math类的随机数(掌握) 类名调用静态方法.  包:java.lang 类:Math 方法:public static double random(): Java.lang包下的类是不用导包就可 ...

  8. 无监督学习——K-均值聚类算法对未标注数据分组

    无监督学习 和监督学习不同的是,在无监督学习中数据并没有标签(分类).无监督学习需要通过算法找到这些数据内在的规律,将他们分类.(如下图中的数据,并没有标签,大概可以看出数据集可以分为三类,它就是一个 ...

  9. [转]php实时输出内容

    b开发中有没有碰到需要适时的将结果输出到浏览器页面而不刷新整个页面的需求呢?当你在处理一个过程需要耗时很长,但你又需要适时的知道程序当前的处理状况的时候,该怎么办呢?下面就分享一下如何使用php及时的 ...

  10. SVM(支持向量机)简介与基础理解

    SVM(支持向量机)主要用于分类问题,主要的应用场景有字符识别.面部识别.行人检测.文本分类等领域.原文地址:https://zhuanlan.zhihu.com/p/21932911?refer=b ...