TTcpServer控件高手请进

top_hipster 2005-09-21 06:51:44
TTcpServer控件是D7才加入的控件,Borland已经不建议用户使用旧的TClientSocket和TServerSocket了。
TTcpServer有三种模式bmBlocking/bmNonBlocking/bmThreadBlocking.
目前我是用bmThreadBlocking模式由TTcpServer自动为每个连接分配线程,但是问题在于当每个连接建立的时候TTcpServer的OnAccept事件会正常触发,在这个事件的内部也可以收发数据,但是只要这个事件返回,这个连接就会被释放了。这样每次在Client端发送数据都要重连一次。请问高手这是怎么回事,如何才能很好的控制TTcpServer。

另外,两种模式我没试过,似乎和Windows Socket API使用很象,有哪位大哥知道的话,也希望能够不吝赐教。

TTcpServer这方面的书实在太少了?Delphi自带的例子也太简单,刚好是连接,执行一次收发,然后结束,所以没有任何价值。
...全文
342 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
FengSC 2005-10-18
  • 打赏
  • 举报
回复
其实写一个Socket Server也很简单的,而且有很多例子,在这方面我从来不赞成使用控件,因为网络通讯需要控制的东西太多了,控件只能提供一个简单的模型,当然,如果只是简单的测试程序也可以考虑。
我不懂电脑 2005-10-18
  • 打赏
  • 举报
回复
TTcpServer基本上是鸡肋,要么用老的TClientSocket,要么用TIdTCPClient
yhycsb2001 2005-10-11
  • 打赏
  • 举报
回复
好!
cmoring 2005-10-08
  • 打赏
  • 举报
回复
study
shadowstar 2005-10-07
  • 打赏
  • 举报
回复
TTcpServer可以说是一个不完整的控件,不过代码写的还是很精练,比Indy的清楚多了,建议楼主研究一下它的代码。

如果想使用它要重写TClientSocketThread,它在Execute方法里只是Accept然后释放:

procedure TClientSocketThread.Execute;
begin
ThreadObject := Self;
while not Terminated do
begin
if Assigned(FServerSocketThread) and not FServerSocketThread.Terminated and
Assigned(FServerSocketThread.ServerSocket) then
begin
FClientSocket := TCustomIpClient.Create(nil);
try
FServerSocketThread.ServerSocket.Accept(FClientSocket);
finally
FClientSocket.Free;
FClientSocket := nil;
end;
end;
if not Terminated then
Suspend;
end;
end;

另外在ServerSocketThread.OnGetThread事件中创建自己的处理线程。

top_hipster 2005-09-26
  • 打赏
  • 举报
回复
sfengnet(学贵有恒) : 如果不返回,下一个连接就不能正常接受了,再说了我说的是TTcpServer不是你讲的TIdTcpServer,是没有OnExecute的
sfengnet 2005-09-26
  • 打赏
  • 举报
回复
晕,你为什么要返回呢?

客户端连接后会触发 OnExecute 事件,你在那写你的处理代码就可以了
Pasp 2005-09-21
  • 打赏
  • 举报
回复
TTcpServer仅仅是个控件,推荐你看一本书《windows网络编程》第二版。

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