我现在用Delphi7自带的Indy,开发客户端,服务器程序。
客户端进行一个时间段的循环计算,每计算一个时间段,向服务器发送一条指令,告知该客户端这个时段已计算完毕,当所有客户端都计算完毕时,服务器端向客户端发一条指令,告诉其可以进行下一个时段的计算了。这样可以保证所有客户端计算都是同一个时段的。
我现在客户端是开2个线程,一个负责发送,一个负责接收。
客户端发送线程:
Procedure TThreadSend.Execute;
Begin
While true Do
Begin
Sleep (10) ;
If Not Terminated Then
Begin
If assigned (CalTwoDimentionRiverNet) Then
Begin
Synchronize (SendMsg) ;
End;
End; //if
End; //while
End;
客户端接收线程:
Procedure TThreadRev.Execute;
Var
strpacklen : String;
PackLen : Integer;
Begin
While true Do
Begin
If Not Terminated Then
Begin
If assigned (CalTwoDimentionRiverNet) Then
Begin
If Not CalTwoDimentionRiverNet.Client.Connected Then
Begin
sleep (10) ;
Continue;
End;
strpacklen := CalTwoDimentionRiverNet.Client.ReadString (2) ;
//消息长度
PackLen := RevertInteger (strpacklen) ;
CalTwoDimentionRiverNet.RevMsg := CalTwoDimentionRiverNet.Client.ReadString (PackLen-2) ;
Synchronize (DecodeMsg) ;
End; // if assigned ( GPSDevice ) then End; // if not Terminated then
End; //while
End;
服务器端接收是通过Server.OnExecute事件:
Procedure TLogicalRelation.ServerExecute (AThread : TIdPeerThread) ;
Var
strpacklen : String;
PackLen : Integer;
Begin
strpacklen := AThread.Connection.ReadString (2) ;
//消息长度
PackLen := RevertInteger (strpacklen) ;
TempRevMsg := AThread.Connection.ReadString (PackLen-2) ;
TempClientIP := AThread.Connection.Socket.Binding.PeerIP;
AThread.Synchronize (DecodeMsg) ;
End;
服务器端发送同客户端发送。
请问我这样写有何问题吗?
我现在碰到的问题是在时间段几百个循环后,服务器端会突然收不到某个客户端的消息,导致一直处于等待状态,无法继续计算。
客户端进行一个时间段的循环计算,每计算一个时间段,向服务器发送一条指令,告知该客户端这个时段已计算完毕,当所有客户端都计算完毕时,服务器端向客户端发一条指令,告诉其可以进行下一个时段的计算了。这样可以保证所有客户端计算都是同一个时段的。
我现在客户端是开2个线程,一个负责发送,一个负责接收。
客户端发送线程:
Procedure TThreadSend.Execute;
Begin
While true Do
Begin
Sleep (10) ;
If Not Terminated Then
Begin
If assigned (CalTwoDimentionRiverNet) Then
Begin
Synchronize (SendMsg) ;
End;
End; //if
End; //while
End;
客户端接收线程:
Procedure TThreadRev.Execute;
Var
strpacklen : String;
PackLen : Integer;
Begin
While true Do
Begin
If Not Terminated Then
Begin
If assigned (CalTwoDimentionRiverNet) Then
Begin
If Not CalTwoDimentionRiverNet.Client.Connected Then
Begin
sleep (10) ;
Continue;
End;
strpacklen := CalTwoDimentionRiverNet.Client.ReadString (2) ;
//消息长度
PackLen := RevertInteger (strpacklen) ;
CalTwoDimentionRiverNet.RevMsg := CalTwoDimentionRiverNet.Client.ReadString (PackLen-2) ;
Synchronize (DecodeMsg) ;
End; // if assigned ( GPSDevice ) then End; // if not Terminated then
End; //while
End;
服务器端接收是通过Server.OnExecute事件:
Procedure TLogicalRelation.ServerExecute (AThread : TIdPeerThread) ;
Var
strpacklen : String;
PackLen : Integer;
Begin
strpacklen := AThread.Connection.ReadString (2) ;
//消息长度
PackLen := RevertInteger (strpacklen) ;
TempRevMsg := AThread.Connection.ReadString (PackLen-2) ;
TempClientIP := AThread.Connection.Socket.Binding.PeerIP;
AThread.Synchronize (DecodeMsg) ;
End;
服务器端发送同客户端发送。
请问我这样写有何问题吗?
我现在碰到的问题是在时间段几百个循环后,服务器端会突然收不到某个客户端的消息,导致一直处于等待状态,无法继续计算。
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货