我发的收到的文件和我发送的文件大小不同,而且打不开,请高手解决
server:const
FILESIZE=1024;var
fs:tfilestream;procedure TForm1.serverExecute(AThread: TIdPeerThread);
begin
if edtpath.Text <>'' then
begin
try try
if not assigned(fs) then
begin
fs:=tfilestream.Create(edtpath.text,fmopenread);
end; athread.connection.WriteStream(fs,false,true,FILESIZE);
if not displaysizeleft then
athread.Connection.Disconnect;
except on ex:exception do
raise exception.Create(ex.Message );
end;
finally
begin
if fs.Position =fs.Size then
fs.Free;
end;
end;
end;
end;
client:procedure TForm1.btnconnectClick(Sender: TObject);
var
ms:tmemorystream;
begin
try try
if not client.Connected then
begin
client.Host:='127.0.0.1';
client.Port:=8080;
client.Connect();
end; ms:=tmemorystream.Create;
client.readstream (ms,-1,true);
showmessage(inttostr(ms.size));
ms.SaveToFile('d:\text.bmp');
except on ex:exception do
raise exception.Create(ex.Message );
end;
finally
ms.Free;
end;
end;
server:const
FILESIZE=1024;var
fs:tfilestream;procedure TForm1.serverExecute(AThread: TIdPeerThread);
begin
if edtpath.Text <>'' then
begin
try try
if not assigned(fs) then
begin
fs:=tfilestream.Create(edtpath.text,fmopenread);
end; athread.connection.WriteStream(fs,false,true,FILESIZE);
if not displaysizeleft then
athread.Connection.Disconnect;
except on ex:exception do
raise exception.Create(ex.Message );
end;
finally
begin
if fs.Position =fs.Size then
fs.Free;
end;
end;
end;
end;
client:procedure TForm1.btnconnectClick(Sender: TObject);
var
ms:tmemorystream;
begin
try try
if not client.Connected then
begin
client.Host:='127.0.0.1';
client.Port:=8080;
client.Connect();
end; ms:=tmemorystream.Create;
client.readstream (ms,-1,true);
showmessage(inttostr(ms.size));
ms.SaveToFile('d:\text.bmp');
except on ex:exception do
raise exception.Create(ex.Message );
end;
finally
ms.Free;
end;
end;
接收的时候也要把文件名(扩展名)写得相同才行。
以下是服务端的代码:
unit UnitServer;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, ScktComp, ExtCtrls, ComCtrls, ActnList, Menus;const
MP_START = '*****';
MP_FILENAME = '#####';
MP_SUCCESS = '&&&&&';
MP_QUERY = '11111';
MP_REFUSE = '22222';
MP_ACCEPT = '33333';
MP_NEXTWILLBEDATA = '44444';
MP_DATA = '55555';
MP_ABORT = '66666';
MP_OVER = '77777';
MP_CHAT = '88888';
MP_END = '99999';
MP_FILEPROPERTY = '00000';
MP_FILENOTPROPERTY = '^^^^^'; WM_TRANSFER_END = WM_USER + 303;type
TForm1 = class(TForm)
ss: TServerSocket;
PageControl1: TPageControl;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
Panel1: TPanel;
Button1: TButton;
Memo1: TMemo;
ListView1: TListView;
SaveDialog1: TSaveDialog;
PopupMenu1: TPopupMenu;
N1: TMenuItem;
N2: TMenuItem;
ActionList1: TActionList;
SaveLog: TAction;
ClearLog: TAction;
procedure ssClientRead(Sender: TObject; Socket: TCustomWinSocket);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure ssClientConnect(Sender: TObject; Socket: TCustomWinSocket);
procedure ssClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure Button1Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure SaveLogExecute(Sender: TObject);
procedure ClearLogExecute(Sender: TObject);
private
fsRecv: TFileStream;
bStart: Boolean;
TickCount: Longword; ClientSocketHandleList: TStringList; procedure WM_TRANSFER(var Message: TMessage); message WM_TRANSFER_END;
public
{ Public declarations }
end;var
Form1: TForm1;
sFileName: string;
sUserName: string;
Running: Boolean;implementation
var
sTemp: string;
bufRecv: Pointer;
iLength: Integer; sPath: string;
sTemp1: string;
i: Integer; AItem: TListItem;
begin
iLength := Socket.ReceiveLength;
GetMem(bufRecv, iLength);
try
Socket.ReceiveBuf(bufRecv^, iLength);
sTemp := StrPas(PChar(bufRecv)); sTemp1 := sTemp; sTemp := Copy(sTemp, 1, 5); if sTemp = MP_FILENAME then
begin
sTemp := Copy(sTemp1, 6, Length(sTemp1) - 5);
sFileName := Copy(sTemp, 1, 12); for i := 0 to ListView1.Items.Count - 1 do
begin
if Socket.RemoteAddress = ListView1.Items[i].Caption then
begin
ListView1.Items[i].SubItems[0] := sFileName;
ListView1.Items[i].SubItems[1] := '接收就绪';
Socket.SendText(MP_SUCCESS);
Break;
end;
end;
end else if sTemp = MP_QUERY then
begin
//i := ClientSocketHandleList.IndexOf(IntToStr(Socket.SocketHandle)); for i := 0 to ListView1.Items.Count - 1 do
begin
if ListView1.Items[i].SubItems[2] = IntToStr(Socket.SocketHandle) then
begin
sFileName := ListView1.Items[i].SubItems[0] + '.rar';
sUserName := sFileName;
Break;
end;
end; {
if i <> -1 then
begin
sFileName := ListView1.Items[i].SubItems[0] + '.rar';
sUserName := sFileName;
end;
}
sPath := ExtractFilePath(Application.ExeName); sPath := sPath + '上传目录'; if not DirectoryExists(sPath) then
ForceDirectories(sPath); sFileName := sPath + '\' + sFileName; fsRecv := TFileStream.Create(sFileName, fmCreate);
//如果愿意接收数据。
Memo1.Lines.Add ('开始接收"' + sUserName + '"!');
TickCount := GetTickCount;
Socket.SendText(MP_ACCEPT);
//通知发送端发送数据。
bStart := False; end
else if sTemp = MP_FILEPROPERTY then
begin
//要发送StrToInt(Copy(sTemp,2,Length(sTemp))) 次
//时间进度显示
//iRecvLength:=StrToInt(Copy(sTemp,2,Length(sTemp)));
Socket.SendText(MP_NEXTWILLBEDATA);
//接收文件长度并要求继续传送数据。
end
else if sTemp = MP_FILENOTPROPERTY then
begin
Memo1.Lines.Add ('源文件' + sUserName + '不存在,接收失败,请检查客户端文件!');
Memo1.Lines.Add ('总共时间:'+ IntToStr(GetTickCount - TickCount)); {
i := ClientSocketHandleList.IndexOf(IntToStr(Socket.SocketHandle));
if i <> -1 then
begin
ListView1.Items[i].SubItems[1] := '接收失败';
end;
} for i := 0 to ListView1.Items.Count - 1 do
begin
if ListView1.Items[i].SubItems[2] = IntToStr(Socket.SocketHandle) then
begin
ListView1.Items[i].SubItems[1] := '接收失败';
Break;
end;
end; SendMessage(Form1.Handle, WM_TRANSFER_END, 0, 0);
fsRecv.Free; DeleteFile(sFileName);
end
else if sTemp = MP_NEXTWILLBEDATA then
begin
Socket.SendText(MP_DATA);
//要求发送端发送数据。
//准备好接收数据。
end
else if sTemp = MP_END then//文件传送结束。
begin
Memo1.Lines.Add ('接收"' + sUserName + '"结束!');
Memo1.Lines.Add ('总共时间:' + IntToStr(GetTickCount - TickCount)); {
i := ClientSocketHandleList.IndexOf(IntToStr(Socket.SocketHandle));
if i <> -1 then
begin
ListView1.Items[i].SubItems[1] := '接收完毕';
end;
} for i := 0 to ListView1.Items.Count - 1 do
begin
if ListView1.Items[i].SubItems[2] = IntToStr(Socket.SocketHandle) then
begin
ListView1.Items[i].SubItems[1] := '接收完毕';
Break;
end;
end; SendMessage(Form1.Handle, WM_TRANSFER_END, 0, 0);
fsRecv.Free;
end
else
begin
if not bStart then
begin
Memo1.Lines.Add('接收数据');
bStart := True;
end;
fsRecv.WriteBuffer(bufRecv^, iLength);
Socket.SendText(MP_NEXTWILLBEDATA);
end;
finally
FreeMem(bufRecv, iLength);
end;
end;
begin
Memo1.Clear; ss.Port := 3000;
ss.Open; ClientSocketHandleList := TStringList.Create;
ClientSocketHandleList.Clear; Running := False;
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
ss.Close; ClientSocketHandleList.Free;
end;procedure TForm1.ssClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
var
SocketHandle: string;
AItem: TListItem;
i: Integer;
Flag: Boolean;
begin
SocketHandle := IntToStr(Socket.SocketHandle);
ClientSocketHandleList.Add(SocketHandle); Flag := False;
for i := 0 to ListView1.Items.Count - 1 do
begin
if Socket.RemoteAddress = ListView1.Items[i].Caption then
begin
if ListView1.Items[i].SubItems[0] <> '' then
ListView1.Items[i].SubItems[1] := '接收就绪'
else
ListView1.Items[i].SubItems[1] := '已连接'; ListView1.Items[i].SubItems[2] := SocketHandle;
Flag := True;
Break;
end;
end; if Not Flag then
begin
AItem := ListView1.Items.Add;
AItem.Caption := Socket.RemoteAddress;
AItem.SubItems.Add('');
AItem.SubItems.Add('已连接');
AItem.SubItems.Add(SocketHandle);
end;
end;procedure TForm1.ssClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
var
SocketHandle: string;
Index: Integer;
i: Integer;
begin
SocketHandle := IntToStr(Socket.SocketHandle);
Index := ClientSocketHandleList.IndexOf(SocketHandle); ClientSocketHandleList.Delete(Index);
for i := 0 to ListView1.Items.Count - 1 do
begin
if ListView1.Items[i].SubItems[2] = SocketHandle then
begin
ListView1.Items[i].SubItems[1] := '已断开';
Break;
end;
end;
end;procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
j: Integer;
begin
if ListView1.SelCount > 0 then
begin
for i := 0 to ListView1.Items.Count - 1 do
begin
if ((ListView1.Items[i].SubItems[1] = '接收就绪') and (ListView1.Items[i].Selected)) then
begin
j := ClientSocketHandleList.IndexOf(ListView1.Items[i].SubItems[2]); ss.Socket.Connections[j].SendText(MP_START + ListView1.Items[i].SubItems[0]);
Running := True;
repeat
Application.ProcessMessages;
until (Running = False);
end;
end;
end
else
begin
for i := 0 to ListView1.Items.Count - 1 do
begin
if ListView1.Items[i].SubItems[1] = '接收就绪' then
begin
j := ClientSocketHandleList.IndexOf(ListView1.Items[i].SubItems[2]); ss.Socket.Connections[j].SendText(MP_START + ListView1.Items[i].SubItems[0]);
Running := True;
repeat
Application.ProcessMessages;
until (Running = False);
end;
end;
end;
end;procedure TForm1.WM_TRANSFER(var Message: TMessage);
begin
Running := False;
end;procedure TForm1.FormShow(Sender: TObject);
begin
PageControl1.ActivePageIndex := 0;
end;procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
i: Integer;
Flag: Boolean;
begin
Flag := False;
for i := 0 to ListView1.Items.Count - 1 do
begin
if ListView1.Items[i].SubItems[1] = '接收就绪' then
begin
Flag := True;
Break;
end;
end;
if Flag then
if Application.MessageBox('还有已经就绪的客户端还没有上传文件,确认要关闭服务端吗?', '提示', MB_YESNO + MB_ICONINFORMATION) = IDYES then
CanClose := True
else
CanClose := False
else
CanClose := True;
end;procedure TForm1.SaveLogExecute(Sender: TObject);
begin
if SaveDialog1.Execute then
Memo1.Lines.SaveToFile(SaveDialog1.FileName);
end;procedure TForm1.ClearLogExecute(Sender: TObject);
begin
if Application.MessageBox('确定要清除当前的日志吗?', '提示', MB_YESNO + MB_ICONINFORMATION) = IDYES then
Memo1.Lines.Clear;
end;end.