serversocket用来阻塞数据的问题(50分)

  • 主题发起人 主题发起人 pl5th2001
  • 开始时间 开始时间
P

pl5th2001

Unregistered / Unconfirmed
GUEST, unregistred user!
我用ClientSocket和ServerSocket通信,发数据,ServerSocket负责保存收到的数据到硬盘。
现在出现问题了:由于ClientSocket数量多,数据量也大,ServerSocket来不及保存了,就出现了地址错误。ClientSocket在发数据的时候,没有采用阻塞模式,因为这个带ClientSocket的程序不是我写的,有什么办法靠ServerSocket做到阻塞模式?
 
用一个单独的函数去存
 
参考下
http://tech.163.com/05/0907/10/1T1RU95800091589.html
http://www.programfan.com/article/showarticle.asp?id=2289
 
大概多少个ClientSocket 存储的时间间隔是多少
 
楼上的两篇文章都用的是非阻塞模式,
数据量大不怕,怕的是client多,同时发送,server无法同时处理,
你先考虑一下,是不是程序没有设计好。
要做阻塞模式,就是改变clientsocket和serversocket的一个属性为阻塞模式,
接收和发送信息采用线称去处理
 
to:jiajiajia888
你说的一点都没错,早上7、8台电脑同时发数据过来,结果就死掉了。他们发数据是SMTP的DATA命令,我这里硬盘都处理不过来了。
 
如果serversocket采用了阻塞模式,而clientsocket没有这么做,可行吗?
我试了一下,经常出错,数据发到一半就突然收不到了,是什么原因呢?协议是正确的
 
我把代码帖一下,大家帮我看看

Procedure TServerThread.ClientExecute;
Var
Data: Array[0..1023] Of char;
RecText, LastText, sendecho: String;
SocketStream: TWinSocketStream;
b:boolean;
Begin
inherited FreeOnTerminate := True;
CoInitialize(nil);

While (Not Terminated) And (ClientSocket.Connected) Do
Try
SocketStream := TWinSocketStream.Create(ClientSocket, 30000); //30秒延时
Try
FillChar(Data, SizeOf(Data), 0); //每次处理1024字节
If SocketStream.Read(Data, SizeOf(Data)) = 0 Then Begin //接收数据为空
ClientSocket.SendText('TimeOut on Server'+CRLF);
sleep(1);
ClientSocket.Close;
Terminate;
End;
RecText := Data;
If ClientSocket.Connected Then Begin //正常的处理
sleep(1);
b:=false;

//**************************** protocol ******************************************//

{此处处理协议部分}

//**************************** protocol ******************************************//

ClientSocket.SendText(sendecho);
if b = true then begin //接受close命令后 b=true
sleep(1);
ClientSocket.Close;
Terminate;
end;
End;
Finally
SocketStream.Free;
End;
Except
//HandleException;
ClientSocket.Close;
Terminate;
End;

CoUninitialize;
End;
 
你把代码发给我,我来帮你检测一下
jaijiajia888@sohu.com
qq:13773996
 
to : jiajiajia888
QQ加你了,不过邮件发不过去,说邮件地址不存在
 
不好意思,打错了
是jiajiajia888@sohu.com
 
接受答案了.
 
后退
顶部