如何使客户端套接字等待来自服务器套接字的数据
我有一个简单的客户端服务器程序。服务器可以接受来自多个客户端的连接。目前,这就是我的客户中正在发生的事情。
1) 在客户端中键入 LIST。服务器会将当前目录中的所有文件发回客户端。2)在客户端中输入“你好”。服务器应发回“你好”。但是,在客户端中,客户端读取空白。
我在客户端中输入“退出”。我只看到来自服务器的Hello消息。
我无法弄清楚为什么客户端在服务器发回Hello msg后不读取它。
客户端代码
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;
}
}