我有一個簡單的客戶端服務器程序。服務器可以接受多個客戶端的連接。目前這是我的客戶正在發生的事情。
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());
}
}
}
服務器代碼
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;
}
}
hello peter我希望服務器繼續處理來自客戶端的請求,直到客戶端發送QUIT。當客戶端從服務器讀取請求時,主要問題是在客戶端。對於從客戶端發送的QUIT以外的請求,客戶端從服務器讀取「」。 – shresthaal 2012-02-16 14:00:06
查看上面的代碼和輸出 – 2012-02-29 18:05:04