tclientsocket、tserversocket连接问题?

daizhenghong 2005-11-28 10:52:11
呵呵,本人没学过DELPHI,遇到一个要DELPHI解决的文件传输问题,要用到DELPHI的SOCKET。在网上查过很多资料,自己按网上说的做了,但就是TCLIENTSOCKET连接不到TSERVERSOCKET上面,连接需要哪些操作啊,该怎么做啊?请各位高手指教!!
...全文
130 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
daizhenghong 2005-11-30
  • 打赏
  • 举报
回复
呵呵,谢谢。先试试
wizardqi 2005-11-28
  • 打赏
  • 举报
回复
//算了,给个可运行的例子吧。
unit Unit1;

interface

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

type
TFileInfo=record
FileName:String[128];
FileSize:Int64;
end;
TGetFileBeginEvent=procedure(var FileName:String) of object;
TGetFileOverEvent=procedure of object;
TFileServerThread=class(TServerClientThread)
private
FOnGetFileBegin: TGetFileBeginEvent;
FOnGetFileOver: TGetFileOverEvent;
public
constructor Create(CreateSuspended: Boolean; ASocket: TServerClientWinSocket;OnGetFileBegin: TGetFileBeginEvent;
OnGetFileOver: TGetFileOverEvent);
procedure ClientExecute;override;
end;
TForm1 = class(TForm)
ServerSocket1: TServerSocket;
ClientSocket1: TClientSocket;
SaveDialog1: TSaveDialog;
SendFileBtn: TButton;
OpenDialog1: TOpenDialog;
procedure FormCreate(Sender: TObject);
procedure ServerSocket1GetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
procedure SendFileBtnClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure OnGetFile(var FileName:String);
procedure OnGetFileOver;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{ TFileServerThread }

constructor TFileServerThread.Create(CreateSuspended: Boolean;
ASocket: TServerClientWinSocket;OnGetFileBegin: TGetFileBeginEvent;
OnGetFileOver: TGetFileOverEvent);
begin
inherited Create(True,ASocket);
Self.FreeOnTerminate:=True;
FOnGetFileBegin:=OnGetFileBegin;
FOnGetFileOver:=OnGetFileOver;
if not CreateSuspended then Resume;
end;

procedure TFileServerThread.ClientExecute;
var
Stream:TWinSocketStream;
FI:TFileInfo;
FS:TFileStream;
FileName:String;
ReadLen:Integer;
Buffer:String;
begin
Stream:=TWinSocketStream.Create(ClientSocket,6000);
SetLength(Buffer,4096);
try
try
while not Terminated and ClientSocket.Connected do
begin
ReadLen:=0;
while not Terminated and ClientSocket.Connected do
begin
Inc(ReadLen,Stream.Read(Pointer(Integer(@FI)+ReadLen)^,SizeOf(FI)-ReadLen));
if ReadLen=SizeOf(FI) then Break;
end;
FileName:=FI.FileName;
if ReadLen=SizeOf(FI) then
begin
if Assigned(FOnGetFileBegin) then FOnGetFileBegin(FileName);
FS:=TFileStream.Create(FileName,fmCreate);
try
while FS.Size<FI.FileSize do
begin
ReadLen:=Stream.Read(Buffer[1],4096);
FS.Write(Buffer[1],ReadLen);
end;
finally
FS.Free;
end;
if Assigned(FOnGetFileOver) then FOnGetFileOver;
end;
end;
except
on E:Exception do ClientSocket.Close;
end;
finally
Stream.Free;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
with ServerSocket1 do
begin
ServerType:=stThreadBlocking;
Port:=1981;
Active:=True;
end;
with ClientSocket1 do
begin
ClientType:=ctBlocking;
Host:='127.0.0.1';
Port:=1981;
Active:=True;
end;
end;

procedure TForm1.OnGetFile(var FileName: String);
begin
FileName:='c:\'+FileName;
end;

procedure TForm1.ServerSocket1GetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
SocketThread:=TFileServerThread.Create(False,ClientSocket,OnGetFile,OnGetFileOver);
end;

procedure TForm1.SendFileBtnClick(Sender: TObject);
var
FS:TFileStream;
FI:TFileInfo;
begin
if OpenDialog1.Execute then
begin
FS:=TFileStream.Create(OpenDialog1.FileName,fmOpenRead or fmShareDenyNone);
FI.FileName:=ExtractFileName(OpenDialog1.FileName);
FI.FileSize:=FS.Size;
ClientSocket1.Socket.SendBuf(FI,SizeOf(FI));
ClientSocket1.Socket.SendStream(FS);
end;
end;

procedure TForm1.OnGetFileOver;
begin
ShowMessage('File get over!');
end;

end.
linzhengqun 2005-11-28
  • 打赏
  • 举报
回复
在网上找资料吗:
http://www.99v.com.cn/Article/softtech/program/cjj/net/200506/20913.html
在Delphi中,套接字(Socket)编程用到的基本类是TServerSocketTClientSocket。这两个类全部位于ScktComp单元中。其类型定义如下: type TServerSocket = class (ScktComp.TCustomServerSocket); TClientSocket = class (ScktComp.TCustomSocket)。      在编写程序时,首先要对TServerSocket(在服务器端)与TClientSocket(在客户端)进行实例化。对于TServerSocket的对象,主要设置其服务类型(ServerType)与端口(Port)的属性,然后编写“OnClientRead”事件处理程序的代码,处理来自客户机的请求。如要启动服务器,设置TServerSocket对象的Active属性为真(即Active := True),如要停止服务器,则设置TServerSocket对象的Active属性为假(即Active := False)。      对于TClientSocket的对象,主要设置对方服务器的服务类型(ServerType)、端口(Port)以及IP地址(Address)的属性,之后编写“OnConnect与OnRead”事件处理程序的代码“OnConnect”事件处理程序用来检查与服务器连接成功与否(必须在这里进行检查才有效),“OnRead”事件处理程序用来读取服务器发来的信息。如要连接服务器,设置TClientSocket对象的Active属性为真(即Active := True;注意:检查连接是否成功,必须在“OnConnect”事件处理程序中进行),如要断开与服务器的连接,则设置TClientSocket对象的Active属性为假(即Active := False)。

5,391

社区成员

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

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