热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

TServerSocket:如何在发送消息之前检查ListView上的特定客户端是否仍处于连接状态?

如何解决《TServerSocket:如何在发送消息之前检查ListView上的特定客户端是否仍处于连接状态?》经验,为你挑选了1个好方法。

我有一个Timer,想要向每个客户端发送一条消息ListView,例如确定ping时间。然后我有以下代码:

procedure TMainForm.Timer1Timer(Sender: TObject);
var
  i: Integer;
begin
  try
    for i := 0 to ListView1.Items.count - 1 do
    begin
      ListView1.Items.Item[i].SubItems.Objects[2] := TObject(GetTickCount);
      ServerSocket1.Socket.Connections[i].SendText('ping' + #13#10);
    end;
  except
    exit;
  end;
end;

在发送之前,可以更适当地检查客户端是否已真正连接或类似的连接。怎么做?提前致谢。



1> Remy Lebeau..:

无需检查连接。如果客户端实际上已断开连接,则在触发处理程序Connections[]时,该客户端将不再位于服务器列表中OnTimer。您应该为OnClientDisconnect分配了处理程序,以TServerSocket从中删除客户端TListView

如果由于某种原因,客户端仍在Connections[]列表中(即,由于基础连接已丢失但TServerSocket尚未检测到),则套接字将仅缓存所有传出数据,直到其出站缓冲区填满为止,然后将开始WSAWOULDBLOCK为每个发送返回错误。最终,操作系统将使死连接超时并TServerSocketConnections[]列表中将其删除,从而触发OnClientDisconnect事件。

至少,在显示的代码中,应该将send循环更新为Close()实际上无法发送的任何套接字,从而触发OnClientDisconnect事件以从中删除该客户端TListView,例如:

procedure TMainForm.ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
var
  Item: TListItem;
begin
  Item := ListView1.Items.Add;
  Item.Data := Socket;
  ...
end;

procedure TMainForm.ServerSocket1ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
var
  Item: TListItem;
begin
  Item := ListView1.FindData(0, Socket, True, False);
  if Item <> nil then
    Item.Delete;
end;

procedure TMainForm.Timer1Timer(Sender: TObject);
const
  s: AnsiString = 'ping' + #13#10;
var
  Item: TListItem;
  Socket: TCustomWinSocket;
  p: PAnsiChar;
  i, len, sent: Integer;
begin
  for i := 0 to ListView1.Items.Count - 1 do
  begin
    Item := ListView1.Items[i];
    Item.SubItems.Objects[2] := TObject(GetTickCount);
    Socket := TCustomWinSocket(Item.Data);
    try
      // SendText() does not handle partial sends, or Unicode strings...
      //Socket.SendText('ping' + #13#10);
      p := PAnsiChar(s);
      len := Length(s);
      repeat
        sent := Socket.SendBuf(p^, len);
        if sent = -1 then
        being
          if WSAGetLastError() <> WSAEWOULDBLOCK then
            Break;
          // TODO: stop trying after several attempts fail...
          Continue;
        end;
        Inc(p, sent);
        Dec(len, sent);
      until len = 0;
      if len = 0 then
        Continue;
    except
    end;
    Socket.Close;
  end;
end;


推荐阅读
  • 本文详细介绍了在 Windows 7 上安装和配置 PHP 5.4 的 Memcached 分布式缓存系统的方法,旨在减少数据库的频繁访问,提高应用程序的响应速度。 ... [详细]
  • 解决宝塔面板Nginx反向代理缓存问题
    本文介绍如何在宝塔控制面板中通过编辑Nginx配置文件来解决反向代理中的缓存问题,确保每次请求都能从服务器获取最新的数据。 ... [详细]
  • Redis: 高效的键值存储系统
    Redis是一款遵循BSD许可的开源高性能键值存储系统,它不仅支持多种数据类型的存储,还提供了数据持久化和复制等功能,显著区别于其他键值缓存解决方案。 ... [详细]
  • 本文详细介绍了在 CentOS 7 系统上安装中文宋体字体的方法,包括操作系统的环境配置、字体管理工具的安装、字体文件的传输与缓存重建等步骤。 ... [详细]
  • 本文详细介绍了在PHP中如何获取和处理HTTP头部信息,包括通过cURL获取请求头信息、使用header函数发送响应头以及获取客户端HTTP头部的方法。同时,还探讨了PHP中$_SERVER变量的使用,以获取客户端和服务器的相关信息。 ... [详细]
  • 本文旨在介绍一系列提升工作效率的浏览器插件和实用小工具,帮助用户在日常工作中更加便捷高效。内容由原作者授权发布。 ... [详细]
  • 详解MyBatis二级缓存的启用与配置
    本文深入探讨了MyBatis二级缓存的启用方法及其配置细节,通过具体的代码实例进行说明,有助于开发者更好地理解和应用这一特性,提升应用程序的性能。 ... [详细]
  • 本文介绍了两个重要的Node.js库——cache-content-type和mime-types,它们在处理HTTP响应头时非常有用。cache-content-type是基于mime-types构建的,并且实现了缓存机制以提高性能。 ... [详细]
  • 本文详细记录了一位Java程序员在Lazada的面试经历,涵盖同步机制、JVM调优、Redis应用、线程池配置、Spring框架特性等多个技术点,以及高级面试中的设计问题和解决方案。 ... [详细]
  • 本文介绍了Linux内核中TCP的三种接收队列:Prequeue、sk_receive_queue和Backlog。这些队列在数据包处理过程中扮演着重要角色,帮助提高系统性能和效率。 ... [详细]
  • 利用Git GUI将本地项目同步至GitHub的方法
    GitHub作为开发者不可或缺的工具,不仅提供了丰富的开源项目资源,还极大地便利了个人项目的管理和版本控制。本文将详细介绍如何使用Git GUI工具将本地开发的项目上传至GitHub。 ... [详细]
  • 深度解析:用友云Pontus限流服务提升系统稳定性
    本文深入探讨了用友云Pontus限流服务的技术细节及其在提高系统稳定性方面的作用,特别是在面对突发流量时的保护机制。 ... [详细]
  • iOS 小组件开发指南
    本文详细介绍了iOS小部件(Widget)的开发流程,从环境搭建、证书配置到业务逻辑实现,提供了一系列实用的技术指导与代码示例。 ... [详细]
  • 本文概述了在GNU/Linux系统中,动态库在链接和运行阶段的搜索路径及其指定方法,包括通过编译时参数、环境变量及系统配置文件等方式来控制动态库的查找路径。 ... [详细]
  • 本文深入探讨了休眠状态下的会话机制,解释其工作原理及对应用程序性能的影响。 ... [详细]
author-avatar
吴慈瑋宗杰
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有