高分求教,在delphi中如何用TServerSocket控件的多线程阻塞? 我想在socket中多连接传大文件,需要用到多线程,只是不知道如何写,是用ServerType属性吗?有人肯指点吗? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 直接调API函数,手动创建SOCKET. 是的,将ServerType设为stNonBlocking就可以啦。 TMultiThread = class(TServerClientThread) constructor Create(CreateSuspended: Boolean; ASocket: TServerClientWinSocket); procedure ClientExecute;override; end;procedure TfrmServer.sskProvideServerGetThread(Sender: TObject; ClientSocket: TServerClientWinSocket; var SocketThread: TServerClientThread);begin CSocket:= ClientSocket; SocketThread:= TMultiThread.Create(false,ClientSocket);end; 不对啊,楼上的huangrenguang(湖) ,你是不是少了Create函数的实现了?没写全啊 {*************************************************************** * 方 法 名 : ClientExecute * 编写目的 : 处理与客户端的信息交流 * 作 者 : 黄仁光 * 参 数 : None * 结 果 : None * 编写日期 :2002年10月08日 ****************************************************************}procedure TMultiThread.ClientExecute;var SktStream : TWinSocketStream; f: file of Byte; FileToSendName:String; CommandSend:String; SendFileSize:int64;begin UserHost := CSocket.RemoteHost; FillChar(objSegInfo,sizeof(objSegInfo),0); SktStream:= TWinSocketStream.Create(CSocket,5000); if SktStream.WaitForData(8000) then begin SktStream.ReadBuffer(objSegInfo,sizeof(objSegInfo)); //响上传应请求 if StrPas(objSegInfo.RequstSendCommand) = '要求上传文件' then begin if Application.MessageBox(PChar('客户'+UserHost+'请求上传文件,同意吗?'),'客户请求',MB_OKCANCEL) = IDOK then begin CommandSend := '允许发送文件'; StrPCopy(objSegInfo.RequstSendCommand,CommandSend); end else begin CommandSend := '不允许发送文件'; StrPCopy(objSegInfo.RequstSendCommand,CommandSend); end end; //获取上传来的文件名 if Trim(StrPas(objSegInfo.FileName)) <> '' then begin FileToSendName := StrPas(objSegInfo.FileName); frmServer.sbrInformation.Panels.Items[1].Text := ExtractFileName(StrPas(objSegInfo.FileName)); AssignFile(f, GetFTPRoot+'\'+ExtractFileName(FileToSendName)); try Reset(f); except Application.MessageBox('文件打开错误', '提示', MB_OK); SktStream.Free; exit; end; //判断是否接收完毕 SendFileSize := objSegInfo.FileSize;//发送方所发送的文件大小,当发送方认为发送完毕时传送过来 objSegInfo.FileSize:= FileSize(f);//FileSize(f)实际接收到的文件大小,续传和完毕时要用到 if FileSize(f) = SendFileSize then begin StrPCopy(objSegInfo.FileSendComplete,'文件接收完毕'); //objSegInfo.FileSendComplete := '文件接收完毕'; frmServer.memInformation.Lines.Add('接收来自'+UserHost+'的文件完毕'); frmServer.memInformation.Lines.Add('文件名为:'+ExtractFileName(FileToSendName)); frmServer.memInformation.Lines.Add('文件大小为:'+IntToStr(SendFileSize)); end else begin frmServer.memInformation.Lines.Add(UserHost+'准备续传文件'); frmServer.memInformation.Lines.Add('续传的文件名为:'+ExtractFileName(FileToSendName)); end; CloseFile(f); end; SktStream.WriteBuffer(objSegInfo,sizeof(objSegInfo)); SktStream.Free; end;end;constructor TMultiThread.Create(CreateSuspended: Boolean; ASocket: TServerClientWinSocket);begin inherited; FreeOnTerminate:= true;end; RecordSet 怎么样保存成一个表? 请教几个函数问题 大家提供一些编程的图片! 蠢鸟鸟 怎样实现如下报表的格式。 一页不满指定行则以空行补上, 参加全国大学生“挑战杯” 关于Edit控件输入的问题 请问各位有没有这样的控件(初学者亲情放送50分) 请问对初学者怎样应用外来控件呀? activex大小,和图标? 浏览器上的滚动条怎么去掉呀? socket
constructor Create(CreateSuspended: Boolean; ASocket:
TServerClientWinSocket);
procedure ClientExecute;override;
end;procedure TfrmServer.sskProvideServerGetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
CSocket:= ClientSocket;
SocketThread:= TMultiThread.Create(false,ClientSocket);
end;
没写全啊
* 方 法 名 : ClientExecute
* 编写目的 : 处理与客户端的信息交流
* 作 者 : 黄仁光
* 参 数 : None
* 结 果 : None
* 编写日期 :2002年10月08日
****************************************************************}
procedure TMultiThread.ClientExecute;
var
SktStream : TWinSocketStream;
f: file of Byte;
FileToSendName:String;
CommandSend:String;
SendFileSize:int64;
begin
UserHost := CSocket.RemoteHost;
FillChar(objSegInfo,sizeof(objSegInfo),0);
SktStream:= TWinSocketStream.Create(CSocket,5000);
if SktStream.WaitForData(8000) then
begin
SktStream.ReadBuffer(objSegInfo,sizeof(objSegInfo));
//响上传应请求
if StrPas(objSegInfo.RequstSendCommand) = '要求上传文件' then
begin
if Application.MessageBox(PChar('客户'+UserHost+'请求上传文件,同意吗?'),'客户请求',MB_OKCANCEL) = IDOK then
begin
CommandSend := '允许发送文件';
StrPCopy(objSegInfo.RequstSendCommand,CommandSend);
end
else
begin
CommandSend := '不允许发送文件';
StrPCopy(objSegInfo.RequstSendCommand,CommandSend);
end
end;
//获取上传来的文件名
if Trim(StrPas(objSegInfo.FileName)) <> '' then
begin
FileToSendName := StrPas(objSegInfo.FileName);
frmServer.sbrInformation.Panels.Items[1].Text := ExtractFileName(StrPas(objSegInfo.FileName));
AssignFile(f, GetFTPRoot+'\'+ExtractFileName(FileToSendName));
try
Reset(f);
except
Application.MessageBox('文件打开错误', '提示', MB_OK);
SktStream.Free;
exit;
end;
//判断是否接收完毕
SendFileSize := objSegInfo.FileSize;//发送方所发送的文件大小,当发送方认为发送完毕时传送过来
objSegInfo.FileSize:= FileSize(f);//FileSize(f)实际接收到的文件大小,续传和完毕时要用到
if FileSize(f) = SendFileSize then
begin
StrPCopy(objSegInfo.FileSendComplete,'文件接收完毕');
//objSegInfo.FileSendComplete := '文件接收完毕';
frmServer.memInformation.Lines.Add('接收来自'+UserHost+'的文件完毕');
frmServer.memInformation.Lines.Add('文件名为:'+ExtractFileName(FileToSendName));
frmServer.memInformation.Lines.Add('文件大小为:'+IntToStr(SendFileSize));
end
else
begin
frmServer.memInformation.Lines.Add(UserHost+'准备续传文件');
frmServer.memInformation.Lines.Add('续传的文件名为:'+ExtractFileName(FileToSendName));
end;
CloseFile(f);
end;
SktStream.WriteBuffer(objSegInfo,sizeof(objSegInfo));
SktStream.Free;
end;
end;constructor TMultiThread.Create(CreateSuspended: Boolean; ASocket: TServerClientWinSocket);
begin
inherited;
FreeOnTerminate:= true;
end;