CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

Socket的多线程问题

楼主WorldCreater(造化天尊)2000-12-04 22:12:00 在 Delphi / VCL组件开发及应用 提问

1.如果有多个ClientSocket连接到一个ServerSocket上  
    如何得到连接的ClientSocket的个数  
  2。怎样利用ClientSocket和ServerSocket编写多线程程序  
      如:  
          现有多个ClientSocket连接到一个ServerSocket上  
      现在要对每个连接建立一个线程分别响应客户请求,应怎么写 问题点数:100、回复次数:52Top

1 楼aimin(天剑)回复于 2000-12-04 23:09:00 得分 50

1.在serversocket的OnThreadStart、OnThreadEnd事件设个计数器即可。  
  2.将你要提供的服务写成一个线程程序,OnGetTread时生成一个线程即可。  
  我做过一个例子,没在手边,如果需要给我发mail.Top

2 楼zwz()回复于 2000-12-05 07:57:00 得分 0

我也需要!Top

3 楼vfrog(小蛙)回复于 2000-12-05 08:33:00 得分 0

aimin:  
      我也需要这个例子。多谢。另外,有一事不明,用DELPHI中的控件SERVERSOCKET和ClientSocket创建连接时,特别慢是什么原因?包括DELPHI自带的例子CHAT。  
      EMAIL:     vfrog@sina.com.cnTop

4 楼BCB(天下三分明月夜,二分无赖是扬州)回复于 2000-12-05 09:33:00 得分 20

 
  TServerSocket.ServerType的值为stNonBlocking(缺省值)时,  
  只有一个缺省线程,不会产生其它线程,编程简单,  
  可以同时传送数据,互不干扰:  
   
  1.个数:ServerSocket1.Socket.ActiveConnections;  
  2.每响应一个连接:  
                ServerSocket1.Socket.Connections数组就会多一项;  
                这个数组类型是TCustomWinSocket   [   ];  
                ServerSocket1有很多事件:  
                        OnAccept(Socket:   )  
                        OnClientConnect   (Socket:   )  
                        OnClientRead(Socket:   )等  
                        都有一个Socket类型的参数,通过此Socket参数就可  
                              区分是哪一个客户发来的,互不干扰;例如:  
                TForm1.ServerSocket1ClientWrite(Sender:TObject   Sender,  
              Socket:TCustomWinSocket)  
                                               
                                  Socket.RemoteAddress           发送客户的IP地址  
                Socket.RemoteHost                 发送客户的地址别名  
   
   
   
     
   
   
  Top

5 楼WorldCreater(造化天尊)回复于 2000-12-05 12:39:00 得分 0

to   aimin   :  
      my   email:   primary@email.com.cn  
    thank   you!  
        看到你的回答时:我已在   OnGetSocket和   OnGetThread事件里  
  创建了线程。不知道对不对。我甚至不知道在   TServerClientThread  
  里怎么接收和发送数据。让你见笑了  
   
  另外:得到连接的ClientSocket的个数,ServerSocket它自己没有一个计数器吗  
   
  Top

6 楼WorldCreater(造化天尊)回复于 2000-12-05 12:50:00 得分 0

能不能说说下载软件的  
   
  Socket   连接的过程  
   
  为了表示我的谢意,我给这个帖子加50分Top

7 楼BCB(天下三分明月夜,二分无赖是扬州)回复于 2000-12-05 13:51:00 得分 0

我看了你们的贴子和其它贴子,  
  弄不懂你们为什么提到Socket就想到用多线程?  
  同步方式才需要多线程,  
  缺省方式是异步方式,不需要是多线程啊。  
  请同行指点迷津!!!  
   
   
  Top

8 楼zwz()回复于 2000-12-05 14:11:00 得分 0

to   aimin:  
        如果你有一个有关socket的多线程的例子,请给我发一份。谢谢!  
  Email:zhangwz@tonghua.com.cnTop

9 楼wx_zhang()回复于 2000-12-05 14:20:00 得分 0

to   aimin:  
      mail   to   me   ,   wx_zhang365@sina.com,   thanks   Top

10 楼aimin(天剑)回复于 2000-12-05 15:14:00 得分 0

