还是那个题目(题目和流程见java版本),感觉光用java写一点新意也没有,恰巧刚学习了python,何不拿来一用,呵呵:

服务器端:

import SocketServer, time

class MyServer(SocketServer.BaseRequestHandler):

userInfo = {

'yangsq' : 'yangsq',

'hudeyong' : 'hudeyong',

'mudan' : 'mudan' }

def handle(self):

print 'Connected from', self.client_address

while True:

receivedData = self.request.recv(8192)

if not receivedData:

continue

elif receivedData == 'Hi, server':

self.request.sendall('hi, client')

elif receivedData.startswith('name'):

self.clientName = receivedData.split(':')[-1]

if MyServer.userInfo.has_key(self.clientName):

self.request.sendall('valid')

else:

self.request.sendall('invalid')

elif receivedData.startswith('pwd'):

self.clientPwd = receivedData.split(':')[-1]

if self.clientPwd == MyServer.userInfo[self.clientName]:

self.request.sendall('valid')

time.sleep(5)

sfile = open('PyNet.pdf', 'rb')

while True:

data = sfile.read(1024)

if not data:

break

while len(data) > 0:

intSent = self.request.send(data)

data = data[intSent:]

time.sleep(3)

self.request.sendall('EOF')

else:

self.request.sendall('invalid')

elif receivedData == 'bye':

break

self.request.close()

print 'Disconnected from', self.client_address

print

if __name__ == '__main__':

print 'Server is started\nwaiting for connection...\n'

srv = SocketServer.ThreadingTCPServer(('localhost', 50000), MyServer)

srv.serve_forever()

说明:

line-55到line-58的作用就相当于java中某个类里面的main函数,即一个类的入口。

python中SocketServer module里提供了好多实用的现成的类,BaseRequestHandler就是一个,它的作用是为每一个请求fork一个线程,只要继承它,就有这个能力了,哈哈,真是美事。

当然,我们继承了BaseRequestHandler,就是override它的handle方法,就像java中继承了Thread后要实现run方法一样。实际上这个handle方法的内容和我们的java版本的run函数实现的完全一样。

line-30到line-43就是处理文件下载的主要内容了。看着都挺眼熟的呵:)

这里在文件发送完后发了一个“EOF”,告诉client文件传完了。

客户端:

import socket, time

class MyClient:

def __init__(self):

print 'Prepare for connecting...'

def connect(self):

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

sock.connect(('localhost', 50000))

sock.sendall('Hi, server')

self.response = sock.recv(8192)

print 'Server:', self.response

self.s = raw_input("Server: Do you want get the 'thinking in python' file?(y/n):")

if self.s == 'y':

while True:

self.name = raw_input('Server: input our name:')

sock.sendall('name:' + self.name.strip())

self.response = sock.recv(8192)

if self.response == 'valid':

break

else:

print 'Server: Invalid username'

while True:

self.pwd = raw_input('Server: input our password:')

sock.sendall('pwd:' + self.pwd.strip())

self.response = sock.recv(8192)

if self.response == 'valid':

print 'please wait...'

f = open('b.pdf', 'wb')

while True:

data = sock.recv(1024)

if data == 'EOF':

break

f.write(data)

f.flush()

f.close()

print 'download finished'

break

else:

print 'Server: Invalid password'

sock.sendall('bye')

sock.close()

print 'Disconnected'

if __name__ == '__main__':

client = MyClient()

client.connect()

line-34到line-41处理文件下载,client收到server的“EOF”信号后,就知道文件传完了。

最后需要说明一下python的文件,由于是内置类型,所以不想java那样有那么多的reader,writer,input,ouput啊。python中,在打开或建立一个文件时,主要是通过模式(mode)来区别的。

python的网络编程确实简单,因为它提供了各种功能的已经写好的类,直接继承就Ok了。

python还在学习中,上面的例子跑通是没问题,但写得肯定不够好,还得学习啊

