0

Javaで簡単なFTPサーバーを作っています。ローカルでテストすると、すべてが機能しています(自分のマシンでサーバーとクライアントの両方を実行しています)。しかし、サーバーとクライアントを 2 つの異なるリモート マシンで実行すると、サーバーから「150 ファイル ステータスは正常です」というメッセージを受信した直後にクライアントがどこかでハングします。ある場所では正常に機能するのに、他の場所では機能しない理由がわかりません。関連するコードは次のとおりです。

サーバー (ファイルの送信):

FileInputStream input = null;
                            try {
                                input = new FileInputStream(filePath);
                            } catch (FileNotFoundException e) {
                                out.writeBytes("550 File not found or access denied.\r\n");
                            }
                            out.writeBytes("150 File status okay.\r\n");

                            // TCP CONNECT
                            DataOutputStream outToClient_d = null;
                            Socket clientSocket1 = null;

                            try {
                                ipAddress = ipAddress.substring(0,
                                        ipAddress.length() - 1);
                                clientSocket1 = new Socket(ipAddress,
                                        portNumber);
                                outToClient_d = new DataOutputStream(
                                        clientSocket1.getOutputStream());
                            }

                            catch (UnknownHostException e) {
                                out.writeBytes("425 Can not open data connection.\r\n");
                            }

                            byte[] buf = new byte[2048];
                            int len;
                            while ((len = input.read(buf)) > 0) {
                                outToClient_d.write(buf, 0, len);
                            }
                            input.close();

                            out.writeBytes("250 Requested file action completed.\r\n");
                            clientSocket1.close();
                            outToClient_d.close();

クライアント (ファイルを /retr_files に保存):

InputStream inFromServer_d = null;

    if (welcomeSocket != null) {
        if (!welcomeSocket.isClosed()) {
            welcomeSocket.close();
        }
    }

    try {
        welcomeSocket = new ServerSocket(port);
        System.out.print("PORT " + myIP + "," + num1 + "," + num2 + "\r\n");
        out.writeBytes("PORT " + myIP + "," + num1 + "," + num2 + "\r\n");
        System.out.print(parseReply(getResponse()));
        System.out.print("RETR " + pathname + "\r\n");
        out.writeBytes("RETR " + pathname + "\r\n");
        String reply = parseReply(getResponse());
        if (reply.charAt(10) == '1') {
            System.out.print(reply);
            System.out.print(parseReply(getResponse()));

            try {
                clientSocket_d = welcomeSocket.accept();
            } catch (IOException e) {
                System.out
                        .print("GET failed, FTP-data port not allocated.\r\n");
                System.exit(-1);
            }

            inFromServer_d = clientSocket_d.getInputStream();

            // READ
            InputStream input = inFromServer_d;
            OutputStream output = new FileOutputStream("retr_files/file"
                    + retrCnt);

            byte[] buf = new byte[2048];
            int len;
            while ((len = input.read(buf)) > 0) {
                output.write(buf, 0, len);
            }

            input.close();
            output.close();
            clientSocket_d.close();

        } else {
            System.out.print(reply);
        }
    } catch (IOException e) {
        System.out.print("GET failed, FTP-data port not allocated.\r\n");
        System.exit(-1);
    }

どんな助けでも大歓迎です!

4

1 に答える 1

0

クライアントとサーバーの間にファイアウォールがあり、サーバーからクライアントへの逆接続をブロックしていると思います。この問題が、最近では「アクティブ」転送ではなく「パッシブ」転送を使用する理由です。

于 2013-03-27T22:44:01.680 に答える