0

我正在尝试使用 TCP 套接字编程将数据从客户端发送到服务器端。

我所做的是读取客户端目录中的文件名,然后通过发送将文件名发送到服务器端clientSocket.send("FILE "+fileToTransfer + "\n")。然后在服务器端,我使用正则表达式来获取文件名。

但是,客户端将始终将“FILE fileName.txt”和文件的内容一起发送。所以我想在服务器端,我将不得不使用正则表达式将文件名与文件内容分开。

所以我在服务器端所做的就是使用getFileName = re.match(r'FILE (.*)(\n)(.*)',data)分别获取文件名及其内容。不幸的是,(.*)不包括换行符。

在这种情况下,如何将文件内容与文件名分开?有没有办法让客户端先发送文件名,然后等待服务器端获取文件名,然后才能发送文件内容?或者是否有一个我可以使用的正则表达式,以便我可以分隔文件名和文件内容?

4

2 回答 2

2

您可以将文件大小与文件名一起发送。这允许服务器端知道它应该读取多少字节。在这种情况下,您不需要将整个文件内容读入内存,您可以逐块读取它,直到文件大小耗尽(清零)并将块写入磁盘。像这样的东西:

## client side
# get file size here, for example:
# filesize = os.path.getfilesize(filepath)
sock.sendall("FILE %s %d\n" % (filename, filesize))
sock.sendall(fd.read())


...
## server side
# error handling is left out
header = ""
while True:
    d = sock.recv(1)
    if d == '\n':
        break
    header += d

filesize = int(header.split()[-1])
# or search for the last space in header
# and get a substring of header as filename
filename = "".join(header.split()[1:-1])
data = ""
while filesize > 0:
    chunk = sock.recv(1024) # or any amount of data
    filesize -= chunk
    data += chunk

或者你可以放弃你的正则表达式并找到第一个\n

## client side
sock.sendall("FILE %s\n")
sock.sendall(fd.read())

...
## server side
# data = read data here
newline = data.find('\n')
assert newline != -1 # some error handling here
header = data[newline]
filename = header[len("FILE "):]
content = data[newline+1:]
于 2013-03-17T21:54:37.167 回答
1

如果您只想修复正则表达式,请将行更改为:

getFileName = re.match(r'FILE (.*?)(\n)(.*)', data, re.DOTALL)

DOTALL标志也使.数学换行符。我添加的额外内容?使*乘数不贪心,即它会停在它看到的第一个换行符处(我假设换行符不能是文件名的一部分)。

您可能应该做的是将文件名作为标题或其他内容的一部分发送。

于 2013-03-17T11:25:35.230 回答