我的例子已经测试完的,在delphi   5.0   下,马上发给各位,serversocket必须设成阻塞方式。  
  mail已经发送成功了,没收到的EMAIL通知我。Top

11 楼aimin(天剑)回复于 2000-12-05 15:21:00 得分 0

to:BCB  
  试想不用多线程的话,每个客户端连接的状态你都要保存,而且不同的情况还要判断,进行不同的处理(比如说:SMTP服务器和POP3服务器),累不累?采用多线程的话,每个线程处理的都是一个完整的会话,简便多了。这好象聊天,一个人对一个人轻松又清楚,一个人对100个人,七嘴八舌的,得把他累死!!^-^Top

12 楼WorldCreater(造化天尊)回复于 2000-12-05 19:33:00 得分 0

我好象会读写了,不知道对不对:  
  读:ClientSocket,   ServerSocket  
  读或写客户端(read   or   send   to   client):  
    TWinSocketStream   *pStream   =   new   TWinSocketStream(ClientSocket,   60000);  
                pStream->read  
                pStream->write  
  Top

13 楼WorldCreater(造化天尊)回复于 2000-12-05 19:40:00 得分 0

to:   aimin  
      设成阻塞方式的 是什么意义的 多线程( 对不起,我还没看 )  
  对每次   OnReadClient 事件读出的数据产生一个线程处理么?  
     
  应该是一个客户端一个线程(我的理解)Top

14 楼WorldCreater(造化天尊)回复于 2000-12-05 20:04:00 得分 0

有人告诉我连接个数可由  
  ServerSocket1.Socket.ActiveConnections  
  得到(我在大富翁论坛的提问   www.delphibbs.com/delphibbs   )  
  Top

15 楼aimin(天剑)回复于 2000-12-05 22:41:00 得分 0

to:   WorldCreater  
      Socket是流操作,阻塞方式(ThreadBlocking)实际上相当于一种分时处理,别人不用时你用。可以采用多线程的方法“模拟”实现多个连接。  
   我的例子中实际也是采用ServerSocket1.Socket.ActiveConnections获得连接个数,当然也可以象我上面说的,设计数器来统计线程的数量。  
   你的读、写方式好象不太对,太麻烦了吧!  
   看完我的程序后有问题可以讨论。Top

16 楼WorldCreater(造化天尊)回复于 2000-12-06 22:30:00 得分 0

暂时我手边没有   Delphi   不能看代码  
  不知建立的连接能不能交互的  
  即: Client   发一个消息给   Server   后  
     等待   Server   做出一个回答,然后再发一个消息 .......  
              直到 Client   发消息后才拆除连接 或 Client 断开连接后,   
          Server   才拆除连接  
  Top

17 楼aimin(天剑)回复于 2000-12-07 00:22:00 得分 0

当然可以,不知你看我的例子了没有,你可以自已定通信协议!!Top

18 楼WorldCreater(造化天尊)回复于 2000-12-07 10:07:00 得分 0

能不能说说  
  我手边实在没有Delphi  
  只有   C++   build  
  只能用写字板看  
  麻烦你了Top

19 楼airhorse(编程至尊宝)回复于 2000-12-07 20:54:00 得分 0

 
      TServerSocket   控件   只是一个,简单的   inprise   帮你写好的侦听线程。要作出一个处理多个客户连接的   Server。早着呢?  
      1、有线程池  
      2、消息处理  
      3、线程同步机制  
  好几个月的工作量  
  Top

20 楼WorldCreater(造化天尊)回复于 2000-12-07 22:18:00 得分 0

to   aimin:  
    我看了你的程序,好象只是客户端向服务器端发出一个消息后  
  服务器作出一个线程响应。客户端没有在接收到数据后  
  再向服务器发消息,要求响应  
         
  procedure   TForm1.ClientSocket1Read(Sender:   TObject;  
      Socket:   TCustomWinSocket);  
  var  
      buffer:array   [0..900]   of   char;  
      i,j:integer;  
      s1:string;  
  begin  
          i:=socket.ReceiveLength;  
          Socket.ReceiveBuf   (Buffer,   i);  
          s1:='';  
          for   j:=1   to   i   do   s1:=s1+buffer[j];  
          showmessage('Read:   '+s1);  
  end;  
   
  我曾在这个过程里,接收到数据后  
  Socket.Send(   "xxx"   );向服务器再发一个消息  
  要求服务器响应,但程序就停在这儿了  
  procedure   TForm1.ClientSocket1Read(Sender:   TObject;  
      Socket:   TCustomWinSocket);  
   
  还有,客户端也设成阻塞模式时   ctBlocking  
  客户端收不数据  
  不知是什么原因Top

