BufferedReader принимает терминал ввода символов - PullRequest
0 голосов
/ 12 сентября 2018

Я реализую программирование сокетов в Java, где я использую BufferedReader для получения ввода от клиента.Однако объект BufferedReader принимает символ новой строки, введенный на консоли.Вот мой код на стороне сервера:

import java.net.*;
import java.io.*;

class FTPserver {

private ServerSocket serverSocket = null;
private DataInputStream dis = null;
private DataOutputStream dos = null;

FTPserver() {
    try {
        String input;
        serverSocket = new ServerSocket(3000);
        Socket socket = null;
        socket = serverSocket.accept();
        dis = new DataInputStream(socket.getInputStream());
        dos = new DataOutputStream(socket.getOutputStream());
        input = dis.readUTF();
        if(input.equals("ftp")) {
            dos.writeUTF("ftp> ");
            input = dis.readUTF();
            System.out.print("opened connection to 10.10.10.212");
            dos.writeUTF("Connected to 10.10.10.212\n220 (vsFTPd 3.0.2)\nName (10.10.10.212:root): ");
            input = dis.readUTF();
            dos.writeUTF("331 Please specify the password.\nPassword: ");
            input = dis.readUTF();
            dos.writeUTF("230 Login successful.\nRemote system type is UNIX\nUse binary mode to transfer files\nftp> ");
            input = dis.readUTF();       //receive mget
            dos.writeUTF("ftp> ");
            input = dis.readUTF();       //receive mput
            dos.writeUTF("ftp> ");
            //input = dis.readUTF();
            input = dis.readUTF();       //receive exit
            dos.writeUTF("Goodbye");
            input = dis.readUTF();       //receive exit
            dos.writeUTF("Goodbye");
        }
        dis.close();
        dos.close();
        socket.close();
    }
    catch(Exception e) {
        e.printStackTrace();
    }
}

public static void main(String[] args) {
    FTPserver ftp = new FTPserver();
}
}

Вот мой код клиента:

import java.net.*;
import java.io.*;
import java.util.Scanner;

class FTPclient {
private DataInputStream dis = null;
private DataOutputStream dos = null;
private Socket socket = null;

FTPclient() {
    try {
        String input,output;
        BufferedReader sc = new BufferedReader(new InputStreamReader(System.in));
        socket = new Socket("localhost",3000);
        dis = new DataInputStream(socket.getInputStream());
        dos = new DataOutputStream(socket.getOutputStream());
        output = sc.readLine();
        dos.writeUTF(output);               // write ftp
        System.out.print(dis.readUTF());    // print ftp>
        dos.writeUTF(sc.readLine());            // write open 10.10.10.212
        System.out.print(dis.readUTF());    // print connected
        dos.writeUTF(sc.readLine());
        System.out.print(dis.readUTF());
        dos.writeUTF(sc.readLine());             //send mget
        System.out.print(dis.readUTF());

        dos.writeUTF(sc.readLine());             //send mput
        System.out.print(dis.readUTF());
        dos.writeUTF(sc.readLine());            //send exit
        System.out.println(dis.readUTF());
        dos.writeUTF(sc.readLine());             //send exit
        System.out.println(dis.readUTF());
        dis.close();
        dos.close();
        socket.close();
    }
    catch(Exception e) {
        e.printStackTrace();
    }
}

public static void main(String[] args) {
    FTPclient ftp = new FTPclient();
}
}

Вот входные данные, которые я даю на клиентской консоли:

dell@dell-Inspiron-15-3567:~$ java FTPclient
ftp
ftp> open 10.10.10.212
Connected to 10.10.10.212
220 (vsFTPd 3.0.2)
Name (10.10.10.212:root): student
331 Please specify the password.
Password: student
230 Login successful.
Remote system type is UNIX
Use binary mode to transfer files
ftp> mget *.py
ftp> mput sample.java
ftp>                   //this line is getting skipped
exit
Goodbye
dell@dell-Inspiron-15-3567:~$

Как уже упоминалось в приведенном выше фрагменте консоли, строка, в которую пользователь введет exit, пропускается.Согласно ответу на stackoverflow, мой ввод должен заканчиваться завершающим символом.Я не могу понять, как это сделать.

1 Ответ

0 голосов
/ 12 сентября 2018

Я предполагаю, что под словом «пропущено» вы подразумеваете, что слово «выход» печатается в следующей строке, а не сразу после «ftp>», как в предыдущих строках.Если это так, я думаю, что причина этого заключается в том, что вы используете System.out.println в этих строках вашего клиента вместо System.out.print, как в предыдущих строках.Я думаю, что ваш ввод завершается правильно, так как кажется, что ваша программа завершается правильно и не продолжает ждать дальнейшего ввода.

    dos.writeUTF(sc.readLine());            //send exit
    System.out.println(dis.readUTF());
    dos.writeUTF(sc.readLine());             //send exit
    System.out.println(dis.readUTF());
...