繁体   English   中英

如何在Java的客户端服务器应用程序中读写多行

[英]How do I read-write multiple lines in client-server app in Java

我有一个多线程Java客户端-服务器应用程序,发现自己在多行通信中苦苦挣扎。 这就是我的意思

如果我写这样的服务器:

private static void startHandler(final Socket socket)
    {
        Thread thread = new Thread()
        {
            @Override
            public void run()
            {
                try {
                    Scanner inputFromUser = new Scanner(socket.getInputStream());
                    PrintStream outPutToUser = new PrintStream(socket.getOutputStream(), true);
                    outPutToUser.println("Welcome!");
                    System.out.println(inputFromUser.nextLine());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        };
        thread.start();

    }

像这样编写Client:

public static void main(String[] args) throws Exception
    {
        Scanner inputFromUser = new Scanner(System.in);
        Socket socket = new Socket("127.0.0.1", 5555);
        Scanner inputFromServer = new Scanner(socket.getInputStream());
        PrintStream outputToServer = new PrintStream(socket.getOutputStream());
        String greetingFromServer = inputFromServer.nextLine();
        System.out.println(greetingFromServer);
        outputToServer.println(inputFromUser.nextLine());
    }

效果很好:

  • 服务器将“欢迎”发送给客户端

  • 用户输入一些字符串

  • 此字符串将在服务器控制台中打印

但是,如果我尝试使其变得更复杂,例如:

private static void startHandler(final Socket socket)
    {
        Thread thread = new Thread()
        {
            @Override
            public void run()
            {
                try {
                    Scanner inputFromUser = new Scanner(socket.getInputStream());
                    PrintStream outPutToUser = new PrintStream(socket.getOutputStream(), true);
                    outPutToUser.println("Welcome!");
                    sendInitialCommandsToUser(outPutToUser);
                    System.out.println(inputFromUser.nextLine());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        };
        thread.start();

    }

    private static void sendInitialCommandsToUser(PrintStream writer)
    {
        writer.println("1 - Log In");
        writer.println("2 - Sign up");
        writer.println("3 - Exit");
    }

客户:

public static void main(String[] args) throws Exception
    {
        Scanner inputFromUser = new Scanner(System.in);

        Socket socket = new Socket("127.0.0.1", 5555);
        Scanner inputFromServer = new Scanner(socket.getInputStream());
        PrintStream outputToServer = new PrintStream(socket.getOutputStream());

        String greetingFromServer = inputFromServer.nextLine();
        System.out.println(greetingFromServer);

        getMultipleLinesFromServer(inputFromServer);

        outputToServer.println(inputFromUser.nextLine());
    }

    private static void getMultipleLinesFromServer(Scanner scanner)
    {
        while(scanner.hasNextLine())
        {
            System.out.println(scanner.nextLine());
        }
    }

它卡在getMultipleLinesFromServer(Scanner scanner)方法上

仅客户端输出

Welcome!
1 - Log In
2 - Sign up
3 - Exit

而且我无法提供要在服务器上打印的字符串。.什么问题?

如果要按行读取,BufferedReader是一个不错的选择

试试这个,在我的IDEA上运行良好

package com.zhouplus;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

    private static void startHandler(final Socket socket) {
        Thread thread = new Thread(() -> {
            try {
                BufferedReader inputFromUser = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                PrintWriter outPutToUser = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
                outPutToUser.println("Welcome!");
                sendInitialCommandsToUser(outPutToUser);
                System.out.println("start readline!");
                System.out.println(inputFromUser.readLine());
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
        thread.start();
    }

    private static void sendInitialCommandsToUser(PrintWriter writer) {
        writer.println("1 - Log In");
        writer.println("2 - Sign up");
        writer.println("3 - Exit");
        writer.flush();
    }

    public static void main(String[] argv) throws IOException {
        ServerSocket ss = new ServerSocket(5555);
        Socket accept = ss.accept();
        startHandler(accept);
    }
}

和客户

package com.zhouplus;

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

public class Client {
    public static void main(String[] args) throws Exception {
        Scanner inputFromUser = new Scanner(System.in);

        Socket socket = new Socket("localhost", 5555);
        BufferedReader inputFromServer = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        PrintWriter outputToServer = new PrintWriter(socket.getOutputStream());


        String greetingFromServer = inputFromServer.readLine();
        System.out.println(greetingFromServer);

        new Thread(() -> {
            String str = inputFromUser.nextLine();
            outputToServer.println(str);
            outputToServer.flush();
        }).start();

        getMultipleLinesFromServer(inputFromServer);
    }

    private static void getMultipleLinesFromServer(BufferedReader br) throws IOException {
        String str;
        while ((str = br.readLine()) != null) {
            System.out.println(str);
        }
        System.out.println("over");
    }
}

如果您查看Scanner hasNextLine方法的Javadocs ...

  Returns true if there is another line in the input of this scanner. This method may block while waiting for input. The scanner does not advance past any input. 

看来,一旦它打印了“ 3-退出”,它就阻塞了,等待来自服务器的更多数据。

暂无
暂无

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

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