我有一个简单的客户端服务器程序.服务器可以接受多个客户端的连接.目前这是我的客户端发生的事情.
1)在客户端输入LIST.服务器将当前目录中的所有文件发送回客户端.2)在客户端输入"Hello".服务器应该发回"你好".但是,在客户端中,客户端读取空白.
我在客户端输入"QUIT".我只从服务器上看到Hello msg.
我无法弄清楚为什么客户端在服务器发回Hello消息后不会读取它.
客户代码
import java.net.*; // Contains Socket classes
import java.io.*; // Contains Input/Output classes
import java.nio.CharBuffer;
class ClntpracticeSandbox{
public static void main(String argv[]){
try{
//
Socket client=new Socket("localhost", 7777);
System.out.println("Connected to server " + client.getInetAddress()
+ ": " + client.getPort());
System.out.println("local port is " + client.getLocalPort());
BufferedReader kbreader;
BufferedWriter writer;
BufferedReader reader;
kbreader = new BufferedReader(new InputStreamReader(System.in));
writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
String data = "", datakb, line=null;
do{
System.out.print("Text to the server? ");
datakb = kbreader.readLine();
writer.write(datakb);
writer.newLine();
writer.flush();
System.out.print("Received from the Server: ");
line = reader.readLine();
while (line.equals("")==false){
System.out.println(line);
line = reader.readLine();
}
} while (datakb.trim().equals("QUIT")==false);
client.close();
System.exit(0);
}catch(Exception e){
System.err.println("Exception: " + e.toString());
}
}
}
Run Code Online (Sandbox Code Playgroud)
服务器代码
import java.net.*; // Contains Socket classes
import java.io.*; // Contains Input/Output classes
import java.nio.file.*;
class SrvrpracticeSandbox{
public static void main(String argv[]) throws IOException {
ServerSocket s = new ServerSocket(7777);
System.out.println("Server waiting for client on port " + s.getLocalPort());
int count = 0;
do {
count = count + 1;
Socket connected = s.accept();
new clientThread(connected, count).start();
} while (true);
}
}
class clientThread extends Thread {
Socket myclientSocket = null;
int mycount;
DataInputStream is = null;
PrintStream os = null;
public clientThread(Socket clientSocket, int count) {
this.myclientSocket = clientSocket;
this.mycount = count;
}
public void run() {
try {
System.out.println("New connection accepted " + myclientSocket.getInetAddress() + ": " + myclientSocket.getPort());
BufferedReader reader;
BufferedWriter writer;
reader = new BufferedReader(new InputStreamReader(myclientSocket.getInputStream()));
writer = new BufferedWriter(new OutputStreamWriter(myclientSocket.getOutputStream()));
String data;
String testdirectory = "file1.txt\nfile2.txt\nfile3.txt";
do{
data = reader.readLine();
System.out.println("Received from " +mycount + ":" + data);
if (data.equals("LIST")) {
writer.write(mycount + "\n"+"150 - Transfer Initiated."+"\n"+
"DATA " +returnDirectoryList().getBytes().length + "\n" +
returnDirectoryList() + "\r\n");
} else {
writer.write("Server Echos to " + mycount + ":"+ data + "\n"+"This is a new line."+"\r\n");
}
writer.newLine();
writer.flush();
}while (data.equals("QUIT") == false);
myclientSocket.close();
System.exit(0);
} catch (IOException ex) {
}
}
private String returnDirectoryList()
{
String files = "";
Path dir = Paths.get(".");
try {
DirectoryStream<Path> stream =
Files.newDirectoryStream(dir);
for (Path file: stream) {
files = files + file.getFileName() +"\n";
}
} catch (IOException | DirectoryIteratorException x) {
System.err.println("returnDirectoryList "+x.toString());
}
return files;
}
}
Run Code Online (Sandbox Code Playgroud)
小智 9
对不起,我不会说英语,这是我的第一个回答.尝试等待服务器响应:
do{
System.out.print("Text to the server? ");
datakb = kbreader.readLine();
writer.write(datakb);
writer.newLine();
writer.flush();
System.out.print("Received from the Server: ");
DataInputStream dataInputStream = new DataInputStream(client.getInputStream());
int attempts = 0;
while(dataInputStream.available() == 0 && attempts < 1000)
{
attempts++;
Thread.sleep(10)
}
reader = new BufferedReader(dataInputStream);
line = reader.readLine();
while (line.equals("")==false){
System.out.println(line);
line = reader.readLine();
}
} while (datakb.trim().equals("QUIT")==false);
client.close();
System.exit(0);
}catch(Exception e){
System.err.println("Exception: " + e.toString());
}
...
Run Code Online (Sandbox Code Playgroud)
小智 1
问题是因为客户端在从服务器读取 LIST 输出时缺少空行。因此,在 LIST 命令之后,服务器和客户端变得不同步。
在客户端代码中,将这两行添加到 do while 循环的末尾。做 {
if (datakb.equals("LIST"))
reader.readLine();
}while( ..)
Run Code Online (Sandbox Code Playgroud)
它应该已经读取了遗漏的行,并且问题应该消失。