serversocket 和 clientsocket 怎样传自定义类型数据?
传输模式为非阻塞,stThreadBlocking,ctNonBlocking
以下代码实现文件传输,如何传输自定义数据呢?
-----------------Client----------------------
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ScktComp;
type
TForm1 = class(TForm)
ClientSocket1: TClientSocket;
OpenDialog1: TOpenDialog;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
s : TWinSocketStream;
f, f2: TFileStream;
begin
if not OpenDialog1.Execute then Exit;
ClientSocket1.Open;
s := TWinSocketStream.Create(ClientSocket1.Socket, 60000);
f := TFileStream.Create(OpenDialog1.FileName, fmShareDenyWrite);
try
s.CopyFrom(f, 0);
finally
s.Free;
f.Free;
ClientSocket1.Close;
end;
end;
end.
-----------------Server---------------------
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp;
type
TForm1 = class(TForm)
ServerSocket1: TServerSocket;
procedure ServerSocket1GetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
private
{ Private declarations }
public
{ Public declarations }
end;
TClientThread = Class(TServerClientThread)
private
public
procedure ClientExecute; override;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TClientThread.ClientExecute;
var
ReceiveBuffer : Array[0..1023] Of Char;
SocketStream : TWinSocketStream;
BytesRead : Integer;
F : TFileStream;
FileName: string;
begin
while not Terminated and ClientSocket.Connected do
Begin
try
SocketStream := TWinSocketStream.Create(ClientSocket, 100);
FileName := 'C:\afile';
if FileExists(FileName) then FileName := FileName + '0';
F := TFileStream.Create(FileName, fmCreate);
try
FillChar(ReceiveBuffer, sizeof(ReceiveBuffer), 0);
while SocketStream.WaitForData(5000) do
begin
BytesRead := SocketStream.Read(ReceiveBuffer,SizeOf(ReceiveBuffer));
if BytesRead = 0 then
ClientSocket.Close
Else
F.WriteBuffer(ReceiveBuffer, BytesRead);
end;
finally
SocketStream.Free;
ClientSocket.Close;
f.Free;
end;
except
end;
end;
end;
procedure TForm1.ServerSocket1GetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
SocketThread := TClientThread.Create(False, ClientSocket);
end;
end.
问题点数:20、回复次数:5Top
1 楼czx0514(不想再做那份工作)回复于 2004-03-17 13:01:08 得分 0
不是很熟悉,顶一下Top
2 楼idealistt(风过)回复于 2004-03-17 13:02:53 得分 20
在while的free前里写代码Top
3 楼orber(破烂的)回复于 2004-03-18 04:27:41 得分 0
"传输模式为非阻塞,stThreadBlocking,ctNonBlocking"
看你的源程序明明是阻塞模式啊.
握手规范还是要在建立了线程以后,在线程中来写.
SocketStream.Read(Data, SizeOf(Data))
if data = 'Ready?' then
begin
ClientSocket.SendText('ok');
end;
Top




