您的位置:首页 > 理论基础 > 计算机网络

python使用TCP实现文件传输(CentOS6.4,python2.6测试通过)

2013-06-18 19:17 731 查看
今天下午用了三个小时的时间写了两个小程序,相当的闹心!找了半天错误,才发现是服务端的发送速率与客户端的接收速率不同步

服务端程序:

#!/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会提供(也许提供了,是我不知道),经过这次实验,发现好像不是这么回事。先把问题留在这里,有时间再解决。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: