求助高手用delphi6实现点对点文件传输

bdxie 2004-04-21 04:22:41
求助高手用delphi6实现点对点文件传输
Email:bdxie2000@yahoo.com.cn
谢了
...全文
107 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
bdxie 2004-04-22
  • 打赏
  • 举报
回复
是的
要在控制端捕获鼠标消息,然后进行坐标转换后,发送至控制端再转换坐标,触发相应的事件。实现起来很麻烦的,不知有没有相关实例
startjoy 2004-04-22
  • 打赏
  • 举报
回复
远程屏幕控制就是捕获对方的屏幕内容,传送到本地进行回显,然后再将鼠标的移动和单(双)击信息传送到被控端再做相应的操作。
bdxie 2004-04-21
  • 打赏
  • 举报
回复
OK

非常感谢
谢谢 startjoy(星星雨)
谢谢 ly_liuyang(Liu Yang)
谢谢大家

关于 [远程屏幕控制] 不知有没有什么什么好主意


startjoy 2004-04-21
  • 打赏
  • 举报
回复
--------------------点对点文件传输---------------------------

采用的协议:
此协议是在前人基础上,在末尾整理了一下,应该没什么问题
首先由Client发送MP_QUERY,Server接受到后发送MP_ACCEPT或MP_FEFUESE;
Client接受到MP_ACCEPT发送MP_FILEPROPERTY,Server接受到后发送MP_NEXTWILLBEDATA;
Client接受到发送MP_NEXTWILLBEDATA,Server接受到后发送MP_DATA;
Client接受到MP_DATA,发送数据块,Server接受数据块,
Server还没接受完,发送MP_NEXTWILLBEDATA,否则发送MP_END
Client接受MP_END后,向Server发送MP_END;
Server收到MP_END后,停止发送。至此,整个文件传输完毕!


----------------------服务器端----------------------------
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, StdCtrls;
Const
MP_QUERY ='1';
MP_REFUSE ='2';
MP_ACCEPT ='3';
MP_NEXTWILLBEDATA='4';
MP_DATA ='5';
MP_ABORT ='6';
MP_OVER ='7';
MP_CHAT ='8';
MP_END ='9';
MP_FILEPROPERTY ='0';
iBYTEPERSEND=1024;
type
TForm1 = class(TForm)
btnstartServer: TButton;
Edit1: TEdit;
Edit2: TEdit;
ss: TServerSocket;
SaveDialog1: TSaveDialog;
Memo1: TMemo;
Button1: TButton;
Edit3: TEdit;
procedure btnstartServerClick(Sender: TObject);
procedure ssClientConnect(Sender: TObject; Socket: TCustomWinSocket);
procedure ssClientRead(Sender: TObject; Socket: TCustomWinSocket);
procedure ssClientError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
fsRecv:TMemoryStream;
public
{ Public declarations }
end;

var
Form1: TForm1;
bReadText:boolean;
implementation

{$R *.dfm}

procedure TForm1.btnstartServerClick(Sender: TObject);
begin
ss.Port:=2000;
bReadText := true;
Edit1.Text:='Server is listening';
ss.Open;
end;

procedure TForm1.ssClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Edit1.Text:='Server is connected by'+Socket.RemoteAddress;
end;

procedure TForm1.ssClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
sTemp:string;
bufRecv:Pointer;
iNum:integer;
begin
Memo1.Lines.Add('received size :' + intToStr(Socket.ReceiveLength));
if bReadText then
begin
sTemp:=Socket.ReceiveText;
case sTemp[1] of
MP_QUERY:
begin
Memo1.Lines.Add('receive MP_QUERY');
SaveDialog1.FileName:=Copy(sTemp,2,Length(STemp));
if SaveDialog1.Execute then
begin
// ss.Socket.SendText(MP_ACCEPT);
ss.Socket.Connections[0].SendText(MP_ACCEPT);

fsRecv := TMemoryStream.Create;
// fsRecv:=TFileStream.Create(SaveDialog1.FileName,fmCreate);
edit2.Text := SaveDialog1.FileName;
end
else
ss.Socket.Connections[0].SendText(MP_REFUSE+'');
end;
MP_FILEPROPERTY:
begin
Memo1.Lines.Add('receive MP_FILEPROPERTY');
ss.Socket.Connections[0].SendText(MP_NEXTWILLBEDATA);
end;
MP_NEXTWILLBEDATA:
begin
Memo1.Lines.Add('receive MP_NEXTWILLBEDATA');
bReadText:=false;
ss.Socket.Connections[0].SendText(MP_DATA);
end;
MP_END:
begin
Memo1.Lines.Add('receive MP_END');
fsRecv.Free;
bReadText:=true;
end;
MP_ABORT:
begin
Memo1.Lines.Add('receive MP_ABORT');
fsRecv.Free;
bReadText:=true;
end;
MP_CHAT:
begin
Memo1.Lines.Add('receive MP_CHAT');
end;
end;{of case}
end
else
begin
try

