求救:我用TServerSocket和ClientSocket做个一个文件发送程序,老有错误,大家进来看看

fbincrazy 2004-12-01 05:12:50
客户端代码:
unit Unit1;

interface

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

type
TForm1 = class(TForm)
ClientSocket1: TClientSocket;
BitBtn1: TBitBtn;
Edit1: TEdit;
StatusBar1: TStatusBar;
BitBtn2: TBitBtn;
OpenDialog1: TOpenDialog;
ProgressBar1: TProgressBar;
BitBtn3: TBitBtn;
procedure BitBtn1Click(Sender: TObject);
procedure ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
procedure BitBtn2Click(Sender: TObject);
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
procedure BitBtn3Click(Sender: TObject);
private
{ Private declarations }
stream : TMemoryStream;
size,count : integer;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
ClientSocket1.Address:=trim(edit1.Text);
ClientSocket1.Port:=211;
ClientSocket1.Open;
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
StatusBar1.SimpleText := 'Connected to '+Socket.RemoteAddress;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
stream := TMemoryStream.Create;
if OpenDialog1.Execute then
begin
stream.LoadFromFile(OpenDialog1.FileName);
size := stream.Size; //获得文件大小
count := 0;
ProgressBar1.Max:=size;
ClientSocket1.Socket.SendText(inttostr(size)); //先发送大小
//clientSocket1.Socket.SendText(ExtractFileExt(OpenDialog1.FileName));
end;
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; //未读字节数
ProgressBar1.Position:=size-left;
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;

procedure TForm1.BitBtn3Click(Sender: TObject);
var s:string;
begin
//if opendialog1.Execute then
// showmessage(ExtractFileExt(opendialog1.FileName));
s:='123123123.mp3123';
showmessage(copy(s,pos('.',s),(length(s)-pos('.',s))+1));
showmessage(inttostr(pos('.',s)));
end;

end.
服务器端代码:
unit Unit2;

interface

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

type
TForm2 = class(TForm)
StatusBar1: TStatusBar;
SaveDialog1: TSaveDialog;
ServerSocket1: TServerSocket;
procedure FormCreate(Sender: TObject);
procedure ServerSocket1Accept(Sender: TObject;
Socket: TCustomWinSocket);
procedure ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
private
{ Private declarations }
Tof : file;
size,count :integer;
procedure CutFirst(denstr: string;scrstr: string);
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation

{$R *.dfm}

{ TForm2 }

procedure TForm2.CutFirst(denstr, scrstr: string);
var
len :integer;
begin
len := length(scrstr);
denstr := copy(scrstr,2,(len-1));
end;

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

procedure TForm2.ServerSocket1Accept(Sender: TObject;
Socket: TCustomWinSocket);
begin
StatusBar1.SimpleText := 'Connected from '+ Socket.RemoteAddress
end;

procedure TForm2.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
buf : array [1..2048] of char;
rcvtxt : string;
left,len : integer;
Filetype:string;
begin
len := Socket.ReceiveLength;
if len<10 then //若长度小于10则认为是文件长度
begin
//Filetype :=copy(Socket.ReceiveText,pos('.',Socket.ReceiveText),(length(Socket.ReceiveText)-pos('.',Socket.ReceiveText))+1);
rcvtxt:=Socket.ReceiveText;
//copy(Socket.ReceiveText,0,pos('.',Socket.ReceiveText)-1);
//showmessage(filetype);
//showmessage(rcvtxt);
size := strtoint(rcvtxt);
count := 0;
savedialog1.DefaultExt:=Filetype;
if SaveDialog1.Execute then
begin
AssignFile(ToF, SaveDialog1.FileName);
Rewrite(ToF, 1);
end;
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;

end.
...全文
190 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
todouwang 2004-12-01
  • 打赏
  • 举报
回复
贴错误,看的都受不了
richard_ouyang 2004-12-01
  • 打赏
  • 举报
回复
贴这么多代码,错误在哪里呀。头晕了哦
nyf1220 2004-12-01
  • 打赏
  • 举报
回复
错误在哪里?
bee2518 2004-12-01
  • 打赏
  • 举报
回复
有个抓屏例子,传送图像跟你传送文件是一样的
客户端:
//客户端接收远程屏幕图象
procedure TfrmClient.ClientSocketRead(Sender: TObject;
Socket: TCustomWinSocket);
var
buf: array[0..bufsize - 1] of char;
numberbytes: integer;
begin
numberbytes := socket.ReceiveLength;
//接收数据
socket.receiveBuf(buf, numberbytes);
//累加读到stream内存流中
stream.Write(buf, numberbytes);
//当接收到的数据不等于bufSize,代表接收的屏幕图象的最后一个数据,
//否则,代表还没有接收完,继续相服务器端发送'show'指令,继续获取数据
if NumberBytes = bufSize then
Socket.SendText('show')
else
begin
try
//此句代码,非常重要,千万不要忘写,它将内存流指针移到头,
//否则读取内存流时,会从当前位置开始读
Stream.Position := 0;
//将内存流读到JpegScreen图象中
jpegscreen.LoadFromStream(stream);
//显示在image组件中
image.Picture.Bitmap.Assign(jpegscreen);
except
stream.Clear;
end;
end;
end;
服务端:
//发送抓取的屏幕图象(Jpeg格式)
procedure TfrmServer.sendScreen;
var
sendsize: longint;
Buf: array[0..BufSize - 1] of char;
begin
if JpegStream.Size = 0 then
snapscreen;
if LeftSize > BufSize then
SendSize := BufSize
else
SendSize := LeftSize;
//将jpegStream内存流读取SendSize大小的数据到缓冲区
jpegStream.ReadBuffer(Buf, sendSize);
LeftSize := LeftSize - SendSize;
//向客户端发送
try
serversocket.Socket.Connections[0].SendBuf(buf, sendsize);
sleep(10);
except
jpegstream.Clear;
end;
if LeftSize = 0 then
jpegStream.Clear;
end;

1,593

社区成员

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

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