當前位置:首頁 » 文件管理 » socket實現ftp客戶端

socket實現ftp客戶端

發布時間: 2022-10-07 04:43:20

A. java實現ftp客戶端,獲得IP和埠號的問題

InetAddress ip=InetAddress.getByName(args[0]);//第一個輸進來的是ip
int port = Integer.parseInt(args[1]);//e\第二個輸進來的是埠號
這兩個就是接收參數

B. 誰來幫我弄一下,最好簡短一點的,好的一定會加分的!

一個簡單的FTP程序,阻塞模式。DELPHI版。

//客戶端
program ftpc;

{$APPTYPE CONSOLE}

uses
Windows,
Winsock,
Classes,
SysUtils;

const
recv_port = 2000;
send_port = 3000;
max_filesize = 32*1024;
type
filedata = record
ffname : array[0..29]of char;
ffdata : array[0..max_filesize-1] of char;
len : integer;
end;
var
sock : TSOCKET;
sa : SOCKADDR_IN;
dp : filedata;
f : TFileStream;
wsd : TWSAData;
s : string;
i : integer;
begin
{ TODO -oUser -cConsole Main : Insert code here }
if WSAStartup(makeword(2,2),wsd) <> 0 then
begin
writeln('sock initialize error.');
exit;
end;
sa.sin_family:=AF_INET;
sa.sin_addr.S_addr:=inet_addr('127.0.0.1');
sa.sin_port:=htons(recv_port);

