gpt4 book ai didi

java - 代码运行卡在 scanner.hasNextLine()

转载 作者:行者123 更新时间:2023-11-30 07:08:54 28 4
gpt4 key购买 nike

我尝试建立一点服务器-客户端连接。

它们都有一个 Scanner 和一个 PrintWriter,并且它们使用 Socket 的输入和输出流相互写入。

客户端.java:

import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Client {

static ServerSocket serverSocket;
static Socket socket;
static PrintWriter printWriter;
static Scanner scanner;

public static void main(String[] args) throws UnknownHostException, IOException {

socket = new Socket("localhost", 13344);

scanner = new Scanner(socket.getInputStream());
printWriter = new PrintWriter(socket.getOutputStream());

printWriter.println("dataline 1");
printWriter.println("dataline 2");
printWriter.println("dataline 3");
printWriter.flush();


//Error!? => I never got the echo from server in output
while (scanner.hasNextLine()) {

String lineRead = scanner.nextLine();
System.out.println("From server" + lineRead);
}

socket.close();
scanner.close();
printWriter.close();

System.out.println("Client has quit.");

}

}

服务器.java

import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Server {

static ServerSocket serverSocket;
static Socket socket;
static PrintWriter printWriter;
static Scanner scanner;

public static void main(String[] args) throws IOException {

serverSocket = new ServerSocket(13344);
System.out.println("Waiting for Client to connect");
socket = serverSocket.accept();

scanner = new Scanner(socket.getInputStream());
printWriter = new PrintWriter(socket.getOutputStream());

System.out.println("Client has connected!!");

while (scanner.hasNextLine()) {

String lineRead = scanner.nextLine();
System.out.println("From Client: " + lineRead);

}

//Error!? => This line never runs
System.out.println("Now sending echo to Client");

printWriter.println("Echo from server1");
printWriter.println("Echo from server2");
printWriter.flush();


socket.close();
printWriter.close();
scanner.close();


System.out.println("Server has quit.");

}

}
  1. 我启动服务器:java Server.java
  2. 我启动客户端:java Client.java

服务器的输出:

Waiting for client to connect
Client has connected!!
From Client: dataline 1
From Client: dataline 3
From Client: dataline 3

客户端的输出是空的,一个字也没有。

如您所见,服务器的代码终止在从客户端的输出流读取后停止,而客户端的代码终止在它可以从服务器的输出流读取之前停止。

我的问题是:这个 Scanner-PrintWrier 通信是如何工作的,我怎么知道在扫描仪之前打印的 printWriter 是否可以读取这样的服务器 - 客户端连接?我做错了什么,为什么?如何正确使用扫描仪?

编辑:

@T.C 你是这个意思吗?现在我得到了完整的输出,服务器和客户端在发送和接收数据后都退出了。

我是这样修改的:

    String line = "";
while (!line.equals("#")) {

line = scanner.nextLine();
if (!line.equals("#")) {
System.out.println("From server" + line);
}
}

最佳答案

Scanner.hasNext*() 方法阻塞以等待输入进行扫描,因此您无法使用它来检测客户端何时完成发送。

解决这个问题的最简单方法是让客户端发送一个特殊的字符串告诉服务器它已完成发送。

关于java - 代码运行卡在 scanner.hasNextLine(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23713412/

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