TServerSocket
属性 Active 表示服务器是否已触活。服务器激活后会打开端口,对端口进行监听。 Port 为服务器触活后监听的端口号 Socket 有所有端口操作功能 (如:得到所有对应的客户端连接等等)
事件OnListen 服务器激活,监听端口时触发
OnClientConnect 客户端试图连接服务器时触发
OnAccept 事件 当客户端连接上来。这里触发这个事件。如果服务器不想该客户连接,可以用 参数里的 socket.close 把连接关闭
OnClientDisconnect 客户端断开时触发 OnClientError 客户端发生错误时触发 如: 客户端异常断开会触发 10053 错误
OnClientRead 当收到客户端发来的数据时会触发这个事件。但如果服务器没处理,那该事件不会再触发了。
OnClientWrite 以为在服务器向客户端写数据时会触发,但事实上好象没有发生。只在客户端连接好后激发了,在 OnAccecpt 事件之后。
事件触发的次序 (Noblocking 方式)OnListenOnClientConnectOnAcceptOnClientWrite....OnClientReadOnClientDisconnect
TClientSocket
属性Active 是否激活Host 服务器地址,可以是IP也可以是机器名或域名。Port 服务器的端口Socket socket 对象发送数据 TClientSocket.Socket.SendText();或 TClientSocket.Socket.SendBuf();一般ASCII 用 SendText二进制用 SendBuf
接收数据 TClientSocket.Socket.ReceiveLength 数据长度 TClientSocket.Socket.ReceiveBuf(var Buf; Count: Integer): Integer; // 一般用于二进制 TClientSocket.ReceiveText: string; // 一般用于 ASCII
工作模式 (个人看法) TServerSocket 有两种工作模式 stNonBlocking (非阻塞模式) 与 stThreadBlocking (线程阻塞模式)
非阻塞模式 stNonBlocking 是默认的工作模式。是用单线程事件方式进行工作的。每个连接有数据到时才触发相应的消息,通知服务器对客户端进行处理 如 OnClientRead
线程阻塞械式 是用多程序阻塞方式进行工作的。每个连接对应于一个线程。对相应的SocketThread进行操作,就可以操作相应的连接。 但对 TServerSocket 而言,触发的事件就不同了. 如:有客户端连接 就不会触发 OnClinetConnect 事件了。而是 GetThread 与 ThreadStart 事件。
TClientSocket 也有两种工作模式 ctNonBlocking (非阻塞模式) 与 ctBlocking (阻塞模式)
//转载这篇文章,目的是这段内容,其它的我都懒得看,呵呵。。。(^_^)
非阻塞模式 是以消息的方式进行工作的,主要的体现在 OnRead 事件上,如连接上服务器之后,服务器有数据发过来。客户端会触发OnRead事件,表示有从网络上收到数据。
阻塞模式 阻塞通讯过程的方式。如服务器有数据发过来。客户端不会触发OnRead事件,如果客户端永远不自己去读,那客户端也就永远不会知道有数据到了。
相比而言,要根据实现情况选择工作方式。如果如聊天室之类的程序。客户端需要知道什么时候有数据到,而且数据的到达是不可预知的。那就要用非阻塞模式。如果是一般的“一问一答式”的通讯过程,如:发送邮件,FTP之类的。那用阻塞方式也许更好。
错误说明:可能发生的错误的错误码 10048: 打开一个已经打开的端口时会出现这个错误! 解决方法:另外打开一个端口,或先关闭相关程序或服务。
客户端 10061: 可以ping通服务器的IP地址,但不能与服务器指定端口建立连接。 可能的原因有:1. 服务器相关软件或服务没有启动。 2. 服务器端的防火墙可能把连接过滤掉了。
10065: 连接一个不存在的IP地址时会发生这个错误! 可能的原因:1, 对方没有开机 2, 网络故障 3, IP 地址本身有问题。
服务器端 10053: 这个错误有点特殊,一般是服务器端发生。 只在一个情况下会发生:连接链接后,服务器向客户端发送了数据,但客户端没有去读取,客户端再关闭连接时。这时服务器端会出现这个错误!
