gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:50:09 25 4
gpt4 key购买 nike

我有一个多线程 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com