sock := socket(af_inet,sock_stream,0);
if sock=socket_error then
begin
writeln('create socket error.');
WSACleanup;
exit;
end;
while connect(sock,sa,sizeof(sa))=socket_error do
write('connecting...'+#13);
writeln;
writeln('connected OK.');
while true do
begin
writeln('input your file to send:(''exit'' to quit)');
readln(s);
if s='exit' then
begin
strp(dp.ffdata,s);
strp(dp.ffname,s);
dp.len:=12;
i :=send(sock,dp,12,0);
if i <= 0 then
begin
writeln('send file error.');
closesocket(sock);
WSACleanup;
exit;
end;
break;
end
else
begin
f:=TFileStream.Create(s,fmOpenRead);
f.Read(dp.ffdata,f.Size);
strp(dp.ffname,s);
//dp.ffname:=@s;
dp.len:=f.Size;
f.Free;
i :=send(sock,dp,sizeof(dp),0);
if i <= 0 then
begin
writeln('send file error.');
closesocket(sock);
WSACleanup;
exit;
end;
end;
end;
end.

//服務端
program ftps;

{$APPTYPE CONSOLE}

uses
Windows, WinSock, Classes, SysUtils;

const
recv_port = 2000;
send_port = 3000;
max_filesize = 32 * 1024;

type
FileData = record
ffname : array[0..29]of char;
ffdata : array[0..max_filesize-1]of char;
len : integer;
end;

var
sock,sock1 : TSOCKET;
sa,ca : SockAddr_in;
addrlen : integer;
dp : filedata;
wsd : TWSADATA;
f : TFileStream;
s : string;
begin
{ TODO -oUser -cConsole Main : Insert code here }

if WSAStartup(makeword(2,2),wsd) <> 0 then
begin
messagebox(0,'fail to initialize winsocks.','information',mb_ok);
exit;
end;
sock :=socket(af_inet,sock_stream,0);
if sock = socket_error then
begin
messagebox(0,'fail to create socket.','information',mb_ok);
WSACleanup;
exit;
end;
sa.sin_family := af_inet;
sa.sin_addr.S_addr:=htonl(inaddr_any);
sa.sin_port:=htons(recv_port);
if bind(sock,sa,sizeof(TSockAddrIn)) = socket_error then
begin
messagebox(0,'fail to bind socket.','information',mb_ok);
exit;
end;

addrlen := sizeof(TSockAddrIn);
if listen(sock,5) < 0 then
begin
messagebox(0,'fail to listen.','information',mb_ok);
exit;
end;
//messagebox(0,'listening...','information',mb_ok);
writeln('Listening...');
while true do
begin
sock1 := accept(sock,@ca,@addrlen);
while true do
begin
zeromemory(@dp.ffname,30);
zeromemory(@dp.ffdata,max_filesize);
dp.len := 0;
if recv(sock1,dp,sizeof(dp),0) <= 0 then break;
s:=dp.ffname;
if s='exit' then
begin
WSACleanup;
exit;
end;
writeln('received file:'+dp.ffname+' length:'+inttostr(dp.len));
f := TFileStream.Create(dp.ffname,fmOpenWrite);
f.Write(dp.ffdata,dp.len);
f.Write('check ok',8);
f.Free;
end;
end;
end.

C. Java ftp 伺服器 SYST

Socket 編程的幾個重要步驟
Socket 客戶端編程主要步驟如下:
socket() 創建一個 Socket
connect() 與伺服器連接
write() 和 read() 進行會話
close() 關閉 Socket
Socket 伺服器端編程主要步驟如下:
socket() 創建一個 Socket
bind()
listen() 監聽
accept() 接收連接的請求
write() 和 read() 進行會話
close() 關閉 Socket

D. c++寫的ftp程序,用的socket,一段時間後會報10055或10060或10061錯誤

代碼貼出來吧,您是怎麼實現的ftp?ftp分為數據會話和命令會話,如果實在搞不定,建議你用Poco庫,裡面有現成的ftp

E. 如何非同步讀取FTP

一:開發背景
由於需要對多個伺服器發布大的數據包,所以自己在LINUX用C語言,開發了一個傳送器工具。因為上傳時需要支持斷點續傳,所以自己參考ftp-rfc959和一些文章開發了這個支持斷點續傳的上傳工具。整個工具分兩部分開發的:一是支持斷點續傳的Ftp工具,包含下載和上傳功能。二是同時對多個伺服器發布不同數據包的傳送器工具。本文只是對斷點續傳的商船和下載作探討。

二:實現
其實Ftp上傳下載的實現很簡單,首先Ftp伺服器端要支持文件的定位,
然後就是通過建立的Socket用Ftp伺服器命令和伺服器交互.
有些也可以通過Socket做自己的客戶端和伺服器端,但是有些伺服器是自己能管理控制的,而且原來自己也寫過一些這樣C/S模式的工具,簡單消息的傳送接收還不錯。
但用來傳輸文件效率很低,比文件傳送協議FTP(File Transfer Protocol)差的太多。 利用Ftp的服務端可以省去伺服器端的開發,而且可以向任何開放Ftp服務的伺服器上傳送文件,可以不考慮對方安裝的
是什麼的操作系統。

三:FTP
文件傳送協議 FTP 只提供文件傳送的一些基本的服務,它使用 TCP 可靠的運輸服務。FTP 的主要功能是減少或消除在不同操作系統下處理文件的不兼容性。
FTP 使用客戶伺服器方式。
一個 FTP 伺服器進程可同時為多個客戶進程提供服務。FTP的伺服器進程由兩大部分組成:一個主進程,負責接受新的請求;另外有若干個從屬進程,負責處理單個請求。
A、通常的方式:
控制連接在整個會話期間一直保持打開,FTP 客戶所發出的傳送請求通過控制連接發送給控制進程,但控制連接並不用來傳送文件,實際用於傳輸文件的是「數據連接」。
控制進程在接收到 FTP 客戶發送來的文件傳輸請求後就創建一個「數據傳送進程」和一個「數據連接」,並將數據連接連接到「數據傳送進程」,數據傳送進程實際完成文件的傳送,在傳送完畢後關閉「數據傳送連接」並結束運行
當客戶進程向伺服器進程發出建立連接請求時,要尋找連接伺服器進程的熟知埠(21),同時還要告訴伺服器進程自己的另一個埠號碼,用於建立數據傳送連接。接著,伺服器進程用自己傳送數據的熟知埠(20)與客戶進程所提供的埠號碼建立數據傳送連接。

B、 被動模式:
FTP客戶端發出的連接請求,一般通過伺服器的21號埠建立控制連接,專門用來傳輸一些字元串命令和響應信息。控制命令通道一定是由客戶端向伺服器的連接(默認的埠是21,也可以指定埠,這要看伺服器的設置)。
PASV:通過控制通道通過發送PASV 伺服器命令到 FTP伺服器。請求建立被動模式數據連接通道。 (客戶端的命令 passive)
伺服器返回連接的信息(227 Entering Passive Mode (70,0,10,62,120,18) )地址和埠。埠=最後第二位乘256再加上最後一位(120*256+18)。(注意埠設為0的情況) 如: *f_port = atoi(port_1) * 256 + atoi(port_2);
伺服器端和客戶端身份轉換,原客戶端在本地建立監聽,監聽來自原伺服器遠端的連接請求建立數據連接通道。
四、 實現方法:
A、下載:
1、向伺服器發送「REST + 本地文件長度」,告訴伺服器,客戶端要斷點下載了。這時伺服器還不知道客戶端要下載的文件名;
2、向伺服器發送"RETR + 文件名",通知伺服器要下載的文件名,這時伺服器開始定位文件指針讀文件並發送數據。
3、客戶端定位本地文件指針偏移到文件末尾;
4、兩端的准備工作都做完了以後,客戶端創建socket,以被動或非被動方式建立數據鏈接,循環調用recv接收文件數據並追加到本地文件末尾;

B、上傳:
1、獲取伺服器上和本地要上傳文件的同名文件大小;
2、向伺服器發送「APPE + 文件名」,通知伺服器,從數據通道發送給你的數據要附加到這個文件末尾。
3、定位本地文件指針,文件指針偏移到指定位置,這個位置與FTP伺服器上文件大小相同的位置。
4、從文件指針處讀數據並發送。

C、Ftp伺服器命令
我們平時使用的命令,大多是客戶端的。伺服器端的命令可以參考下面:
命令 描述
ABOR 中斷數據連接程序 ACCT <account> 系統特權帳號
ALLO <bytes> 為伺服器上的文件存儲器分配位元組 APPE <filename> 添加文件到伺服器同名文件
CDUP <dir path> 改變伺服器上的父目錄 CWD <dir path> 改變伺服器上的工作目錄
DELE <filename> 刪除伺服器上的指定文件 HELP <command> 返回指定命令信息 LIST <name> 如果是文件名列出文件信息,如果是目錄則列出文件列表 MODE <mode> 傳輸模式(S=流模式,B=塊模式,C=壓縮模式)
MKD <directory> 在伺服器上建立指定目錄 NLST <directory> 列出指定目錄內容
NOOP 無動作,除了來自伺服器上的承認 PASS <password> 系統登錄密碼
PASV 請求伺服器等待數據連接 PORT <address> IP 地址和兩位元組的埠 ID PWD 顯示當前工作目錄 QUIT 從 FTP 伺服器上退出登錄
REIN 重新初始化登錄狀態連接 REST <offset> 由特定偏移量重啟文件傳遞
RETR <filename> 從伺服器上找回(復制)文件 RMD <directory> 在伺服器上刪除指定目錄
RNFR <old path> 對舊路徑重命名 RNTO <new path> 對新路徑重命名
SITE <params> 由伺服器提供的站點特殊參數 SMNT <pathname> 掛載指定文件結構
STAT <directory> 在當前程序或目錄上返回信息 STOR <filename> 儲存(復制)文件到伺服器上
STOU <filename> 儲存文件到伺服器名稱上 STRU <type> 數據結構(F=文件,R=記錄,P=頁面)
SYST 返回伺服器使用的操作系統 TYPE <data type> 數據類型(A=ASCII,E=EBCDIC,I=binary)
USER <username>> 系統登錄的用戶名
D、伺服器返回的部分數字代碼含義
125 Data connection already open; Transfer starting.
226 Transfer complete.
227 Entering Passive Mode (127,0,0,1,4,18).
230 User xxxxx logged in.
331 Password required for xxxxx.
425 Can』t open data connection.
226 Closing data connection.
200 return a state of TYPE or MODE commond
220 connection state
五、關於Socket
關於Socket編程有很多參考資料,這里不作詳細說明
Socket是應用層與TCP/IP協議族通信的中間軟體抽象層,它是一組介面
Socket 是一個基本的通信機制Socket把復雜的TCP/IP協議族隱藏在Socket介面後面,對用戶來說,一組簡單的介面就是全部,讓Socket去組織數據,以符合指定的協議.
Socket也具有一個類似於打開文件的函數調用Socket(),該函數返回一個整型的Socket描述符,隨後的連接建立、數據傳輸等操作都是通過該Socket實現的。
常用的Socket類型有兩種:
A、流式Socket(SOCK_STREAM):流式是一種面向連接的Socket,針對於面向連接的TCP服務應用。
B、數據報式Socket(SOCK_DGRAM):數據報式Socket是一種無連接的Socket,對應於無連接的UDP服務應用。
Socket的程序是一種C/S結構,分客戶端和伺服器端。
A、客戶端
– 初始化Socket
– 連接伺服器(connect),如果連接成功,這時客戶端與伺服器端的連接就建立了
– 客戶端發送數據請求,伺服器端接收請求並處理請求,然後把回應數據發送給客戶端
– 客戶端讀取數據,最後關閉連接,一次交互結束。
B、伺服器端
- 初始化Socket
- 埠綁定(bind)
- 監聽(listen)埠
- 調用accept阻塞,等待客戶端連接
在這里我們使用的就是面向連接的流式Socket,只編寫客戶端的程序。

六、代碼:
下面僅提供一個編譯過並在使用中的函數簡單的說明其實現原理,
需要有一點C語言和Linux/UNIX的socket編程基礎即可理解。
只是建立連接和傳輸部分的一個函數。當文件傳出結束或斷開時,
可以調用檢查函數看是否成功,位元組是否正常等,如果不正常結束,
可以再次循環調用它並定為伺服器文件的位元組,繼續傳輸。
其他的控制和功能都在其他函數中實現。為移植方便使用標准C語法符合C89標准。
code:
/*****************************************************************
* FileName: uftt_ver5.c *
* Company: algorithmics china lib Co.,Ltd. *
* Author: G.L.Zhang --- zglcl008 *
* Time: [2006-12-20] *
* Description: uninterrupted file transfers tools *
*****************************************************************/

int f_file_trans(const char *ft_addr, int ft_port, const char *ft_usr,const char *ft_pwd, const char *ft_opt, const char *ft_src, char *ft_obj, int ft_flg)
{
int cmd_sock = -1;
int dat_sock = -1;
int stream_sock= -1;
int dat_port = 0;
char dat_buffer[1024*5];
struct sockaddr_in f_server;
struct sockaddr_in f_datasvr;
unsigned char *pasv_ip = NULL;
unsigned char *pasv_port = NULL;
unsigned int len_addr = 0;
long rc_size = 0;
/* long svr_file_size = 0; */
long file_size = 0;
int rc = 0;
if (ft_addr == NULL || ft_usr == NULLft_pwd == NULL ||
ft_opt == NULL || ft_src == NULL || ft_obj == NULL ||
ft_port == 0 || ft_flg < 0) {
err_quit("--- file transfers parameter error");
}
/* get ftp commomd socket */
if ((cmd_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("cmmond socket");
err_quit("--- command sock error");
}

bzero(&f_server, sizeof(f_server));
f_server.sin_family = AF_INET;
f_server.sin_port = htons(ft_port);
f_server.sin_addr.s_addr = inet_addr(ft_addr);

if (connect(cmd_sock, (struct sockaddr *)&f_server, sizeof(f_server)) < 0) {
perror("connect");
err_quit("--- command sock error");
}
rc = uftt_cmd(dat_buffer, cmd_sock, NULL);
if (rc == 220)
printf("-1- %d OK\n", rc);
else
printf("-1- %d ERR\n", rc);

rc = uftt_cmd(dat_buffer, cmd_sock,"USER %s",ft_usr);
if (rc == 331)
printf("-2- %d OK\n", rc);
else
printf("-3- %d ERR\n", rc);
rc = uftt_cmd(dat_buffer, cmd_sock,"PASS %s",ft_pwd);
if (rc == 230)
printf("-3- %d OK\n", rc);
else
printf("-3- %d ERR\n", rc);
rc = uftt_cmd(dat_buffer, cmd_sock, "TYPE I");
if (rc == 200)
printf("-41- %d OK\n", rc);
else
printf("-41- %d ERR\n", rc);
rc = uftt_cmd(dat_buffer, cmd_sock, "MODE S");
if (rc == 200)
printf("-42- %d OK\n", rc);
else
printf("-42- %d ERR\n", rc);

memset(dat_buffer, ''\0'', sizeof(dat_buffer));
rc = uftt_cmd(dat_buffer, cmd_sock, "PASV");
if (rc == 227)
printf("-5- %d OK\n", rc);
else
printf("-5- %d ERR\n", rc);
#ifdef ZGL_DEBUG
printf("-5- %d %s\n", rc, dat_buffer);
#endif
/* get passive port */
dat_port = 0;
if ((rc = get_svr_port(dat_buffer, (int *)&dat_port)) < 0)
err_quit("data stream port error");
#ifdef ZGL_DEBUG
printf("--- pasive port=[%d]\n", dat_port);
#endif
if ((dat_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("data socket");
err_quit("--- data sock error");
}
len_addr = sizeof(f_datasvr);
bzero(&f_datasvr, sizeof(f_datasvr));
rc = getsockname(cmd_sock, (struct sockaddr *)&f_datasvr, (unsigned int *)&len_addr);
f_datasvr.sin_port = htons(dat_port);
/* 0=all port or appoint port TEST OK ***
f_datasvr.sin_port = htons(dat_port);
f_datasvr.sin_port = 0;
*/
if (bind(dat_sock,(struct sockaddr *)&f_datasvr,len_addr) == -1)
err_sys("--- data sock bind error");
if (listen(dat_sock,1) == -1)
err_sys("--- data sock bind error");
rc = getsockname(dat_sock, (struct sockaddr *)&f_datasvr, (unsigned int *)&len_addr);
pasv_ip = (unsigned char *)&f_datasvr.sin_addr;
pasv_port = (unsigned char *)&f_datasvr.sin_port;
rc = uftt_cmd(dat_buffer, cmd_sock,"PORT %d,%d,%d,%d,%d,%d",pasv_ip[0],
pasv_ip[1], pasv_ip[2], pasv_ip[3], pasv_port[0], pasv_port[1]);
if (rc == 200)
printf("-6- %d OK\n", rc);
else
printf("-6- %d ERR\n", rc);

/* get RETR put STOR append APPE */
if (ft_flg == 0) {
rc = uftt_cmd(dat_buffer, cmd_sock, "STOR %s", ft_obj);
}
else if (ft_flg > 0){
rc = uftt_cmd(dat_buffer, cmd_sock, "APPE %s", ft_obj);
}
if (rc == 150)
printf("-7- %d OK\n", rc);
else
printf("-7- %d ERR\n", rc);
stream_sock = accept(dat_sock, (struct sockaddr *)&f_datasvr, (unsigned int *)&len_addr);
if (stream_sock < 0)
err_sys("--- stream socket error");
rc_size = f_put_file(stream_sock, ft_src, ft_obj, ft_flg, file_size);
/* do without ***
rc = uftt_cmd(dat_buffer, dat_sock,"QUIT");
printf("-8- %d \n", rc);
*/
close(stream_sock);
close(dat_sock);
rc = uftt_cmd(dat_buffer, cmd_sock,"QUIT");
if (rc == 226)
printf("-9- %d OK\n", rc);
else
printf("-9- %d ERR\n", rc);
close(cmd_sock);
return rc_size ;
}

F. 用socket寫FTP客戶端問題

是的。
需要有兩個套接字,一個用於命令(cmdSocket),一個用於數據(dataSocket)
cmdSocket與ftp伺服器21埠(如果ftp伺服器沒做特殊設置的話)連接,dataSocket因PASV和PORT模式不同,而有所差別。
PASV模式:
1)通過命令cmdSocket套接字發送PASV
2)server端會返回ip地址和專門的數據傳輸埠號
3)在命令套接字cmdSocket上發送LIST命令
4)本地建立dataSocket連接server提供的數據傳輸埠號(此步中,本地作為客戶端)
5)server端通過cmdSocket返回150 開頭的響應(需要讀取cmdSocket)
6)本地通過dataSocket接收數據,即通過dataSocket的inputStream讀取dataSocket中的數據
7)傳輸完畢(read返回-1),cmdSocket會返回226 開頭的響應,關閉連接即可
PORT模式:
1)在本地啟動某個埠的監聽(本地作為服務端,使用ServerSocket)
2)通過命令cmdSocket套接字發送PORT,PORT命令後加參數:本地ip+剛啟動監聽的埠
3)server端響應200
4)在cmdSocket上發送LIST命令
5)調用ServerSocket.accept()獲得數據套接字dataSocket(ftp server作為客戶連接本地的埠)
6)server端通過cmdSocket返回150 開頭的響應(需要讀取cmdSocket)
7)本地通過dataSocket接收數據,即通過dataSocket的inputStream讀取dataSocket中的數據
8)傳輸完畢(read返回-1),cmdSocket會返回226 開頭的響應,關閉連接即可

