这是我所拥有的服务器的代码:
public class XXServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(4545);
while (true) {
Thread newThread = new Thread(new XXServerRunner(serverSocket.accept()));
newThread.start();
}
}
}
我将为每个接受的套接字提供一个单独的线程:
public class XXServerRunner implements Runnable {
Socket socket;
public XXServerRunner(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (true) {
String readLine = bufferedReader.readLine();
if(readLine!=null) {
System.out.println(readLine);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
这就是我运行客户端的方式:
public class XXClient {
Socket socket;
PrintWriter printWriter;
public static void main(String[] args) throws IOException {
XXClient xxClient = new XXClient();
xxClient.setSocket(new Socket("localhost",4545));
XXClientDataSender xxClientDataSender = new XXClientDataSender(xxClient);
Thread xxClientDataSenderThread = new Thread(xxClientDataSender);
xxClientDataSenderThread.start();
}
public PrintWriter getPrintWriter() {
return printWriter;
}
public void setSocket(Socket socket) throws IOException {
this.socket = socket;
this.printWriter = new PrintWriter(socket.getOutputStream());
}
public void sendText(String stringToBeSent) {
printWriter.write(stringToBeSent);
printWriter.flush();
}
}
我想要实现的是另一个发送文本的线程,所以我有这个:
public class XXClientDataSender implements Runnable {
XXClient xxClient;
Scanner scanner = new Scanner(System.in);
public XXClientDataSender(XXClient xxClient) {
this.xxClient = xxClient;
}
@Override
public void run() {
while (true) {
String stringToBeSent = scanner.nextLine();
xxClient.sendText(stringToBeSent);
}
}
}
当我运行我的代码时会发生什么,我在控制台中键入文本并按Enter键几次,我在运行ServerSocket的控制台中看不到任何内容。但是,当我停止执行主要方法时客户端(我的意思是,当我杀死客户端的Java进程时,我称之为Java进程),在服务器的控制台中,我看到现在看到了所有文本。为什么会这样?
如果我说的不清楚,就像这样: 启动服务器 启动客户端 输入一些文字,点击输入..没什么 输入一些文字,点击输入..没什么 杀死客户端的流程 现在所有文本都由服务器读取。
为什么?
我杀死客户端进程后,我也得到了这个例外:
Exception in thread "Thread-0" java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Scanner.java:1585)
at XXClientDataSender.run(XXClientDataSender.java:20)
at java.lang.Thread.run(Thread.java:745)
答案 0 :(得分:4)
每次发送时都在客户端代码中写一个换行符。
您正在使用BufferedReader#readLine()
,它需要换行符号或流的结尾。