21 楼aimin(天剑)回复于 2000-12-08 00:11:00 得分 0

to   WorldCreater:  
      SERVER端每产生一个客户连接时生成一个线程,客户端不要设成阻塞模式,因为那样客户端也要做成多线程方式 ,没必要。  
   至于双方的通信,你可以自已定义会话协议,在TForm1.ClientSocket1Read中判断SERVER发送过来的消息是什么意思,再作出响应就行了。  
   我的客户端程序发送接收方法都有了。Top

22 楼aimin(天剑)回复于 2000-12-08 11:53:00 得分 0

某些同志的E-MAIL发不过去,有想要程序的给我发MAIL。oam@chinese.comTop

23 楼WorldCreater(造化天尊)回复于 2000-12-08 12:36:00 得分 0

客户端当然也要做成多线程的  
  因为客户端要交互的啊Top

24 楼aimin(天剑)回复于 2000-12-08 14:45:00 得分 0

不对,如果客户端需要交互,可以在客户端的程序中设一个多线程的SERVERSOCKET,这就好象插头和插座,CLIENTSOCKET与CLIENTSOCKET是不能通信的。Top

25 楼WorldCreater(造化天尊)回复于 2000-12-08 18:40:00 得分 0

我认为发出请求的为客户  
  比如一个   icq   应当有   一个   ServerSocket   和    一个   ClientSocket  
  ServerSocket用于响应别人的请求,   ClientSocket用于向别人发出请求  
   
  如果我现在要实现这样的一种对话:  
  我用   ClientSocket   发起请求  
  me:     send   "a"  
  server:   answer   me   "x"   or   "y"  
  me:   if   me   receive   "x"  
              me   send   to   server   "b"  
          if   me   receive   "y"  
              me   send   to   server   "c"  
  server:   if   "b"     answer   me   "m"  
                  if"c"   answer   me   "n"  
  .........  
  这样不断地对话直到我通知可以断线,或我直接断开  
   
  这该怎么做Top

26 楼WorldCreater(造化天尊)回复于 2000-12-08 18:43:00 得分 0

就象打电话一样  
   
  请多多指教,呵呵  
  分数有的是,希望能彻底弄清楚Top

27 楼WorldCreater(造化天尊)回复于 2000-12-08 18:50:00 得分 0

也许我说的还不是很清楚  
   
  我要做的是用一个客户端发起请求后  
  在服务器创建一个线程响应我的请求后  
  在不断开连接的情况下  
  进行多次的交互活动Top

28 楼aimin(天剑)回复于 2000-12-08 22:39:00 得分 0

我明白你的意思,我为什么说要自定义通信协议就是这个意思,如果服务器端的线程不结束或连接不关闭,这个线程的连接就一直存在(至少SERVER端的线程是那么认为的),CLIENT端也可以一直等待。当然除非是任何一端接到结束的标记。Top

29 楼aimin(天剑)回复于 2000-12-08 22:52:00 得分 0

通信有一个共性,都是客户端申请,服务端响应,客户端再申请,。。。  
  所以说象你要求的功能不难实现,  
    服务器端的线程不要终止,接到消息就响应,一直到连接断开或接到结束标志。  
    客户端在CLIENTSOCKET1READ事件中等着,有回应就判断,再回答;因为是单线程的,可以设置一个定时器,一定时间内没有回应,就发送一个空信号,就象SMTP中的NOOP一样,为的是判断连接是否未断(当然服务器端也是一样)。  
    这里面关键是定义协议。我一再强调,设计协议是至关重要的,没有协议,双方(多方)就没有办法通信。所以说你还是把要求说得具体一点。  
    我们还是通过MAIL来交流吧。Top

30 楼WorldCreater(造化天尊)回复于 2000-12-08 22:57:00 得分 0

to   aimin:  
  我的email:   primary@email.com.cnTop

31 楼WorldCreater(造化天尊)回复于 2000-12-14 19:30:00 得分 0