G. 用socket實現ftp上傳文件怎麼寫,怎麼打開文件讀取文件,VS2008 用C

FILE *file = fopen("111.txt", "r") //打開文件
fread(buf, 1, nSize, file); //讀取文件
具體使用你可以參看下 fopen與fread這兩個C函數的使用說明

H. 想用socket+mfc寫一個ftp伺服器,但是文件操作出了問題,不知道怎麼寫,網上沒有這方面的教

//MFC里有CFtpConnection,你可以直接使用,不需要自己去寫
CInternetSessionsess(_T("MyFTPSession"));

CFtpConnection*pConnect=NULL;

try
{
//Requestaconnectiontoftp.microsoft.com.Default
//parametersmeanthatwe'lltrywithusername=ANONYMOUS
//@domainname
pConnect=sess.GetFtpConnection(_T("ftp.microsoft.com"));

//
CFtpFileFindfinder(pConnect);

//startlooping
BOOLbWorking=finder.FindFile(_T("*"));

while(bWorking)
{
bWorking=finder.FindNextFile();
_tprintf_s(_T("%s "),(LPCTSTR)finder.GetFileURL());
}
}
catch(CInternetException*pEx)
{
TCHARsz[1024];
pEx->GetErrorMessage(sz,1024);
_tprintf_s(_T("ERROR!%s "),sz);
pEx->Delete();
}

