繁体   English   中英

将空文件发送到python中的tcp服务器后

[英]an empty file after sending it to tcp server in python

我是python的新手,我正在尝试制作多用途tcp服务器和客户端,以便能够在它们之间发送文件。 我确实为这两个程序编写了一些简单的代码,但是每次我在服务器站点上得到空文件时。 该文件确实在文件夹中创建,但是当我打开它时,它内部是空白的。 我也尝试发送.png文件,但Windows photoviewer不能打开它们,说它们是空的。 我没有找到鼓励这种问题的人,所以这就是为什么我问

客户端

import socket  # Import socket module

HOST = "localhost"  # Host address / name
PORT = 2137  # Reserves port for the service

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
client.connect((HOST, PORT))

fileToSend = open('test.txt', 'rb') 
print "File ready to be sent" 
l = fileToSend.read(1024)

while l:
    print "Sending the file"
    client.send(l)
    l = fileToSend.read(1024)

fileToSend.close() print "done" 
client.close()

Server.py

import socket
from threading import Thread
from SocketServer import ThreadingMixIn

import sys

TCPHOST = "localhost"
TCPPORT = 2137
BUFFER_SIZE = 20


class ClientThread(Thread):
    def __init__(self, HOST, PORT):
        Thread.__init__(self)
        self.HOST = HOST
        self.PORT = PORT
        print "New thread started for " + HOST + " on port " + str(PORT)

    def run(self):
        f = open('received.py', 'wb')
        while True:

                try:

                    data = conn.recv(1024)

                except socket.error, e:
                    print "Error receiving data: %s" % e
                    sys.exit(1)

                while data:
                    print "Receiving"
                    f.write(data)
                    data = conn.recv(1024)
                f.close()


try:
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    server.bind((TCPHOST, TCPPORT))
    print "Socket created"
except socket.error, err:
    print "Failed to create socket" % err


threads = []

while True:
    server.listen(4)
    print "Waiting for connections"
    (conn, (HOST, PORT)) = server.accept()
    thread = ClientThread(HOST, PORT)
    thread.start()
    threads.append(thread)

for t in threads:
    t.join()

我不确定您实际要做什么,因为我看到您导入了SocketServer,但是并没有全部使用。

如果尝试运行简单的套接字服务器,则不需要类ClientThread和该文件中有关线程的所有其他内容。

server.py中的以下代码将完成此工作

import socket

import sys

TCPHOST = "localhost"
TCPPORT = 2137
BUFFER_SIZE = 20

try:
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    server.bind((TCPHOST, TCPPORT))
    server.listen(4)
    print "Socket created"
except socket.error, err:
    print "Failed to create socket" % err

while True:
        print "Waiting for connections"
        (conn, (TCPHOST, TCPPORT)) = server.accept()
        try:

            while True:
                data = conn.recv(1024)
                f = open('received.py', 'wb')
                if data:
                   print "Receiving " + data
                   f.write(data)
                else:
                   f.close()
                   break;


        except socket.error, e:
            #pass
            print "Error receiving data: %s" % e
                #sys.exit(1)

        finally:
            conn.close()

但是,如果您尝试使用ThreadingMixIn实现线程化的TCPServer,则需要创建一个继承SocketServer的类并重写其handle()函数。

Python文档对此https://docs.python.org/3.5/library/socketserver.html很有帮助

(ThreadingMixin在页面底部)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM