打印文件的内容 - python套接字

时间:2015-11-23 08:03:49

标签: python sockets

我正在尝试使用定义的命令'get'将文件内容打印到客户端。我没有得到文件的内容而是内容越来越多用Server Says ...来获取test.txt。

这是我的客户代码:

import socket
import sys
import os

HOST = 'localhost' 
PORT = 8082 
size = 1024

def ls():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.connect((HOST,PORT))
    s.send(userInput)
    result = s.recv(size)
    print result
    s.close()
    return

def put(commandName):
    socket1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    socket1.connect((HOST, PORT))
    socket1.send(commandName)
    string = commandName.split(' ', 1)
    inputFile = string[1]
    with open(inputFile, 'rb') as file_to_send:
        for data in file_to_send:
            socket1.sendall(data)
    print 'PUT Successful'
    socket1.close()
    return


def get(commandName):
    socket1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    socket1.connect((HOST, PORT))
    socket1.send(commandName)
    string = commandName.split(' ', 1)
    inputFile = string[1]
    with open(inputFile, 'wb') as file_to_write:
        while True:
            data = socket1.recv(1024)
            print data
            if not data:
                break
            print data
            file_to_write.write(data)
    file_to_write.close()
    print 'GET Successful'
    #socket1.close()
    return

done = False
while not done:
    userInput = raw_input()
    if "quit" == userInput:
        done = True
    elif "ls" == userInput:
       ls()
    else:
        string = userInput.split(' ', 1)
        if (string[0] == 'put'):
            put(userInput)
        elif (string[0] == 'get'):
            get(userInput)
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.connect((HOST,PORT))
    s.send(userInput) 
    data = s.recv(size) 
    s.close() 
    print 'Received:', data

服务器代码:

import socket
import os
import sys

host = '' 
port = 8082 
backlog = 5 
size = 1024

serverID = socket.gethostbyname(socket.gethostname())
info = 'SERVER ID: {} port: {}'.format(serverID, port)
print info

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((host,port)) 
s.listen(backlog)
done = False

# Loop until client sends 'quit' to server
while not done: 
    client, address = s.accept() 
    data = client.recv(size)

    print "Server received: ", data
    if data: 
        client.send("Server Says... " + data)
    if data == "quit":
        done = True
    elif data == "ls":
       data = os.listdir("C://")
       client.send(data[0])
    else:
        string = data.split(' ', 1)
        dataFile = string[1]

        if (string[0] == 'put'):
            with open(dataFile, 'wb') as file_to_write:
                while True:
                    data = client.recv(1024)
                    if not data:
                        break
                    file_to_write.write(data)
                    file_to_write.close()
                    break
            print 'Receive Successful'
        elif (string[0] == 'get'):
            with open(dataFile, 'rb') as file_to_send:
                for data in file_to_send:
                    client.send(data)
            print 'Send Successful'

    client.close()
s.close()
print "Server exiting."

2 个答案:

答案 0 :(得分:0)

无论你发送到服务器的是什么,这种情况都是正确的,所以你得到“服务器说......”

if data: 
    client.send("Server Says... " + data)

我认为你的客户也有几个缺陷。就像您的命令被发送2次一样:当您执行时,在客户端'main'中执行一次:

s.send(userInput) 

曾经有过像get和ls这样的函数:

socket1.send(commandName)

答案 1 :(得分:0)

您正在获取该文件的内容但它是空的...并且您的代码只是因为您可能在同一目录中运行它。 您的客户端打开要写入的文件(然后它是空的)并且服务器读取它(两个代码都使用相同的文件名)。您可能想从C:\读取文件,因此您应该更改服务器代码并替换行:

with open(dataFile, 'rb') as file_to_send:

使用:

with open('C:\\' + dataFile, 'rb') as file_to_send:
相关问题