socket ftp android,使用 Socket 通信实现 FTP 客户端程序(二)
Socket 客戶端編程主要步驟如下:
1、socket() 創建一個 Socket
2、connect() 與服務器連接
3、write() 和 read() 進行會話
4、close() 關閉 Socket
Socket 服務器端編程主要步驟如下:
socket() 創建一個 Socket
bind()
listen() 監聽
accept() 接收連接的請求
write() 和 read() 進行會話
close() 關閉 Socket
1、客戶端和 FTP 服務器建立 Socket 連接。
2、向服務器發送 USER、PASS 命令登錄 FTP 服務器。
3、使用 PASV 命令得到服務器監聽的端口號,建立數據連接。
4、使用 RETR/STOR 命令下載/上傳文件。
5、在下載完畢后斷開數據連接并發送 QUIT 命令退出。
當客戶端與服務器建立連接后,服務器會返回 220 的響應碼和一些歡迎信息。
struct hostent *hp;
struct sockaddr_in server;
memset(&server, 0, sizeof(struct sockaddr_in));/* 初始化socket */
control_sock = socket(AF_INET, SOCK_STREAM, 0);
hp = gethostbyname(server_name);
memcpy(&server.sin_addr,
hp->h_addr, hp->h_length);
server.sin_family = AF_INET;
server.sin_port = htons(port);
/* 連接到服務器端 */
connect(control_sock,(struct sockaddr *)&server, sizeof(server));
/* 客戶端接收服務器端的一些歡迎信息 */
read(control_sock, read_buf, read_len);
當客戶端發送用戶名和密碼,服務器驗證通過后,會返回 230 的響應碼。然后客戶端就可以向服務器端發送命令了。
圖 2. 客戶端登錄 FTP 服務器
清單 2. 客戶端發送用戶名和密碼,登入 FTP 服務器
/* 命令 ”USER username\r\n” */
sprintf(send_buf,"USER %s\r\n",username);/*客戶端發送用戶名到服務器端 */
write(control_sock, send_buf, strlen(send_buf))
;/* 客戶端接收服務器的響應碼和信息,正常為 ”331 User name okay, need password.” */
read(control_sock, read_buf, read_len);
/* 命令 ”PASS password\r\n” */
sprintf(send_buf,"PASS %s\r\n",password);
/* 客戶端發送密碼到服務器端 */
write(control_sock, send_buf, strlen(send_buf));
/* 客戶端接收服務器的響應碼和信息,正常為 ”230 User logged in, proceed.”*/
read(control_sock, read_buf, read_len);
當客戶端在下載/上傳文件前,要先發送命令讓服務器進入被動模式。服務器會打開數據端口并監聽。并返回響應碼 227 和數據連接的端口號。
sprintf(send_buf,"PASV\r\n");
/* 客戶端告訴服務器用被動模式 */
write(control_sock, send_buf, strlen(send_buf));
/*客戶端接收服務器的響應碼和新開的端口號,* 正常為 ”227 Entering passive mode (
)” */
read(control_sock, read_buf, read_len);
當客戶端發送命令下載文件。服務器會返回響應碼 150,并向數據連接發送文件內容。
當客戶端下載完畢后,發送命令退出服務器,并關閉連接。服務器會返回響應碼 200。
首先,服務器準備就緒后返回 220。客戶端接收到服務器端返回的響應碼后,相繼發送“USER username” 和 “PASS password” 命令登錄。隨后,服務器返回的響應碼為 230 開頭,說明客戶端已經登入了。這時,客戶端發送 PASV 命令讓服務器進入被動模式。服務器返回如 “227 Entering Passive Mode (127,0,0,1,13,67)”,客戶端從中得到端口號,然后連接到服務器的數據端口。接下來,客戶端發送下載命令,服務器會返回響應碼 150,并從數據端口發送數據。最后,服務器返回 “226 transfer complete”,表明數據傳輸完成。
需要注意的是,客戶端不要一次發送多條命令,例如我們要打開一個目錄并且顯示這個目錄,我們得發送 CWD dirname,PASV,LIST。在發送完 CWD dirname 之后等待響應代碼,然后再發送后面一條。當 PASV 返回之后,我們打開另一個 Socket 連接到相關端口上。然后發送 LIST,返回 125 之后在開始接收數據,最后返回 226 表明完成。
在傳輸多個文件的過程中,需要注意的是每次新的傳輸都必須重新使用 PASV 獲取新的端口號,接收完數據后應該關閉該數據連接,這樣服務器才會返回一個 2XX 成功的響應。然后客戶端可以繼續下一個文件的傳輸。
上傳文件與下載文件相比,登入驗證和切換被動模式都如出一轍,只需要改變發送到服務器端的命令,并通過數據連接發送文件內容。
總結
以上是生活随笔為你收集整理的socket ftp android,使用 Socket 通信实现 FTP 客户端程序(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 项目申请书一点总结经验
- 下一篇: LaTeX 写学术论文的一些小技巧