【问题标题】:How to separate input streams - simple client-socket program如何分离输入流 - 简单的客户端套接字程序
【发布时间】:2018-08-07 00:57:39
【问题描述】:

客户:

public class Client {

    private Socket clientSocket;
    private PrintWriter out;
    private BufferedReader in;
    private OutputStream os;
    private BufferedInputStream bis;
    private FileInputStream fis;
    private FileOutputStream fos;
    private BufferedOutputStream bos;
    private int bytesRead;
    private int current;

    public Client(String host, int port) throws IOException {
        clientSocket = new Socket(host, port);
        out = new PrintWriter(clientSocket.getOutputStream(), true);
        in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
    }

    public void stopConnection() throws IOException {
        in.close();
        out.close();
        clientSocket.close();
    }

    public void menu() throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        while (true) {
            System.out.println("********************");
            System.out.println("1. CONN: Connect to Server");
            System.out.println("2. UPLD: Upload file");
            System.out.println("********************");
            System.out.print("Enter Choice: ");
            String input = br.readLine();
            out.write(input);
            out.flush();
            if(input.equals("UPLD")){
                sendFile();
            }
        }
    }

    public void sendFile() throws IOException {
        System.out.println("Enter filename");
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String fileName = br.readLine();
        File myFile = new File(fileName);
        if(!myFile.exists()){
            System.out.println("File doesn't exist!");
            return;
        }
        else{
            System.out.println("File has been found!");
        }
        DataOutputStream dos = new DataOutputStream(clientSocket.getOutputStream()); //get the output stream of the socket
        dos.writeInt((int) myFile.length()); //write in the length of the file
        InputStream in = new FileInputStream(myFile); //create an inputstream from the file
        OutputStream out = clientSocket.getOutputStream(); //get output stream
        byte[] buf = new byte[8192]; //create buffer
        int len = 0;
        while ((len = in.read(buf)) != -1) {
            out.write(buf, 0, len); //write buffer
        }
        in.close(); //clean up
        out.close();
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.print("Enter Host:");
        String h = br.readLine();
        System.out.print("Enter port:");
        String p = br.readLine();
        Client ftp = new Client(h,Integer.parseInt(p));
        ftp.menu();
    }
} 

服务器:

public class Server {
    private ServerSocket serverSocket;
    private Socket clientSocket;
    private PrintWriter out;
    private BufferedReader in;
    private OutputStream os;
    private BufferedInputStream bis;
    private FileInputStream fis;

    private String fileName = "SampleFile.txt";

    public void start(int port) throws IOException {
        serverSocket = new ServerSocket(port);
        while (true) {
            String input;
            clientSocket = serverSocket.accept();
            out = new PrintWriter(clientSocket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

            input = in.readLine();
            if (input.equals("UPLD")) {
                //System.out.println("activate uploadFile");
                //System.out.println(input);
                receiveFile();
            } else System.out.println("Why?");
        }
    }

    public void stop() throws IOException {
        in.close();
        out.close();
        clientSocket.close();
        serverSocket.close();
    }

    public void receiveFile() throws IOException {
        DataInputStream dis = new DataInputStream(clientSocket.getInputStream()); //get the socket's input stream
        int size = dis.readInt(); //get the size of the file.
        InputStream inp = clientSocket.getInputStream();
        OutputStream out = new FileOutputStream("copy.txt"); //stream to write out file
        int totalBytesRead = 0;
        byte[] buf = new byte[8192]; //buffer
        int len = 0;
        while ((len = inp.read(buf)) != -1) {
            out.write(buf, 0, len); //write buffer
        }
        out.close(); //clean up
        inp.close();
    }

    public static void main(String[] args) throws IOException {
        Server server = new Server();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Please enter the port you wish to bind to: ");
        String port = br.readLine();
        server.start(Integer.parseInt(port));
        System.out.println("Connected to client; awaiting operation request");
    }
} 

我怎样才能使通过 br.readline() 分配给字符串输入的客户端输入首先发送到服务器,以便服务器知道调用 receiveFile() 方法,然后 sendFile() 方法是在客户端调用。我完全不知道为什么它现在不工作 - 我在将输入写入 PrintWriter 后执行 flush(),那么为什么服务器不能先接收它,然后再接收文件?目前,当我打印服务器的 BufferedReader 时,它的输入和文件内容在同一行。

【问题讨论】:

    标签: java sockets tcp ftp client-server


    【解决方案1】:

    它的下一行字符在客户端产生问题。 附加 UPLD\n 并写入。 您正在阅读 input = in.readLine(); @服务器端

    public void menu() throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        while (true) {
            System.out.println("********************");
            System.out.println("1. CONN: Connect to Server");
            System.out.println("2. UPLD: Upload file");
            System.out.println("********************");
            System.out.print("Enter Choice: ");
            String input = br.readLine();
            out.write(input+"\n");
            out.flush();
            if(input.equals("UPLD")){
                sendFile();
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-14
      • 1970-01-01
      • 2020-05-24
      • 2014-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-17
      相关资源
      最近更新 更多