本身是服务器端:当客户端连接3分钟内没有回应,自动关闭连接;并在此线程内处理所有客户端请求。请问怎么修正这段代码?代码如下:
{ TFileServerThread }TFileServerThread = Class(TServerClientThread)
public
Procedure ClientExecute; override;
End;
procedure Tcommonfrm.SSGetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
// Create a new thread for connection
SocketThread := TFileServerThread.Create(False, ClientSocket);
end;
Procedure TFileServerThread.ClientExecute;
var
MsgHead:TMsgHead;
mstream1:Tmemorystream;
SocketStream: TWinSocketStream;
begin
While Not Terminated And ClientSocket.Connected Do
begin
try
SocketStream := TWinSocketStream.Create(ClientSocket, 180000);
mstream1:=Tmemorystream.Create;
mstream1.SetSize(ClientSocket.ReceiveLength);
mstream1.Position:=0;
if ClientSocket.ReceiveLength>0 then
begin
ClientSocket.ReceiveBuf(mstream1.Memory^,ClientSocket.ReceiveLength); if mstream1.Read(MsgHead,sizeof(TMsgHead))<> 0 then
begin
case msghead.MsgType of
1: commonfrm.ADDUser(mstream1,clientsocket);
3: commonfrm.ReturnMSGOfAll(mstream1,clientsocket);
end;
end;
finally
mstream1.Free;
SocketStream.Free;
end;
end;end;
{ TFileServerThread }TFileServerThread = Class(TServerClientThread)
public
Procedure ClientExecute; override;
End;
procedure Tcommonfrm.SSGetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
// Create a new thread for connection
SocketThread := TFileServerThread.Create(False, ClientSocket);
end;
Procedure TFileServerThread.ClientExecute;
var
MsgHead:TMsgHead;
mstream1:Tmemorystream;
SocketStream: TWinSocketStream;
begin
While Not Terminated And ClientSocket.Connected Do
begin
try
SocketStream := TWinSocketStream.Create(ClientSocket, 180000);
mstream1:=Tmemorystream.Create;
mstream1.SetSize(ClientSocket.ReceiveLength);
mstream1.Position:=0;
if ClientSocket.ReceiveLength>0 then
begin
ClientSocket.ReceiveBuf(mstream1.Memory^,ClientSocket.ReceiveLength); if mstream1.Read(MsgHead,sizeof(TMsgHead))<> 0 then
begin
case msghead.MsgType of
1: commonfrm.ADDUser(mstream1,clientsocket);
3: commonfrm.ReturnMSGOfAll(mstream1,clientsocket);
end;
end;
finally
mstream1.Free;
SocketStream.Free;
end;
end;end;
解决方案 »
- [散分]自己找了个好点的部门,可是领导不放,郁闷死了
- 日期的简单问题。
- Delphi6.0装了FastReport 2.5后,提示小窗口没有了!!怎么办?!!!急!
- 我的目标是要做csdn史上最努力的菜鸟;^_^
- 我用delphi5,ADO有一个BUG,请问补丁是在哪里找的,多大
- 怎样添加数据表的列?
- 为什么升级ADOUPDATE2后仍出现错误?“ACCESS VIOLATION”
- 如何制作一个安装软件
- ★和算法有点关系的问题【我给出我能给的最多分了】
- Delphi5中怎样调用编写的DLL?
- webservice 传图片数据集
- 如何判断 TComboBox.Items.Objects[i] 释放释放 Assigned不行
MyStruct = packed Record
LastAccess:TDateTime;
TimeOut:Integer;//这个可以不用,或者自己根据情况,比如以秒或者毫秒为单位
Client:TServerClientWinSocket;
end;
var
MsgHead:TMsgHead;
mstream1:Tmemorystream;
SocketStream: TWinSocketStream;
begin
While Not Terminated And ClientSocket.Connected Do
begin
SocketStream := TWinSocketStream.Create(ClientSocket, 180000);
mstream1:=Tmemorystream.Create;
mstream1.SetSize(ClientSocket.ReceiveLength);
mstream1.Position:=0;
if ClientSocket.ReceiveLength>0 then
begin
ClientSocket.ReceiveBuf(mstream1.Memory^,ClientSocket.ReceiveLength); if mstream1.Read(MsgHead,sizeof(TMsgHead))<> 0 then
begin
case msghead.MsgType of
1: commonfrm.ADDUser(mstream1,clientsocket);
3: commonfrm.ReturnMSGOfAll(mstream1,clientsocket);
end;
end;
end
else
begin
if not SocketStream.WaitForData(180000) then
begin
sleep(1);
clientsocket.Close;
Terminate;
end;
end;
end;
mstream1.Free;
SocketStream.Free;
end;
最后这样能实现。但是我觉得这样没点技术含量。非常谢谢你僵哥,我再尝试你的方法~~