python服务端编程_Python实现的简单文件传输服务器和客户端相关推荐

  1. python服务端编程_Python WebSocket服务端编程代码完成gtalk机器人

    本文python源码为实现,Python WebSocket服务端编程代码完成gtalk机器人的全部代码段.需要用到python sys.sleekxmpp.reactor等python模块及方法,在 ...

  2. python服务端编程_python网络编程示例(客户端与服务端)

    client客户端 if __name__ == '__main__': import socket import os sock = socket.socket(socket.AF_INET, so ...

  3. python 服务端性能_python 学习笔记---Locust 测试服务端性能

    由于人工智能的热度, python目前已经成为最受欢迎的编程语言,一度已经超越Java . 本文将介绍开源的python 测试工具: locust 使用步骤: 1. 安装python 3.0以上版本 ...

  4. python写服务器端qt客户端_python写一些简单的tcp服务器和客户端

    代码贴上,做个记录 TcpClient # -*- coding:utf-8 -*- import socket target_host = "127.0.0.1" #服务器端地址 ...

  5. python 服务端主动发数据_python使用socket向客户端发送数据的方法

    Python Socket通讯例子详解 创新从模仿开始! python中内置的socket模块使得网络编程更加简单化,下面就通过两个小小脚本来了解客户端如何与服务器端建立socket. 客户端代码: ...

  6. 《Linux多线程服务端编程:使用muduo C++网络库》书摘6.6.2节

    6.6.2 常见的并发网络服务程序设计方案 W. Richard Stevens 的<UNIX 网络编程(第2 版)>第27 章"Client-ServerDesign Alte ...

  7. 《Linux多线程服务端编程:使用muduoC++网络库》学习笔记

    文章目录 第1章 线程安全的对象生命期管理 1.1 当析构函数遇到多线程 1.1.1 线程安全的定义 1.1.3 线程安全实例 1.2 对象的创建很简单 1.3 销毁很难 1.4 线程安全的Obser ...

  8. 急速rust服务器管理_Rust 与服务端编程的碎碎念

    Rust 是 Mozilla 推出的一门系统编程语言,非常看重内存安全,是一门非常优秀的语言.Mozilla 用它构建了其下一代的浏览器内核 servo,其工程能力毋庸置疑. 那么,Rust在服务端编 ...

  9. python开发cs软件_python cs架构实现简单文件传输

    本文为大家分享了python cs架构实现简单文件的传输代码,供大家参考,具体内容如下 要实现简单文件的传输我们必须考虑这些问题: 1.什么是c/s架构? 顾名思义,就是客户端端/服务器架构.不同的人 ...

最新文章

  1. 【Qt】Qt样式表总结(二):冲突和命名空间
  2. jdk与cglib的动态代理
  3. 得到目标元素距离视口的距离以及元素自身的宽度与高度(用于浮层位置的动态改变)...
  4. mysql 代理作业_查看SQLServer 代理作业的历史信息
  5. 指数随机变量 泊松过程跳_《常见随机过程》(一)
  6. 分布式--ActiveMQ 消息中间件(一) https://www.jianshu.com/p/8b9bfe865e38
  7. matlab中直到循环语句,Matlab再次执行循环,直到第一条语句结束
  8. web api 权限控制
  9. 随想录(git操作)
  10. thinkphp5做好的PHP项目上传服务器上,访问任何页面都只显示默认的欢迎页面
  11. hadoop 2.6.4 java_Windows下使用Hadoop2.6.0
  12. 软件需求的薛定谔之猫
  13. linux 内核PCI驱动总结记录
  14. 易泊夏武离线车牌识别,车牌识别SDK
  15. 解决RuntimeError: Tensor for ‘out’ is on CPU, Tensor for argument #1 ‘self’ is on CPU, but expected th
  16. OCR文档识别的工作原理
  17. 【合天网安】CONN.ASP暴库漏洞实验
  18. grid图片展示 jquery_jquery.gridrotator实现响应式图片展示画廊效果
  19. WebLogic历史漏洞汇总与复现
  20. android busybox脚本,在BusyBox中创建和控制启动脚本

热门文章

  1. Codeforces Round #494 (Div. 3) D. Coins and Queries(贪心
  2. codeforces 906C
  3. #Python语言程序设计Demo - 七段数码管绘制
  4. 11-4实战上色及修复照片
  5. 挑战IPOD功能最强MP3——Zune二代评测
  6. 开发更安全的asp.net应用程序一
  7. 华为交换机Trunk配置
  8. Elasticsearch OOM(内存溢出)
  9. 使用正则表达式时,容易出错的地方~
  10. java的反射机制--关于类中属性的反射。