我正在寫一個簡單的FTP客戶端/服務器設置。客戶端應該能夠從服務器檢索文件,並將結果作爲字節流放入/ retr_files/filex中。從服務器發送適當的響應,並確實在該文件夾中創建file1。但是,太多的字節被髮送(或接收)。我在一個9.6kB的文件上測試了這個文件,它在客戶端的文件是16.6kB。奇。我覺得我在這裏錯過了一些明顯的東西,有人可以幫我嗎? 謝謝!客戶端從服務器讀取太多字節?
相關代碼:
客戶:
BufferedReader inFromServer_d = null;
if(welcomeSocket!=null){
if(!welcomeSocket.isClosed()){
welcomeSocket.close();
}
}
try {
welcomeSocket = new ServerSocket(port);
System.out.print("PORT " + myIP + "," + num1 + "," + num2 + "\r\n");
out.writeBytes("PORT " + myIP + "," + num1 + "," + num2 + "\r\n");
System.out.print(parseReply(getResponse()));
System.out.print("RETR " + pathname + "\r\n");
out.writeBytes("RETR " + pathname + "\r\n");
String reply = parseReply(getResponse());
if (reply.charAt(10)=='1') {
System.out.print(reply);
System.out.print(parseReply(getResponse()));
try{
clientSocket_d = welcomeSocket.accept();
} catch (IOException e) {
System.out.print("GET failed, FTP-data port not allocated.\r\n");
System.exit(-1);
}
inFromServer_d = new BufferedReader(new InputStreamReader(
clientSocket_d.getInputStream()));
// READ
BufferedReader bufferedReader = inFromServer_d;
FileWriter output = new FileWriter("retr_files/file" + retrCnt);
BufferedWriter bufferedWriter = new BufferedWriter(output);
String length;
while ((length = bufferedReader.readLine()) != null) {
bufferedWriter.write(length + "\n");
}
bufferedReader.close();
bufferedWriter.close();
clientSocket_d.close();
服務器:
//TCP CONNECT
DataOutputStream outToClient_d = null;
Socket clientSocket1 = null;
try {
ipAddress = ipAddress.substring(0, ipAddress.length()-1);
clientSocket1 = new Socket(ipAddress, portNumber);
outToClient_d = new DataOutputStream(clientSocket1.getOutputStream());
}
catch(UnknownHostException e){
out.writeBytes("425 Can not open data connection.\r\n");
}
BufferedReader bufferedReader = new BufferedReader(input);
String length;
while((length = bufferedReader.readLine())!=null){
outToClient_d.writeBytes(length+"\n");
}
out.writeBytes("250 Requested file action completed.\r\n");
bufferedReader.close();
clientSocket1.close();
outToClient_d.close();
}
哈哈,這很有道理。謝謝! – Haskell 2013-03-26 22:57:09