我在程序中使用了这两个控件
一般运行时没什么问题,但当信息的收发同时发生时,程序就只能收信息,再也不能发送信息了,请问这是怎么回事?

解决方案 »

  1.   

    对于ClientSocket组件,从字面上就可以看出,它用于请求方。也就是说,它的动作是主动地建立连接。显然,ServerSocket组件用于响应方,它的动作是侦听以及被动接受连接。 组件ClientSocket的属性是相对静态的,它和ServerSocket之间只是连接和断开的关系。并且仅当ServerSocket对其接受才表示建立连接。 组件ServerSocket的属性是动态的。伴随着一个新的ClientSocket与之建立连接的同时,就会产生一个新的Socket与该ClientSocket对应,保持单独的连接,进行单独的通信。因此,在同一个 ServerSocket中,可以与多个ClientSocket保持同时连接和各自独立的通信。ServerSocket的属性 Socket.ActiveConnections用于表示客户端连接的数量;属性Socket.Connections[Index] 则用于访问单个与ClientSocket连接的Socket。 正是这样的结构,才使得WinSocket 技术能够稳定实现一个服务程序向多个客户端提供服务。 在独立的ClientSocket中,属性Socket.Data 是一个指针,缺省值是nil ;在ServerSocket的每个独立的Socket.Connections[Index]中, 属性Data也是一个指针,缺省值是nil 。因此,可以通过该指针建立并保存各自独立的相关信息,用于实现各自独立的通信。而在ClientSocket的事件 OnRead中,调用方法传递的Socket值就是响应该事件的对象属性ClientSocket.Socket 。同样,在 ServerSocket的事件OnClientRead中,调用方法传递的参数Socket就是对应于当前发送数据客户端的唯一的Socket连接,即ServerSocket.Socket.Connections[Index]。这样,就能够对不同的连接分得清清楚楚明明白白。
    首先介绍实例程序的设计思想。上传文件的过程是这样的(这里的C和S分别代表客户端和服务器端):  C:请求上传文件; 
     S:准备就绪,可以接收; 
     C:需要上传的文件信息; 
     S:收到文件信息: 
     C:第一个包; 
     S:收到第一个包;创建文件,开始写数据; 
     C:中间的包; 
     S:收到中间的包;继续写数据; 
     C:发送最后一个包,关闭文件; 
     S:收到最后一个包;写数据,关闭文件。 
    下载文件的过程是这样的:  C:请求下载文件; 
     S:准备就绪,可以下载; 
     C:需要下载的文件信息(文件名); 
     S:反馈文件信息(文件大小); 
     C:准备就绪,可以接收数据; 
     S:第一个包; 
     C:收到第一个包;创建文件,开始写数据; 
     S:中间的包; 
     C:收到中间的包;继续写数据; 
     S:发送最后一个包,关闭文件; 
     C:收到最后一个包;写数据,关闭文件;下载成功; 
     S:下载成功。
      

  2.   

    原理楼上够详细,不过还可以参考一下delephi自带的例题