一組socket能否實現上傳和下載的功能?(200分)

  • 主题发起人 主题发起人 takdick
  • 开始时间 开始时间
T

takdick

Unregistered / Unconfirmed
GUEST, unregistred user!
請問只用一組clientsocket和serversocket能否實現上傳和下載的功能?
也就是在socket onread事件中需要sendbuf和receivebuf.
可以的話請給個例子,謝謝.
 
实现肯定是没有问题。
 
我用以下使用socket接收文件的代碼試了好多次,但水平實在有限,執行時總是出現錯誤,可否幫我修改一下?謝謝.

clent端的:
private
stream : TMemoryStream;

size,count : integer;
end;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Address := Edit1.Text;
ClientSocket1.Active := True;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
stream := TMemoryStream.Create;
stream.LoadFromFile(OpenDialog1.FileName);
size := stream.Size;
count := 0;
ClientSocket1.Socket.SendText(inttostr(size));
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
rcvtxt : string;
buf : array [1..2048] of char;
left : integer;
begin
rcvtxt := Socket.ReceiveText;
left := size - count;
if AnsiPos('go~',rcvtxt)=1 then
begin
if sizeof(buf)<left then
begin
stream.Read(buf,sizeof(buf));
Socket.SendBuf(buf,sizeof(buf));
count := count + sizeof(buf);
end
else
begin
stream.Read(buf,left);
Socket.SendBuf(buf,left);
end;
end;
end;

Server端(收方)
private
Tof : file;
size,count :integer;
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
ServerSocket1.Active := True;
StatusBar1.SimpleText := 'Listening...';
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
buf : array [1..2048] of char;
rcvtxt : string;
left,len : integer;
begin
len := Socket.ReceiveLength;
if len<10 then
begin
rcvtxt := Socket.ReceiveText;
size := strtoint(rcvtxt);
count := 0;
AssignFile(ToF,SaveDialog1.FileName);
Rewrite(ToF, 1);
Socket.SendText('go~');
end
else
begin
left := size - count;
if sizeof(buf)<left then
begin
Socket.ReceiveBuf(buf,sizeof(buf));
BlockWrite(Tof,buf,sizeof(buf));
count := count + sizeof(buf);
Socket.SendText('go~');
end
else
begin
Socket.ReceiveBuf(buf,left);
BlockWrite(Tof,buf,left);
CloseFile(Tof);
end;
end;
end;
 
http://delphibox.com/article.asp?articleid=2870
不如下个例子看看
 
可以呀, 自己定个协议,来区分不同文件ID,根不同文件ID来保存上传文件,这样可以处
理多文件同时上传下载,都可以用一组SOCKET, 不过效率就不理想,数据安全不易保证。程序难度大,不好控制。

建议每个文件用一个Socket用完释放它,也没有什么的,效率高数据安全,程序相对容易编写。

如果不是同时上下文件,这个完成端口可以单步传文件。http://www.delphibbs.com/keylife/images/u196832/TCP_IOCP060405.rar
要设置好文件目录路径,文件名是否正确。
 
謝謝兩位的幫助.
但下載的源碼總是找不到相關的文件,我用的是D6,而且太複雜了,我看不明白.
能否教教我如何修改上述使用socket控件傳送文件的代碼使其能夠互相傳送?
我不需要同一時間上傅下載文件.
拜託各位啦.
 
使用d7,没法帮你测试。
 
文件齐全了,下载文件先取得文件列表,在将文件名复制到Edit里面单击GetFile
这个是WinSock API实现的速度很快,不过很抽像,API用的太多了。
http://www.delphibbs.com/keylife/images/u196832/TCP_IOCP060808.rar
http://www.delphibbs.com/keylife/iblog_show.asp?xid=19752
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
815
import
I
后退
顶部