我在服务器端用server.socket的非阻塞式开了300个线程,客户端同样也是用的非阻塞式通讯。为什么当服务器连接到42个客户端的时候其它的客户端就不能连接

  • 主题发起人 主题发起人 wanxu
  • 开始时间 开始时间
看看李维的书,上面写了,如果用非阻塞的方式最多只能是42个连接!建议采用非阻塞方式。
 
我也在做这样的一个服务器!
用这方面经验的大哥快来救火啊!
TO wanxu:
你把问题解决吗?
说出来听听!
 
这是Delphi帮助里边的文章,我相信看看就会明白的。
{Server Thread}
procedure TMyServerThread.ClientExecute;

var
Stream : TWinSocketStream;
Buffer : array[0 .. 9] of Char;
begin
{ make sure connection is active }
while (not Terminated) and ClientSocket.Connected do
begin
try
Stream := TWinSocketStream.Create(ClientSocket, 60000);
try
FillChar(Buffer, 10, 0); { initialize the buffer }
{ give the client 60 seconds to start writing }
if Stream.WaitForData(60000) then

begin
if Stream.Read(Buffer, 10) = 0 then { if can't read in 60 seconds }
ClientSocket.Close; { close the connection }
{ now process the request }
...
end
else
ClientSocket.Close; { if client doesn't start, close }
finally
Stream.Free;
end;
except
HandleException;
end;

end;
end;
{ Client Thread}
procedure TMyClientThread.Execute;
var
TheStream: TWinSocketStream;
buffer: string;
begin
{ create a TWinSocketStream for reading and writing }
TheStream := TWinSocketStream.Create(ClientSocket1.Socket, 60000);
try
{ fetch and process commands until the connection or thread is terminated }
while (not Terminated) and (ClientSocket1.Active) do
begin
try
GetNextRequest(buffer); { GetNextRequest must be a thread-safe method }

{ write the request to the server }
TheStream.Write(buffer, Length(buffer) + 1);
{ continue the communication (e.g. read a response from the server) }
...
except
if not(ExceptObject is EAbort) then
Synchronize(HandleThreadException); { you must write HandleThreadException }
end;
end;
finally
TheStream.free;
end;
end;
 
我现在最多能开85个线程了!
如果现在已经链接了85个客户端,第86个客户端链接服务器的时候就不能和服务器建立连接。
这是受了什么限制???是serversocket本身的限制????
 
用Thread Pooling技术和线程池就可以解决这个问题
 
我做了一个测试,一个阻塞式的服务端,一个阻塞式的客户端。
客户端sleep(50)开一个线程去连接服务端,可以上200多个连接
如果sleep(100),可以上300多个连接。

是不是你的问题也是这样造成的?同时尝试连接服务端的数量比较大,
使服务器无法相应。
 
iamcaca:
并不是同时尝试链接服务器的数量多了!!!!!是链接的总数达到85个的时候后面
的客户端就不能链接到服务器端了!!!
 
我测试的时候200多个连接可以同时保持哦
 
iamcaca:
你是用不是用的block模式哟???你能不能用noblock也链接到200台客户端??
 
to IdeasWare
如果500个客户端需不时的传报文,采用TCP,是一直建立连接好还是传完就断,要传再连的
方式好,用block模式可不可以同时连500个客户端
 
这么多我没有试过的,如果传报文时间隔有时较大最好断开,用到时再请求,建立连接,
如果间隔比较小最好是保持连接。
 
to IdeasWare
建立连接所耗的时间到底长不长,我的环境是局域网,主干100M,桌面10M
 
别瞎忙了。delphi的ServerSocket控件不能接受那么多的连接的(阻塞多线程)。我试过多次了
,后来改用INDY最新版,可以连接到600个(可能还能再多,只是因为条件所限,只能测试到600
左右)
 
建立连接用的时间不长。我好长时间没写Socket程序了,原来写的时候也只是在一种
用控件的阶段。如果你时间允许的话,自己可以看看这样的源代码,试着自己写写。我
现在正忙一个Mis软件,所以一直想试试也没来得及。
 
听说delphi6中的indy控件很好用,一直没有时间试一下[:(!]
 
To:smj_9547,
看看李维的书,上面写了,如果用非阻塞的方式最多只能是42个连接!建议采用非阻塞方式。
李维的那本书的说的??
能否告知??
 
李维的《DELPHI5分布式开发系统篇》
 
zyyzj:哪里有李维的《DELPHI5分布式开发系统篇》可供下载??????谢老!
 
还有没有哪位高手指点?
 
ServerSocket 控件非阻塞方式连接几百个客户是一点问题都没有的,我两年前试过用最多连过180个
客户端,再多没试过,应该是不成问题的,而且每个连接都是频繁的与服务器交换数据,
运行也很稳定,也没有任何出错提示。
如果你的系统交换的数据量比较小,那用非阴塞方式是完全可以的,当时改错我也改了很
长时间,到头来看看都是自己的程序编写的问题,所以,使用控件编程不要碰到什么问题就
归疚于所用控件,大多是自己程序的问题。
 
后退
顶部