代码之家  ›  专栏  ›  技术社区  ›  willh99

将文件从Python服务器发送到Java客户端

  •  1
  • willh99  · 技术社区  · 7 年前

    我试图通过TCP套接字将文件从Python服务器发送到Java客户端。以下是我目前掌握的情况:

    Java客户端(请注意,所有文件传输代码都在getFile()方法中):

    public class Client1
    {
        private Socket socket = null;
        private FileOutputStream fos = null;
        private DataInputStream din = null;
        private PrintStream pout = null;
        private Scanner scan = null;
    
        public Client1(InetAddress address, int port) throws IOException
        {
            System.out.println("Initializing Client");
            socket = new Socket(address, port);
            scan = new Scanner(System.in);
            din = new DataInputStream(socket.getInputStream());
            pout = new PrintStream(socket.getOutputStream());
        }
    
        public void send(String msg) throws IOException
        {
            pout.print(msg);
            pout.flush();
        }
    
        public void closeConnections() throws IOException
        {
            // Clean up when a connection is ended
            socket.close();
            din.close();
            pout.close();
            scan.close();
        }
    
        // Request a specific file from the server
        public void getFile(String filename)
        {
            System.out.println("Requested File: "+filename);
            try {
                File file = new File(filename);
                // Create new file if it does not exist
                // Then request the file from server
                if(!file.exists()){
                    file.createNewFile();
                    System.out.println("Created New File: "+filename);
                }
                fos = new FileOutputStream(file);
                send(filename);
    
                // Get content in bytes and write to a file
                int counter;
                byte[] buffer = new byte[8192];
                while((counter = din.read(buffer, 0, buffer.length)) != -1)
                {
                    fos.write(buffer, 0, counter);
                }                }
                fos.flush();
                fos.close();
    
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    }
    

    Python服务器:

    import socket
    
    host = '127.0.0.1'
    port = 5555
    
    # Create a socket with port and host bindings
    def setupServer():
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        print("Socket created")
        try:
            s.bind((host, port))
        except socket.error as msg:
            print(msg)
        return s
    
    
    # Establish connection with a client
    def setupConnection():
        s.listen(1)     # Allows one connection at a time
        print("Waiting for client")
        conn, addr = s.accept()
        return conn
    
    
    # Send file over the network
    def sendFile(filename, s):
        f = open(filename, 'rb')
        line = f.read(1024)
    
        print("Beginning File Transfer")
        while line:
            s.send(line)
            line = f.read(1024)
        f.close()
        print("Transfer Complete")
    
    
    # Loop that sends & receives data
    def dataTransfer(conn, s, mode):
        while True:
            # Send a File over the network
            filename = conn.recv(1024)
            filename = filename.decode(encoding='utf-8')
            filename.strip()
            print("Requested File: ", filename)
            sendFile(filename, s)
            break
        conn.close()
    
    
    s = setupServer()
    while True:
        try:
            conn = setupConnection()
            dataTransfer(conn, s, "FILE")
        except:
            break
    

    我成功地在服务器和客户端之间创建了一个消息传递程序,它们在其中相互传递字符串。但是,我无法通过网络传输文件。

    Python服务器似乎在正确地发送字节,因此Java端似乎是问题所在。尤其是while循环: while((counter = din.read(buffer, 0, buffer.length)) != -1) 已给出输出 -1 因此,文件的写入从未真正发生过。

    提前感谢您的帮助!

    1 回复  |  直到 7 年前
        1
  •  1
  •   willh99    6 年前

    供其他人参考,这就是我最终如何让它工作的。

    服务器:

    import socket
    import select
    
    server_addr = '127.0.0.1', 5555
    
    # Create a socket with port and host bindings
    def setupServer():
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        print("Socket created")
        try:
            s.bind(server_addr)
        except socket.error as msg:
            print(msg)
        return s
    
    
    # Establish connection with a client
    def setupConnection(s):
        s.listen(5)     # Allows five connections at a time
        print("Waiting for client")
        conn, addr = s.accept()
        return conn
    
    
    # Get input from user
    def GET():
        reply = input("Reply: ")
        return reply
    
    
    def sendFile(filename, conn):
        f = open(filename, 'rb')
        line = f.read(1024)
    
        print("Beginning File Transfer")
        while line:
            conn.send(line)
            line = f.read(1024)
        f.close()
        print("Transfer Complete")
    
    
    # Loop that sends & receives data
    def dataTransfer(conn, s, mode):
        while True:
            # Send a File over the network
            if mode == "SEND":
                filename = conn.recv(1024)
                filename = filename.decode(encoding='utf-8')
                filename.strip()
                print("Requested File: ", filename)
                sendFile(filename, conn)
                # conn.send(bytes("DONE", 'utf-8'))
                break
    
            # Chat between client and server
            elif mode == "CHAT":
                # Receive Data
                print("Connected with: ", conn)
                data = conn.recv(1024)
                data = data.decode(encoding='utf-8')
                data.strip()
                print("Client: " + data)
                command = str(data)
                if command == "QUIT":
                    print("Server disconnecting")
                    s.close()
                    break
    
                # Send reply
                reply = GET()
                conn.send(bytes(reply, 'utf-8'))
    
        conn.close()
    
    
    sock = setupServer()
    while True:
        try:
            connection = setupConnection(sock)
            dataTransfer(connection, sock, "CHAT")
        except:
            break
    

    客户:

    import java.net.*;
    import java.io.*;
    import java.util.Scanner;
    
    public class ClientConnect {
    
        private Socket socket = null;
        private FileOutputStream fos = null;
        private DataInputStream din = null;
        private PrintStream pout = null;
        private Scanner scan = null;
    
        public ClientConnect(InetAddress address, int port) throws IOException
        {
            System.out.println("Initializing Client");
            socket = new Socket(address, port);
            scan = new Scanner(System.in);
            din = new DataInputStream(socket.getInputStream());
            pout = new PrintStream(socket.getOutputStream());
        }
    
        public void send(String msg) throws IOException
        {
            pout.print(msg);
            pout.flush();
        }
    
        public String recv() throws IOException
        {
            byte[] bytes = new byte[1024];
            din.read(bytes);
            String reply = new String(bytes, "UTF-8");
            System.out.println("Inside recv(): ");
            return reply;
        }
    
        public void closeConnections() throws IOException
        {
            // Clean up when a connection is ended
            socket.close();
            din.close();
            pout.close();
            scan.close();
        }
    
        public void chat() throws IOException 
        {    
            String response = "s";
    
            System.out.println("Initiating Chat Sequence");
            while(!response.equals("QUIT")){
                System.out.print("Client: ");
                String message = scan.nextLine();
                send(message);
                if(message.equals("QUIT"))
                    break;
                response = recv();
                System.out.println("Server: " + response);
            }
            closeConnections();
        }
    
        // Request a specific file from the server
        public void getFile(String filename)
        {
            System.out.println("Requested File: "+filename);
            try {
                File file = new File(filename);
                // Create new file if it does not exist
                // Then request the file from server
                if(!file.exists()){
                    file.createNewFile();
                    System.out.println("Created New File: "+filename);
                }
                fos = new FileOutputStream(file);
                send(filename);
    
                // Get content in bytes and write to a file
                byte[] buffer = new byte[8192];
                for(int counter=0; (counter = din.read(buffer, 0, buffer.length)) >= 0;)
                {
                        fos.write(buffer, 0, counter);
                }
                fos.flush();
                fos.close();
    
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    }