诸位对不起  
  也许这个问题我会等很久才结束  
  不过请放心,该给的分决不会少的Top

32 楼WorldCreater(造化天尊)回复于 2000-12-26 22:04:00 得分 0

我看了一个问题,不知道 是现在就给大家分发分数好  
  还是再过一阵子,因为我现在有事,暂时不能做这个问题  
  大家决定好吗  
  http://www.csdn.net/expert/TopicView.asp?id=52338Top

33 楼halfone(蛮牛)回复于 2001-01-02 12:45:00 得分 0

to   aimin:  
      如果你有一个有关socket的多线程的例子,请给我发一份。谢谢!  
  Email:manniuyemanniu@sina.comTop

34 楼saoren(saoren)回复于 2001-01-02 17:17:00 得分 30

1:  
  ServerSocket1.Socket.ActiveConnections;  
  2:  
  Server端:  
  type   MyServerSocketThread=class(TServerClientThread);  
      private  
      ...  
      public  
      constructor   Create(CreateSuspended:   Boolean;   ASocket:   TServerClientWinSocket;  
      procedure   ClientExecute;override;  
      ..  
  end;  
     
  procedure   TForm1.Oncreate;  
  begin    
      with   ServerSocket1   do  
      begin  
          ServerType   :=   stThreadBlocking;  
          OnGetThread   :=   GetThread;//GetThread是自己写的事件。  
      end;  
  end;  
   
  procedure   TForm1.GetThread(Sender:   TObject;   ClientSocket:   TServerClientWinSocket;  
              var   SocketThread:   TServerClientThread);  
  begin  
      SocketThread:=TMyServerSocketThread.Create(false,ClientSocket);  
  end;  
   
  procedure   TmyServerSocketThread.Create(CreateSuspended:   Boolean;   ASocket:   TServerClientWinSocket;  
  begin  
      ...//自己写了。  
  end;  
   
  //Client   link   Thread.   how   do   you   do??   in   here  
  procedure   TMyServerSocketThread.ClientExecute;  
  begin  
      ...  
  end;  
   
  有例子可看,\delphi5\source\vcl\scktsrvr.dpr.  
  那里的从TServerSocket继承的子类用法,还有它的客户端线程,TService的用法,很详细的。以上的东西我也是从那看来的。Top

35 楼saoren(saoren)回复于 2001-01-02 17:17:00 得分 0

1:  
  ServerSocket1.Socket.ActiveConnections;  
  2:  
  Server端:  
  type   MyServerSocketThread=class(TServerClientThread);  
      private  
      ...  
      public  
      constructor   Create(CreateSuspended:   Boolean;   ASocket:   TServerClientWinSocket;  
      procedure   ClientExecute;override;  
      ..  
  end;  
     
  procedure   TForm1.Oncreate;  
  begin    
      with   ServerSocket1   do  
      begin  
          ServerType   :=   stThreadBlocking;  
          OnGetThread   :=   GetThread;//GetThread是自己写的事件。  
      end;  
  end;  
   
  procedure   TForm1.GetThread(Sender:   TObject;   ClientSocket:   TServerClientWinSocket;  
              var   SocketThread:   TServerClientThread);  
  begin  
      SocketThread:=TMyServerSocketThread.Create(false,ClientSocket);  
  end;  
   
  procedure   TmyServerSocketThread.Create(CreateSuspended:   Boolean;   ASocket:   TServerClientWinSocket;  
  begin  
      ...//自己写了。  
  end;  
   
  //Client   link   Thread.   how   do   you   do??   in   here  
  procedure   TMyServerSocketThread.ClientExecute;  
  begin  
      ...  
  end;  
   
  有例子可看,\delphi5\source\vcl\scktsrvr.dpr.  
  那里的从TServerSocket继承的子类用法,还有它的客户端线程,TService的用法,很详细的。以上的东西我也是从那看来的。Top

36 楼guowzgyc(Developer)回复于 2001-01-04 09:51:00 得分 0

to   aimin:  
      如果你有一个有关socket的多线程的例子,请给我发一份。谢谢!  
  Email:gyc@drpacific.comTop

37 楼WorldCreater(造化天尊)回复于 2001-01-09 23:57:00 得分 0

有点奇怪  
  ServerSocket为阻塞模式  
  当   ClientSocket   业为阻塞模式时能收到数据  
  为异步模式时   ServerSocket   好像收到的都是   0   字节Top

38 楼WorldCreater(造化天尊)回复于 2001-02-18 22:41:00 得分 0

很久没来这了  
  为表示我的歉意  
  我再加50分  
  然后结账  
  Top

39 楼WorldCreater(造化天尊)回复于 2001-02-18 22:42:00 得分 0

奇怪了  
  我不能再加分Top

40 楼WorldCreater(造化天尊)回复于 2001-02-18 22:45:00 得分 0

你最多只能给20分,分数增加后超过了。, 返回上一页。  
   
  抱歉Top

41 楼voyager(Hi,Hi)回复于 2001-02-19 12:06:00 得分 0

谁收到例子的,给小弟一份:voyage007@netease.comTop

42 楼why_wf(假面人)回复于 2001-02-23 21:14:00 得分 0

I   want   a   copy!mail:why4tc@sina.com  
  thanksTop

43 楼gjq2000(小兵)回复于 2001-04-29 11:26:00 得分 0

to   aimin:  
        救命,如果你有一个有关socket的多线程的例子,请给我发一份。谢谢!  
  Email:gjq1998@163.netTop

44 楼elecs(出尘)回复于 2001-06-07 11:31:00 得分 0

to   aimin:  
        如果你有一个有关socket的多线程的例子,能否给我发一份。谢谢!!!    
  Email:elecs@sina.com    
   
  Top

45 楼cooloney(酷龙)回复于 2001-06-07 20:10:00 得分 0

to   aimin:  
      谢谢你,我现在在搞毕业设计,这好需要你这方面的例子,可以发一个给我马?  
  我的email:cooloney@163.net  
      再次谢谢!!Top

46 楼wangjb(天蓝的我)回复于 2001-07-05 18:03:11 得分 0

to   aimin:  
      麻烦你给我发一个SERVER端为阻塞,CLIENT端为非阻塞的例子,我试了几天不得要领  
  我的EMAIL:wjb1681@sina.com.cn  
      多谢!!Top

47 楼liyee(liyee)回复于 2001-07-07 23:24:14 得分 0

to   aimin:  
        急需阻塞方式的多线程客户服务器通讯的例子,帮帮我!  
        我的mail   :   jcfcomm555@263.net.  
        我提议加20分Top

48 楼hellojw(呵呵,是我吗)回复于 2001-07-18 18:40:57 得分 0

我也急的要命,给我一份好吗ganzhipeng@21cn.com  
  谢谢!!!!!Top

49 楼xionghm(MMX)回复于 2001-07-19 15:34:36 得分 0

to   aimin:  
      如果你有一个有关socket的多线程的例子,请给我发一份。谢谢!  
      我现在好着急,好多东东搞不懂。  
  Email:xionghm@263.netTop

50 楼hellojw(呵呵,是我吗)回复于 2001-07-20 09:57:57 得分 0

to   aimin:  
      如果你有一个有关socket的多线程的例子,请给我发一份。谢谢!  
      我现在好着急,接个项目就是这个。  
  Email:ganzhipeng@21cn.comTop

51 楼duanfeng(段玉)回复于 2001-09-27 16:16:57 得分 0

to   aimin:  
  我也不太懂  
  Email:duansoft@21cn.comTop

52 楼leafage(yejl)回复于 2001-09-30 13:05:14 得分 0

to   aimin:  
  请给我发一份。谢谢!  
  Email:yejl2000@21cn.com   Top

相关问题

  • 多线程socket!!!
  • 多线程SOCKET的问题!
  • 多线程Socket问题~~
  • socket的多线程问题
  • 多线程 用socket通信
  • 多线程socket问题
  • 多线程SOCKET通信中的问题
  • 有关多线程和Socket的问题
  • Java中多线程和Socket的问题?
  • 求购(socket)多线程原码,谢谢!

关键词

  • .net
  • 线程
  • 多线程
  • 客户
  • 连接
  • 服务器
  • socket
  • 协议
  • aimin
  • clientsocket

得分解答快速导航

  • 帖主:WorldCreater
  • aimin
  • BCB
  • saoren

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo