我现在为公司的网关程序作一个测试程序,这个测试程序就是创建大量的客户端(ClientSocket),然后连接同一个服务器(ServerSocket)。现在有几个问题想问一下:
1.ClientSocket采用非阻塞模式时,当创建了少量的ClientSocket时,基本没有问题。当创建了几百个ClientSocket后,与ServerSocket频繁通信时,有时就会报“Socket Error 10053”等错误。我觉得这可能是读写超时造成的,对于这种模式,有什么办法可以解决?
2.ClientSocket采用阻塞模式时,我把ClientSocket作为TThread的子类的一个私有成员来用,目的是想用多线程技术来提高效率。但效果不明显,并且在TThread的Execute过程里,处理Clientsocket的读和写(通过TwinSocketStream)有问题。首先想问,我创建了几百个Thread可取吗?另外,哪位大侠可以提供一些阻塞模式+多线程的源代码,我将不胜感激!
我的信誉值比较低,你们不要认为我不给分,那是因为我有一次不慎移贴的后果。
1.ClientSocket采用非阻塞模式时,当创建了少量的ClientSocket时,基本没有问题。当创建了几百个ClientSocket后,与ServerSocket频繁通信时,有时就会报“Socket Error 10053”等错误。我觉得这可能是读写超时造成的,对于这种模式,有什么办法可以解决?
2.ClientSocket采用阻塞模式时,我把ClientSocket作为TThread的子类的一个私有成员来用,目的是想用多线程技术来提高效率。但效果不明显,并且在TThread的Execute过程里,处理Clientsocket的读和写(通过TwinSocketStream)有问题。首先想问,我创建了几百个Thread可取吗?另外,哪位大侠可以提供一些阻塞模式+多线程的源代码,我将不胜感激!
我的信誉值比较低,你们不要认为我不给分,那是因为我有一次不慎移贴的后果。
能给我一份吗?
[email protected]
谢谢 boyfriendyu(空空)
stream.Read(B, 1024);
procedure TMyThread.Execute;
var
Stream: TWinSocketStream;
B: Array[0..1023] of Char;
S: String;
begin
{ Place thread code here }
Stream := TWinSocketStream.Create(FClientSocket.Socket, 10);//FclientSocket已正确连接和设置
while (not Terminated) and (FClientSocket.Active) do
begin
if Stream.WaitForData(10) then
begin
//写数据到服务器
stream.write(S, Length(S)); //假定S中已有了要发送的数据
//从服务器读数据
FillChar(B, 1024, 0);
stream.Read(B, 1024);
end;
end;
end;请问,我这样写对吗?有需要改进的地方吗?
FMessageWinHandle := CreateWindow( 'STATIC','',WS_POPUP, 0, 0, 0, 0, 0, 0, HInstance, nil);
SetWindowLong(FMessageWinHandle, GWL_WNDPROC , Longint(Classes.MakeObjectInstance(WinMsgProc)) );//消息代理函数,注意这是TThread_ParsePackage
procedure TThread_ParsePackage.WinMsgProc(var Message: TMessage);
begin
try
if Assigned(FSocketMsgProc) then FSocketMsgProc(Message); Dispatch(Message);
except
if Assigned(ApplicationHandleException) then
ApplicationHandleException(Self);
end;
end;//用delphi的方式处理消息,也可以直接在这个函数里处理,速度更快一些,但读起来可能会比较麻烦
procedure TThreadSocket.ProcessMessage(var Message: TMessage);
begin
Dispatch(Message);
end;//TThreadSocket的定义里加上
procedure OnSocketMessage(var Message: TCMSocketMessage) ;message SM_SocketMessage;
//这个函数怎么写就是你自己的事了。