Вот такое дело:
клиент:
| Код | unit uMainClient;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ComCtrls, ToolWin, Menus, ScktComp, Sockets;
type TfrmMain = class(TForm) ClientSocket1: TClientSocket; MainMenu1: TMainMenu; sdsd1: TMenuItem; ToolBar1: TToolBar; StatusBar1: TStatusBar; btnConnect: TSpeedButton; btnDisconnect: TSpeedButton; btnSendFile: TSpeedButton; edtAddress: TEdit; OpenDialog1: TOpenDialog; Edit1: TEdit; procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); procedure btnSendFileClick(Sender: TObject); procedure btnConnectClick(Sender: TObject); procedure btnDisconnectClick(Sender: TObject); procedure FormCreate(Sender: TObject); private fs : TFileStream; Reciving : boolean; DataSize : Integer; public { Public declarations } end;
var frmMain: TfrmMain;
implementation
{$R *.dfm}
procedure TfrmMain.btnConnectClick(Sender: TObject); begin ClientSocket1.Address := edtAddress.Text; ClientSocket1.Active := true; StatusBar1.Panels.Items[0].Text := 'Connecting true'; end;
procedure TfrmMain.btnDisconnectClick(Sender: TObject); begin ClientSocket1.Active := false; StatusBar1.Panels.Items[0].Text := 'Connecting false'; end;
procedure TfrmMain.btnSendFileClick(Sender: TObject); var SendFile : TFileStream; begin if OpenDialog1.Execute then Edit1.Text := OpenDialog1.FileName;
ClientSocket1.Socket.SendText('FileGoServer'); SendFile := TFileStream.Create(OpenDialog1.FileName, fmOpenRead); try SendFile.Position := 0; ClientSocket1.Socket.SendText('Size:' + IntToStr(SendFile.Size) + #0); ClientSocket1.Socket.SendStream(SendFile); finally end; end;
procedure TfrmMain.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); var s, sl: string; begin s:= Socket.ReceiveText;
if Reciving then begin fs.Write(s[1], length(s)); if fs.Size=DataSize then begin fs.Free; Reciving:=false; Application.MessageBox('Поздравляю, Client принял фаил', 'Внимание!!!'); end; exit; end;
if copy(s, 1, 5)='Size:' then begin sl:=copy(s, 6, Pos(#0, s)-6); DataSize:=StrToInt(sl); Delete(s, 1, Pos(#0, s)); Reciving:=true; fs:=TFileStream.Create('output.jpeg',fmCreate); fs.Write(s[1], length(s)); exit; end; end;
procedure TfrmMain.FormCreate(Sender: TObject); begin ClientSocket1.Active := false; StatusBar1.Panels.Items[0].Text := 'Connecting false'; end;
end.
|
сервер:
| Код | unit uMainServer;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ScktComp, Buttons, ToolWin, ComCtrls, Menus;
type TfrmMain = class(TForm) MainMenu1: TMainMenu; s1: TMenuItem; StatusBar1: TStatusBar; ToolBar1: TToolBar; btnStartServer: TSpeedButton; btnStopServer: TSpeedButton; ServerSocket1: TServerSocket; OpenDialog1: TOpenDialog; procedure ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); procedure btnStopServerClick(Sender: TObject); procedure btnStartServerClick(Sender: TObject); procedure FormCreate(Sender: TObject); private fs : TFileStream; Reciving : boolean; DataSize : Integer; { Private declarations } public { Public declarations } end;
var frmMain: TfrmMain;
implementation
{$R *.dfm}
procedure TfrmMain.btnStartServerClick(Sender: TObject); begin ServerSocket1.Active := true; StatusBar1.Panels.Items[0].Text := 'Server active true'; end;
procedure TfrmMain.btnStopServerClick(Sender: TObject); begin ServerSocket1.Active := false; StatusBar1.Panels.Items[0].Text := 'Server active false'; end;
procedure TfrmMain.FormCreate(Sender: TObject); begin ServerSocket1.Active := false; StatusBar1.Panels.Items[0].Text := 'Server active false'; end;
procedure TfrmMain.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket); var s, sl: string; FileSend : TFileStream; begin s:= Socket.ReceiveText;
if Reciving then begin fs.Write(s[1], length(s)); if fs.Size=DataSize then begin fs.Free; Reciving:=false; Application.MessageBox('Поздравляю, Сервер принял фаил', 'Внимание!!!'); end; exit; end;
if copy(s, 1, 5)='Size:' then begin sl:=copy(s, 6, Pos(#0, s)-6); DataSize:=StrToInt(sl); Delete(s, 1, Pos(#0, s)); Reciving:=true; fs:=TFileStream.Create('output.jpeg',fmCreate); fs.Write(s[1], length(s)); exit; end;
//------------------------------ OpenDialog1.Execute; ServerSocket1.Socket.SendText('FileGoClient'); FileSend := TFileStream.Create(OpenDialog1.FileName, fmOpenRead); try FileSend.Position := 0; ServerSocket1.Socket.SendText('Size:' + IntToStr(FileSend.Size) + #0); ServerSocket1.Socket.SendStream(FileSend); finally end; //------------------------------ end;
end.
|
С клиента на сервер фаил передаеться, а вот с сервера на клиент не хочет, т.е. сначало фаил кидаеться на сервер а с сервера уже отсылаеться клиенту Выскакивает вот такая ошибка: http://img86.imageshack.us/img86/1219/20615104vw6.jpg
Нашел расшифровку ошибки "Error # 10057 Socket is not connected - Была предпринята попытка передать или принять данные через неподключенный сокет."
ток немогу понять, как это через не подключенный сокет, коннект же между программами установлен :-/ |