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

标签 java multithreading client-server

我有一个多线程 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();

    }

并像这样编写客户端:

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");
    }
}

关于java - 如何在Java中的客户端-服务器应用程序中读写多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47939751/

相关文章:

java - 迁移 AndroidX 后出现错误

java - 可以并行执行 Java 对象非同步方法的最大线程数是多少?

java - 如何在Java中共享对象列表以进行并行处理?

java - 使用CompletionService处理大量任务

node.js - 区分客户端与 Node 的连接?

java - java中如何通过周数和日数(Week)来确定日期

c++ - 寻找对我的线程安全、无锁队列实现的批评

java - 简单客户端服务器程序的问题

javascript - JQuery 客户端在本地主机之外失败

java - 使用 Log4j 找不到记录器的附加程序