//iftheconnectionisopen,closeit
if(pConnect!=NULL)
{
pConnect->Close();
deletepConnect;
}

I. 求用java寫一個ftp伺服器客戶端程序。

import java.io.*;
import java.net.*;public class ftpServer extends Thread{ public static void main(String args[]){
String initDir;
initDir = "D:/Ftp";
ServerSocket server;
Socket socket;
String s;
String user;
String password;
user = "root";
password = "123456";
try{
System.out.println("MYFTP伺服器啟動....");
System.out.println("正在等待連接....");
//監聽21號埠
server = new ServerSocket(21);
socket = server.accept();
System.out.println("連接成功");
System.out.println("**********************************");
System.out.println("");

InputStream in =socket.getInputStream();
OutputStream out = socket.getOutputStream();

DataInputStream din = new DataInputStream(in);
DataOutputStream dout=new DataOutputStream(out);
System.out.println("請等待驗證客戶信息....");

while(true){
s = din.readUTF();
if(s.trim().equals("LOGIN "+user)){
s = "請輸入密碼:";
dout.writeUTF(s);
s = din.readUTF();
if(s.trim().equals(password)){
s = "連接成功。";
dout.writeUTF(s);
break;
}
else{s ="密碼錯誤,請重新輸入用戶名:";<br> dout.writeUTF(s);<br> <br> }
}
else{
s = "您輸入的命令不正確或此用戶不存在,請重新輸入:";
dout.writeUTF(s);
}
}
System.out.println("驗證客戶信息完畢...."); while(true){
System.out.println("");
System.out.println("");
s = din.readUTF();
if(s.trim().equals("DIR")){
String output = "";
File file = new File(initDir);
String[] dirStructure = new String[10];
dirStructure= file.list();
for(int i=0;i<dirStructure.length;i++){
output +=dirStructure[i]+"\n";
}
s=output;
dout.writeUTF(s);
}
else if(s.startsWith("GET")){
s = s.substring(3);
s = s.trim();
File file = new File(initDir);
String[] dirStructure = new String[10];
dirStructure= file.list();
String e= s;
int i=0;
s ="不存在";
while(true){
if(e.equals(dirStructure[i])){
s="存在";
dout.writeUTF(s);
RandomAccessFile outFile = new RandomAccessFile(initDir+"/"+e,"r");
byte byteBuffer[]= new byte[1024];
int amount;
while((amount = outFile.read(byteBuffer)) != -1){
dout.write(byteBuffer, 0, amount);break;
}break;

}
else if(i<dirStructure.length-1){
i++;
}
else{
dout.writeUTF(s);
break;
}
}
}
else if(s.startsWith("PUT")){
s = s.substring(3);
s = s.trim();
RandomAccessFile inFile = new RandomAccessFile(initDir+"/"+s,"rw");
byte byteBuffer[] = new byte[1024];
int amount;
while((amount =din.read(byteBuffer) )!= -1){
inFile.write(byteBuffer, 0, amount);break;
}
}
else if(s.trim().equals("BYE"))break;
else{
s = "您輸入的命令不正確或此用戶不存在,請重新輸入:";
dout.writeUTF(s);
}
}

din.close();
dout.close();
in.close();
out.close();
socket.close();
}
catch(Exception e){
System.out.println("MYFTP關閉!"+e);

}
}}

