情况1:
TServerSocket  stNonBlocking
TClientSocket  ctNonBlocking
服务端与客户端用sendtext互发文本都能接收到。
情况2:
TServerSocket  stThreadBlocking
TClientSocket  ctNonBlocking
为什么只有服务端用sendtext发文本客户端能接收到,而客户端发服务端却不能接收。Accept与OnRead都不触发呢?
我用TcpServer与TcpClient在情况2下都能接收,是不是前一组控件存在Bug啊?
请大家一起来探讨,分不是问题。我想这也是初学都想知道的问题。

解决方案 »

  1.   

    我怎么就看不惯这些动不动就喊bug的人呢。既然承认是初学为什么不怀疑自己的问题?
      

  2.   

    那请问你知道出现这种情况的原因吗?
    我要的是答案,不是空头的批评。而且明显是个“?”号,我又没断言它有Bug。
      

  3.   

    你描述的情况不太清楚,我估计你是以为简单把server端设定为 stThreadBlocking 就是多线程了。线程方式是需要你自己给每个连接分配线程的,在线程的里面用阻塞式来通讯,在服务端的OnRead,OnWrite这些事件里面是收不到东西的。
    delphi的stThreadBlocking  help里面有个简短的例子。
      

  4.   

    到现在才连上CSDN,连别的网站好好的,这网站怎么搞得!我看了一天的资料和例子,想找出点原理出来,无奈刚接触很难一下子参透其中奥秘。我还想初级问题想问前辈!你的意思是说一个Socket连接分配一个线程,所有数据接收发送都要在这个线程中完成。onRead和OnWrite又不能触发,这样是不是只能在线程中做个接收循环来接收客户发来的信息?我看到在ScktComp的TServerClientThread类声明中有DoRead和DoWrite,这两个过程有什么用呢?是不是在客户来数据时触发呢?麻烦了!!!^_^
      

  5.   

    那个什么DoRead,DoWrite应该是他自己写的。我已经有4年多没用这个控件了,电脑里面也没装。
    我只能凭记忆给你说了。ServerSocke好像有个 OnThreadStart和OnThreadEnd,
    每次有新的连接都会触发这个OnThreadStart事件,
    这个函数的参数有一个就是现成的据柄,不过他是空的,你需要自己建立一个线程,这个线程需要你自己声明类,他应该是从 TServerClientThread继承下来的,里面用流的方式操作。你在网上搜索一下 TServerClientThread 应该有很多文章。
    随便给你找了一个 http://www.delphibyte.com/article/viewart.php?id=20borland 6开始采用了Indy来替代borland自己的Socket控件,我没用过IdTcp这些,只是简单的看了一下,他的比较方便了,感兴趣你也可以研究一下。最后说句废话,解决问题跟重要的是学会解决问题的方法,这么个小问题你居然在网上放了n天,找到切入点网上哪儿都能找到答案。