GetMem(bufRecv, iBYTEPERSEND);
iNum := Socket.ReceiveBuf(bufRecv^, iBYTEPERSEND);
fsRecv.WriteBuffer(bufRecv^, iNum);
finally
FreeMem(bufRecv);
end;{of try}
bReadText:=true;

if iNum = iBYTEPERSEND THEN
begin
ss.Socket.Connections[0].SendText(MP_NEXTWILLBEDATA);
end
else
begin
fsRecv.SaveToFile(SaveDialog1.FileName);
fsRecv.Free;
ss.Socket.Connections[0].SendText(MP_END);
end;
end;
end;


procedure TForm1.ssClientError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
Memo1.Lines.Add('ErrorCode :' + IntToStr(ErrorCode));
ErrorCode := 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
var I, j: integer;
begin
J := ss.Socket.ActiveConnections;
Memo1.Lines.Add('ActiveConnectiong is ' + inttostr(j));
for I:= 0 to j- 1 do
ss.Socket.Connections[i].SendText(edit3.Text)
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ss.Port:=2000;
bReadText := true;
Edit1.Text:='Server is listening';
ss.Open;
end;
end.

----------------------客户端----------------------------
unit clientSocketu;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ScktComp;
Const
MP_QUERY ='1';
MP_REFUSE ='2';
MP_ACCEPT ='3';
MP_NEXTWILLBEDATA='4';
MP_DATA ='5';
MP_ABORT ='6';
MP_OVER ='7';
MP_CHAT ='8';
MP_END ='9';
MP_FILEPROPERTY ='0';
iBYTEPERSEND=1024;
type
TForm1 = class(TForm)
btnConnect: TButton;
btnSendFile: TButton;
Edit1: TEdit;
Edit2: TEdit;
cs: TClientSocket;
Label1: TLabel;
edtIPAddress: TEdit;
edtSize: TEdit;
OpenDialog1: TOpenDialog;
Memo1: TMemo;
procedure btnConnectClick(Sender: TObject);
procedure btnSendFileClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure csRead(Sender: TObject; Socket: TCustomWinSocket);
private
fsSend:TFileStream;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btnConnectClick(Sender: TObject);
begin
cs.Address := edtIPAddress.Text;
cs.Port:=2000;
cs.Open;
end;

procedure TForm1.btnSendFileClick(Sender: TObject);
begin
if OpenDialog1.Execute then
Begin
cs.Socket.SendText(MP_QUERY+OpenDialog1.FileName);
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
edit1.Color:=clBlack;
edit1.Font.Color:=clLime;
end;

procedure TForm1.csRead(Sender: TObject; Socket: TCustomWinSocket);
var
sRecv:string;
// sTemp:string;
iNum:integer;
bufSend:pointer;
begin
// GetMem(bufSend,iBytePersend+1);
sRecv:=Socket.ReceiveText;
Memo1.Lines.Add('sRecv = ' + sRecv);
Case sRecv[1] of
MP_REFUSE:ShowMessage('Faint,be refused!');
MP_ACCEPT:begin
Memo1.Lines.Add('MP_ACCEPT');
fsSend:=TFileStream.Create(OpenDialog1.FileName,fmOpenRead);
//iBYTEPERSEND琌熌盽秖–Ω塝癳
edtSize.Text:=IntToStr(fsSend.Size);
edit2.text:='total count:'+IntToStr(Trunc(fsSend.Size/iBYTEPERSEND)+1);

cs.Socket.SendText(MP_FILEPROPERTY+IntToStr(Trunc(fsSend.Size/iBYTEPERSEND)+1));
fsSend.Seek(0, soFromBeginning);
end;
MP_NEXTWILLBEDATA:begin
Memo1.Lines.Add('MP_NEXTWILLBEDATA');
Socket.SendText(MP_NEXTWILLBEDATA);
end;
MP_DATA:
begin
Memo1.Lines.Add('MP_DATA');
try
GetMem(bufSend, iBYTEPERSEND);
iNum := fsSend.Read(bufSend^, iBYTEPERSEND);
cs.Socket.SendBuf(bufSend^, iNum);
// Socket.SendBuf(bufSend,iNum);
Memo1.Lines.Add('Send Buf finished');
finally
FreeMem(bufSend);
end;{of try}
end;
MP_END:
begin
Memo1.Lines.Add('MP_END');
fsSend.Free;
end;
MP_ABORT:begin
Memo1.Lines.Add('MP_ABORT');
fsSend.Free;
end;
end;{of case}
end;
end.
ly_liuyang 2004-04-21
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/2964/2964314.xml?temp=.4641535
ly_liuyang 2004-04-21
  • 打赏
  • 举报
回复
IndyTCP组件可以实现
看Demo去
Google上找

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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