J. socket編程:FTP協議客戶端 CAsynSocket類的問題

我之前寫過一個示例的FTP伺服器。FTP協議和HTTP協議一樣,都是屬於一問一答的,當你的命令連接與FTP伺服器連接後,就要等待響應伺服器的歡迎信息 220, 然後再發送請求進行登陸,發送完後不要再發送其他命令了,一定要等剛剛的請求響應完成。所以你不要一次性把4個命令全部發送過去。一定要保證一問一答。

熱點內容
2013年二級c語言真題 發布:2024-10-08 10:44:47 瀏覽:242
linux的locale 發布:2024-10-08 10:44:36 瀏覽:91
2rsa演算法 發布:2024-10-08 10:29:53 瀏覽:542
南京社保密碼多少 發布:2024-10-08 10:21:01 瀏覽:472
國內的少兒編程 發布:2024-10-08 10:21:00 瀏覽:520
vscode編譯調試閃退 發布:2024-10-08 10:19:27 瀏覽:671
oracle資料庫用戶許可權 發布:2024-10-08 09:46:00 瀏覽:708
立方的演算法口訣 發布:2024-10-08 09:44:30 瀏覽:820
python輸入到excel表格 發布:2024-10-08 09:36:31 瀏覽:285
腳本拒絕訪問閃退 發布:2024-10-08 09:34:55 瀏覽:939