我在delphi里服务端用serversocket阻塞模式来编程,clientsocket也是用阻塞模式来编程,
但是我在客户端开60个线程来对服务端测试时,当线程到到几个后,客户端会出现“windows socket error 不能做任何连接,因为目标机器积极拒绝它(10061),on api connect ”我服务端用twinsocketstream 来读取和发送数据
在就是在多线程里adoconnection和ado动太访问数据库如何很好的控制

解决方案 »

  1.   

    无论你服务端用什么组件,建立连接霎间并发能力并不会太高。通常,TSERVERSOCKET,SOCKET组件LISTEN队列长度最大为5,也就是最多存在五个正在连接而还未成功
    的连接,这时候再多连接,就没有位置让它等待,就会返回100061
      

  2.   

    那我现在服务端用serversocket连接60个点,
    serversocket采用threadblocking的模式,中心库采用oracle,同时一个线程、
    可能还要到异地的sql6.5去取数据库,现在程序在几个客户连接测试后,
    怎么现在再次打开oracle会出先"ora-12514 Tns listener could not resolve
    service_name given in connect desciptor"
    好象oracle连接不上啊,难道serversocket多线程去连接oracle会有什么设置吗,急急......
      

  3.   

    在OnError事件中重新连接,多次后一般能连接成功
    不过要指定失败次数,比如超过10次就不再连接
      

  4.   

    下面是我在线程中连接例子,你改一下吧
    procedure TMyThread.CSocketError(Sender: TObject; Socket: TCustomWinSocket;
      ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    begin
      FTimes := FTimes + 1;
      FMemo.Lines.Add(FText+' '+IntToStr(FTimes)+' Times Error Connecting To : ' + FServer);
      if FTimes<11 then
        Execute;
      ErrorCode := 0;
    end;
      

  5.   

    无论你服务端用什么组件,建立连接霎间并发能力并不会太高。通常,TSERVERSOCKET,SOCKET组件LISTEN队列长度最大为5,也就是最多存在五个正在连接而还未成功
    的连接,这时候再多连接,就没有位置让它等待,就会返回100061不要误导用信号量等等控制线程,用winsock api来开发(需要高性能的通讯程序最好不要用Delphi的现成组件),我写的通讯平台客户端可以同时并发几千个连接,服务端可以运行几个礼拜不停机都没问题.如果客户端
    很多,最好在通讯服务端实现负载均衡等技术,这样你客户端几千上万的连接都没问题
      

  6.   

    delphi有几个版本的serversocket等控件据说有BUG,不是很可靠.用7.0会好点.