python使用TCP实现文件传输(CentOS6.4,python2.6测试通过)
2013-06-18 19:17
731 查看
今天下午用了三个小时的时间写了两个小程序,相当的闹心!找了半天错误,才发现是服务端的发送速率与客户端的接收速率不同步
服务端程序:
客户端向服务端发送一个目录,服务端可以将搜索该目录,传给客户端。客户端再向服务端发送一个文件,服务端就可以将该文件传给客户端了。
基本思想就是建立一个TCP服务端和一个TCP客户端。先运行客户端(主机是本机),一直监听端口。运行客户端后,会向服务端发送请求建立连接。连接建立后,服务端会创建一个新的套接字为客户端服务。两边就可以开始互相传递信息了。
后来出现了问题,服务端的发送速率与客户端的接收速率不同步,导致信息接收的不正确。我用的解决方法是在服务端每发送完一段信息之后,就睡眠0.01秒,感觉这是一件很影响效率的事。这不是好方法,不过也想出更好的。暂且先放一下。
前几天上网络课的时候老师讲了客户端和服务端TCP协议的同步机制,还讲了好几种。原以为这些机制是python的socket会提供(也许提供了,是我不知道),经过这次实验,发现好像不是这么回事。先把问题留在这里,有时间再解决。
服务端程序:
#!/usr/bin/env python # Time-stamp: <2013-06-18 18:39:02 Tuesday by pein> # Email: <pein0119@gmail.com> # -*- coding: utf-8 -*- import socket, time import dir HOST = socket.gethostname() PORT = 10019 ADDR = (HOST, PORT) BUFFERSIZE = 1024 fileServer = socket.socket() fileServer.bind(ADDR) fileServer.listen(5) while True: print "waiting for connection..." tcpCliSock, addr = fileServer.accept() print 'connected form:', addr while True: tcpCliSock.send("Please input a directory name:") direRequest = tcpCliSock.recv(BUFFERSIZE) if not direRequest: break fileList = dir.listDir(direRequest) tcpCliSock.send("There is %d files in the directory"%len(fileList)) time.sleep(0.01) tcpCliSock.send(str(len(fileList))) print len(fileList) for eachfile in fileList: time.sleep(0.01) tcpCliSock.send(eachfile) tcpCliSock.send("Please input a file name you want to get:") fileRequest = tcpCliSock.recv(BUFFERSIZE) fd = open(fileRequest) tcpCliSock.send(str(len(fd.readlines()))) fd.seek(0) for eachLine in fd: tcpCliSock.send(eachLine) time.sleep(0.01) fd.close() print "over" tcpCliSock.close()客户端代码:
#!/usr/bin/env python # Time-stamp: <2013-06-18 18:38:39 Tuesday by pein> # Email: <pein0119@gmail.com> # -*- coding: utf-8 -*- import socket HOST = socket.gethostname() PORT = 10019 BUFFERSIZE = 1024 ADDR = (HOST, PORT) fileClient = socket.socket() fileClient.connect(ADDR) while True: info = fileClient.recv(BUFFERSIZE) print info direRequest = raw_input('> ') if not direRequest: break fileClient.send(direRequest) info = fileClient.recv(BUFFERSIZE) print info sumOfFile = fileClient.recv(BUFFERSIZE) print sumOfFile sumOfFile = int(sumOfFile) print sumOfFile for count in range(sumOfFile): print fileClient.recv(BUFFERSIZE) info = fileClient.recv(BUFFERSIZE) print info fileRequest = raw_input('> ') fileClient.send(fileRequest) lineOfFile = int(fileClient.recv(BUFFERSIZE)) for count in range(lineOfFile): print fileClient.recv(BUFFERSIZE), fileClient.close()因为正在学计算机网络和python,所以代码挺糟烂的。
客户端向服务端发送一个目录,服务端可以将搜索该目录,传给客户端。客户端再向服务端发送一个文件,服务端就可以将该文件传给客户端了。
基本思想就是建立一个TCP服务端和一个TCP客户端。先运行客户端(主机是本机),一直监听端口。运行客户端后,会向服务端发送请求建立连接。连接建立后,服务端会创建一个新的套接字为客户端服务。两边就可以开始互相传递信息了。
后来出现了问题,服务端的发送速率与客户端的接收速率不同步,导致信息接收的不正确。我用的解决方法是在服务端每发送完一段信息之后,就睡眠0.01秒,感觉这是一件很影响效率的事。这不是好方法,不过也想出更好的。暂且先放一下。
前几天上网络课的时候老师讲了客户端和服务端TCP协议的同步机制,还讲了好几种。原以为这些机制是python的socket会提供(也许提供了,是我不知道),经过这次实验,发现好像不是这么回事。先把问题留在这里,有时间再解决。
相关文章推荐
- python使用tcp实现局域网内文件传输
- python使用smtplib模块通过gmail实现邮件发送的方法
- 解决 CentOS 6.4 升级 Python2.7 后 Ibus 输入法无法使用问题
- 最详细的SVN安装使用手册-Centos6.4系统运行通过
- python 通过tcp实现远程终端
- 使用Python通过win32 COM实现Word文档的写入与保存方法
- 使用Python通过win32 COM接口实现Excel单元格写入
- Centos 6.4 python 2.6 升级到 2.7一起的MySQLdb不能使用的解决问题
- 使用 异步多线程TCP Socket 实现进程间通信(VC 6.0 , BCB6.0调试通过)
- 解决 CentOS 6.4 升级 Python2.7 后 Ibus 输入法无法使用问题
- 使用 异步多线程TCP Socket 实现进程间通信(VC 6.0 , BCB6.0调试通过)
- CentOS 6.4升级Python导致yum无法使用
- 使用Python通过win32 COM实现Word文档的写入与保存
- 使用Python通过win32 COM实现Excel的写入与保存
- python用tcp实现局域网内文件传输(文本,图片,视频)
- centos中使用swig实现python调用c++
- python3.5基于TCP实现文件传输
- 解决 CentOS 6.4 升级 Python2.7 后 Ibus 输入法无法使用问题
- 解决 CentOS 6.4 升级 Python2.7 后 Ibus 输入法无法使用问题
- python中的__new__方法与__init__方法区别与调用;通过使用__new__实现单例模式