[url]http://www.delphibbs.com/keylife/iblog_show.asp?xid=7557[/url]
多线程Socket传送文件的客户端和服务端源代码
一.客户端:
1.Form上放一个ClientSocket1,OpenDialog1,button1
2.ClientSocket1属性设置:
Active : False
ClientType : ctBlocking
Host : '127.0.0.1'
Port : 5998
3.button1事件:
procedure TForm1.Button1Click(Sender: TObject); Var s : TWinSocketStream; f : 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; |
----------------------------------------------
二.服务端:
1.Form上放一个ServerSocket1
2.ServerSocket1属性设置:
Active : True
Port : 5998
ServerType : stThreadBlocking
3.定义客户端线程类:
TClientThread = Class(TServerClientThread) Private Public Procedure ClientExecute; override; End; Procedure TClientThread.ClientExecute; Var ReceiveBuffer : Array[0..4095] Of Char; SocketStream : TWinSocketStream; BytesRead : Integer; F : TFileStream; Begin While Not Terminated And ClientSocket.Connected Do Begin try SocketStream := TWinSocketStream.Create(ClientSocket, 60000); F := TFileStream.Create('c:\afile.exe', fmCreate); try FillChar(ReceiveBuffer, 10, 0); If SocketStream.WaitForData(5000) Then Repeat BytesRead := SocketStream.Read(ReceiveBuffer,SizeOf(ReceiveBuffer)); if BytesRead = 0 then ClientSocket.Close Else F.WriteBuffer(ReceiveBuffer, BytesRead); Until Not SocketStream.WaitForData(2000); finally SocketStream.Free; ClientSocket.Close; f.Free; end; except end; End; End; 4.ServerSocket1的OnGetThread事件代码: procedure TForm1.ServerSocket1GetThread(Sender: TObject; ClientSocket: TServerClientWinSocket; var SocketThread: TServerClientThread); begin SocketThread := TClientThread.Create(False, ClientSocket); end; |