不知道什么时候才能再问问题了。在LAN,用ServerSocket和ClientSocket怎么相互传文件。

saoren 2001-02-28 05:00:00
明天开始找活。来CSDN这么久,学了许多东西,明天要开始找活了,不知以后能不能再经常光顾CSDN,大家再帮忙解决这个问题。高分相送。

如何用ServerSocket和ClientSocket进行文件的互相传送。
要给代码哦。
...全文
172 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
saoren 2001-06-01
  • 打赏
  • 举报
回复
给分
xzisgood 2001-03-01
  • 打赏
  • 举报
回复
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ScktComp, StdCtrls;

type
TForm1 = class(TForm)
ClientSocket1: TClientSocket;
ServerSocket1: TServerSocket;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
procedure ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
myreadfile,mywritefile:tfilestream;
implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
serversocket1.Active:=true;
clientsocket1.Active:=true;
myreadfile:=tfilestream.Create('d:\aaa.exe',fmOpenRead);

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
mywritefile:=tfilestream.Create('d:\basd.abc',fmcreate);
clientsocket1.Socket.Sendtext('givemefile');
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var buffer:array[1..1000] of byte; len:integer;
begin
len:=socket.ReceiveLength;
if len>500 then
begin
mywritefile.Free;
showmessage('file send over!');
exit;
end;
socket.ReceiveBuf(buffer,len);
mywritefile.Write(buffer,len);
socket.SendText('continue');
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var buffer:array[1..1000] of byte; len:integer;
begin
if socket.ReceiveText<>'givemefile' then
begin
len:=myreadfile.Read(buffer,500);
if len=0 then
begin
socket.SendBuf(buffer,501);
end;
socket.SendBuf(buffer,len);
end
else begin
len:=myreadfile.Read(buffer,500);
socket.SendBuf(buffer,len);
end;
end;

end.
刚才的程序有问题,下面的程序我测试过了,没有问题.
xzisgood 2001-03-01
  • 打赏
  • 举报
回复
虽然这是一个程序,但是可以很方便的分成两个程序.这里主要在clientsocket的onread和serversocket的onclientread事件编程.只要把serversocket和clientsocket放在两个程序,就实现了远程通讯.另外我用的是Tfilestream.他可以打开别的文件,不是非要txt文件.
myreadfile:=tfilestream.Create('d:\aaa.exe',fmOpenRead);这样就打开exe 文件了.你可以试试看.
saoren 2001-02-28
  • 打赏
  • 举报
回复
谢谢xzisgood
我需要的是要两个程序Server端在A机,Client端在B机,而且传送的文件不是*.txt,是任何文件。要Server端用ServerSocket,Client端用ClientSocket.之间的文件传送。
有点像下载东西一样了。

hks 2001-02-28
  • 打赏
  • 举报
回复
多谢xzisgood(夏)的代码,同时祝saoren找个工作。
xzisgood 2001-02-28
  • 打赏
  • 举报
回复
如果文件太大的话,需要分割开传.
serversocket一次传一部分,clientsocket收到文件后追加,
然后发读下一部分的请求,serversocket再发下一部分.
xzisgood 2001-02-28
  • 打赏
  • 举报
回复
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ScktComp, StdCtrls;

type
TForm1 = class(TForm)
ClientSocket1: TClientSocket;
ServerSocket1: TServerSocket;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
procedure ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
myreadfile,mywritefile:tfilestream;
serversend,cliendaccept:boolean;
implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
serversocket1.Active:=true;
clientsocket1.Active:=true;
myreadfile:=tfilestream.Create('d:\aaa.txt',fmOpenRead);
serversend:=false;
cliendaccept:=false;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
clientsocket1.Socket.Sendtext('givemefile');
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var i:integer;
begin
mywritefile:=tfilestream.Create('d:\basd.txt',fmcreate);
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
if not serversend then
begin
if (socket.ReceiveLength<>10) or (socket.ReceiveText<>'givemefile') then
exit
else begin
serversend:=true;
socket.SendStream(myreadfile);
serversend:=false;
end;
end;
end;

end.
窗体中有一个按钮和serversocket1 clientsocket1
这里只是简单的实现了.

5,928

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