如何在java中使用BufferdReader读取数据直到eof()



你好,我遇到了一个小问题eof()

我在客户端和服务器之间创建了一个tcp连接,将文本发送到服务器和

接收回大写字母但是问题是它只读取一行所以

我想修改代码,使其读取,直到我键入&;stop &;。当我同时输入stop

客户端和接收端同时终止。

这是客户端类

import java.io.*;
import java.net.*;
public class Klient {
/**
* @param args
* @throws IOException 
* @throws UnknownHostException 
*/
public static void main(String[] args) throws UnknownHostException, 
IOException {
String sentence;
String modifiedSentence;
BufferedReader inFromUser = new BufferedReader(new 
InputStreamReader(System.in));
Socket clientSocket = new Socket("127.0.0.1", 6789);
DataOutputStream outToServer = new 
DataOutputStream(clientSocket.getOutputStream());
BufferedReader inFromServer = new BufferedReader(new 
InputStreamReader(clientSocket.getInputStream()));
while (true){
sentence = inFromUser.readLine();
outToServer.writeBytes(sentence + 'n');
modifiedSentence = inFromServer.readLine();
System.out.println(modifiedSentence);
}
//clientSocket.close();
}
}

服务器类

import java.io.*;
import java.net.*;
public class TCPServer {
/**
* @param args
* @throws IOException 
*/
public static void main(String[] args) throws IOException {
String clientSentence;
String capitalizedSentence;
ServerSocket welcomeSocket = new ServerSocket(6789);
while (true){
Socket connectionSocket = welcomeSocket.accept();
BufferedReader inFromClient = new BufferedReader(new 
InputStreamReader(connectionSocket.getInputStream()));
DataOutputStream outToClient = new 
DataOutputStream(connectionSocket.getOutputStream());
clientSentence = inFromClient.readLine();
capitalizedSentence = clientSentence.toUpperCase() + 'n';
outToClient.writeBytes(capitalizedSentence);
}
}

它只读取一个句子,因为服务器没有重复请求新的输入。当然,您有一个while(true)循环,但该循环反复接受新连接(这就是welcomeSocket.accept()所做的)。一旦请求了一行输入,就返回到循环的起点,等待另一个连接的到来。当然,没有更多的连接到来,所以服务器永远什么也不做。

你应该添加一个内循环,

while (true){
Socket connectionSocket = welcomeSocket.accept();
BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
while(true) {
clientSentence = inFromClient.readLine();
if (clientSentence.equalsIgnoreCase("stop")) {
connectionSocket.close();
break;
}
capitalizedSentence = clientSentence.toUpperCase() + 'n';
outToClient.writeBytes(capitalizedSentence);
}
}

一旦服务器收到&;stop&;,它将关闭与当前客户端的连接,并等待另一个客户端连接,因为它返回到外部循环的顶部。如果您希望服务器完全终止(因此只接受一个连接),只需删除外部循环,并关闭welcomeSocket:

ServerSocket welcomeSocket = new ServerSocket(6789);
Socket connectionSocket = welcomeSocket.accept();
BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
while(true) {
clientSentence = inFromClient.readLine();
if (clientSentence.equalsIgnoreCase("stop")) {
connectionSocket.close();
break;
}
capitalizedSentence = clientSentence.toUpperCase() + 'n';
outToClient.writeBytes(capitalizedSentence);
}
welcomeSocket.close();

对于客户端来说,inFromServer.readLine返回null时可以跳出循环,表示连接已经关闭。

while (true){
sentence = inFromUser.readLine();
outToServer.writeBytes(sentence + 'n');
modifiedSentence = inFromServer.readLine();
if (modifiedSentence == null) {
break;
}
System.out.println(modifiedSentence);
}

最新更新