indy tcp的即时通讯的问题

Delphi开发者福音:TMS Component Pack V7.0详述 Delphi作为一款历史悠久的集成开发环境(IDE),自Borland公司推出以来,经历了多个版本的更迭,每一代的Delphi都携带着改进和新特性而来。在早期版本中,组件库主要集中在VCL(Visual Component Library)组件集,这些组件主要针对Windows操作系统进行优化,以提供丰富的用户界面元素和后端功能。 阅读详情
 
http://community.youkuaiyun.com/Expert/topic/4543/4543923.xml?temp=.7700312
INDY自代的例子看了一下,以前用过TServerSocket做过这方面的东西!
 TCommBlock = record   // the Communication Block used in both parts (Server+Client)
     Command: TCommand;
     MyUserName,                 // the sender of the message
     Msg,                        // the message itself
     ReceiverName: string[100]; // name of receiver
   end;
这是他里面的协议的定义,我这里需要的类似的MSN那种 ,先登录,然后是简单的信息通讯,客户大概100左右!我觉得INDY应该能承受的住!这个协议如何能定议的比较灵活,为以后扩展打下基础!希望大家讨论一下!或是有这方面的经验,交流一下!
 
 
 
 
 
问题已找到:
问题还是出现在TThreadList上面,
procedure TServerFrmMain.Button1Click(Sender: TObject);
var
i: integer;
ActClient: PClient;
RecThread: TIdPeerThread;
NewCommBlock: TCommBlock;
begin
try
for i := 0 to Clients.LockList.Count - 1 do//这句,每次循环一个对象,都会EnterCriticalSection 一次,这样就会导致程序不可以继续运行,
改为with Clients.LockList DO 这样就会保证只执行一次EnterCriticalSection !
 
begin
NewcommBlock.Command := cMessage;
NewcommBlock.MyUserName := 'system';
NewcommBlock.Msg := 'system test';
NewcommBlock.ReceiverName := '';
ActClient := Clients.LockList.Items[i];//此处改为ActClient := Items[i];
RecThread := ActClient.Thread;
finally//这里
Clients.UnlockList;
end;
RecThread.Connection.WriteBuffer(NewCommBlock, SizeOf(NewCommBlock), True);
end;
end;
通过查看TThreadlist的源码,然后自定义一个TMYThreadList类,为跟踪使用!这个问题其实大家很容易犯的,如果不看源码或跟踪一下,不容易找到答案的,希望与大家分享一下!
 
 
 
 
IdTcpCilent/Server编程中,AThread.Data指的是什么
这是留给你用的,一般都用来指向用作纪录对方连接的信息的对象或者结构
 
用来保存自己定义的类或其他数据,连接中断时自动释放。
 
这个Data其实就是代表连接对方的东西,
 
比如一个文件服务器,对话开始后,设定一个初始目录,然后接受客户的命令,客户发送cd xxx时,服务器必须记住客户在对话期间的当前目录,所以要持有一个对象或者数据结构来记录这些信息,
 
tpeer = class
 ip: string;
 currDir: string;
end;
 
tserver = class
private
 fTCPServ: TIdTCPServer;
 fClients: TThreadList;
procedure
 procedure onConnect(aThread: TIdPeerThread);
 procedure OnDisconnect(aThread: TIdPeerThread)
 procedure OnCDCommand(aSender: TIdCommand);
 
 
...
 
procedure TServer.OnConnect(aThread: TIdPeerThread);
var
 client: tpeer;
begin
 //当连接开始时,创建客户对象
 
 client := tpeer.create();
 client.ip := ...;
 client.cd := default_directory;
 
 ...
 aThread.Data := client;
 
 //如果有必要,记录将这个对象添加到当前活动对话当中
 //那么, fclientList则反映了当前活动的连接,以及各个连接的相关信息
 fClients.LockList();
 try
    fClients.add(client);
 finally
    fClients.unlocklist();
 end;
end;
 
procedure TServer.OnCDCommand(aSender: TIdCommand);
var
 client: tpeer;
  targetDir: string;
begin
 //处理CD命令
 
 //取得持有的peer对象
 client := tpeer(aSender.thread.data);
 
 targetDir := MyParseParam(aSender.Params);
 
 //执行cd命令,并更新current directory
 client.currDir := ChangeDir(client.currDir + targetDir);
 
 MyReplyOk(aSender);
end;
 
procedure TServer.OnDisconnect(aThread: TIdPeerThread);
begin
 //如果先前纪录了peer,现在要把它从列表中去掉
 fClients.LockList();
 try
    fClients.remove(aThread.Data);
 finally
    fClients.Unlocklist();
 end;
 //连接断开了,这个时候要释放先前创建的peer对象
 tpeer(aThread.Data).Free();
 aThread.Data := nil;
end;
 
简单的用法就是这样
 
 
 
 
如何记录客户端的IP
有一段代码,看看:
type
PClient =^TClient;
   TClient = Record
        DNS:String[20];
        IP: String[20];
        Thread:Pointer;
   end;
var
Clients:TThreadList;
 
procedure TInforServer.IdTCPServer1Connect(AThread: TIdPeerThread);
var
   NewClient:PClient;
begin
    New(NewClient);
 
    NewClient^.IP:=AThread.Connection.Socket.Binding.PeerIP;
    NewClient^.Thread:=AThread;
 
    AThread.Data:=TObject(NewClient);
    try
        Clients.LockList.Add(NewClient);
    finally
        Clients.UnlockList;
    end;
end;
 
procedure TInforServer.IdTCPServer1Disconnect(AThread: TIdPeerThread);
var
    ActClient:PClient;
begin
    ActClient:=PClient(AThread.Data);
    try
        Clients.LockList.Remove(ActClient);
    finally
        Clients.UnlockList;
    end;
    dispose(ActClient);
    AThread.Data:=nil;
end;
 
 
 
IdTCPServer如何段开和客户端的连接
1、请问IdTCPServer如何段开和客户端的连接,现在有我写了一个SERVER端和一Client端程序,当Client先段开与SERVER的连接,SERVER再停掉服务没有问题,但是当Client没有段开连接而SERVER直接关闭服务就会报异常,我想在关闭SERVER前先关掉所有客户端的连接,试了很长时间都没有成功,请问怎么解决。SERVER用的是IdTCPServer,Client用的是IdTCPClient控件。
 
2、还有一个小问题,IdTCPServer好象本身就是多线程的,我是不是就不用在为每个连接写个线程了,我看到一些文章提到要用线程池,它是做什么用的,怎么用,为什么用,不用行不行,(第一个问题是最最急的,请先帮我解决第一个,多谢多谢。)。
 
 
IdTCPClient在什么地方接收,我总不能单独写个线程一直再那里READLN()来等待服务器的呼叫
**************************************
呵呵,你说对了,IdTCPClient就是这样接收的。
 
其实之所以出错,是线程不能正常退出的原因。而INDY是阻塞的,服务器端的readln是线程里的代码,又一直停在那里,服务器直接退出的话,线程不能正常退出,所以出错。
所以,在server的线程里接收,要先判断线程是不是退出或连接是否成功,即
while not terminate or IdTCPClient.Connected=ture do
begin
//接收代码
end;
 
 
TIdTCPServer+线程池,但是线程池怎么用啊
TIdTCPServer+线程池,但是线程池怎么用啊??客户端请求的时候,服务怎么开1000个连接的
 
 
直接将 TIdTHreadMgrPool与TIdTCPServer的THREADMGR属性关联即可
致于你说的1000个连接,如果同时有这么多的客户端与SERVER连接,它会帮你分配相应的连接的
一句话:
    不用关心如何实现这么多的连接
 
Indy 10.5.8网络组件库安装与实践 网络编程是构建现代分布式应用的重要组成部分。开发者利用网络组件库可以简化网络操作,如连接管理、协议支持等。Indy,作为一个流行的开源网络组件库,支持跨平台网络应用开发,并提供TCP/IP、UDP、HTTP等多种协议的实现。Indy 10.5.8 版本增加了对现代安全协议的支持,例如TLS 1.3,以应对日益增长的网络安全需求。除了安全功能的增强,该版本还提供了更加灵活的连接管理选项,如通过新的连接池API可以有效地重用TCP连接,减少连接开销和延时。Indy组件的配置通常包括配置文件的设置。 阅读详情

相关推荐

Indy10.5.5 网络通信库最新升级解析

Indy网络通信库是一种开源的、跨平台的、多协议的通信框架,广泛应用于各种网络通信场景中。它提供了丰富的组件和接口,支持多种网络协议,如TCP/IP、UDP、HTTP等,使得开发者可以方便地进行网络通信编程。Indy提供了对多种网络协议的支持,包括但不限于TCP/IP、UDP、HTTP、FTP、SMTP等。每一种协议都有其特定的应用场景和优势。例如,TCP/IP协议因其稳定性和可靠性广泛用于需要保证数据传输完整性的场景,而UDP则因其较低的传输开销在需要快速传输的场景中更为常用。

weixin_42465140的博客 809

【Delphi】断线重连线程

作为tcp客户端,使用TIdTcpClient控件,在与后台服务的交互时,如果出现网络异常,或者后台服务重启,会导致无法保存数据或查询后台数据,这种情况下可以开启断线重连线程,自动连接上后台服务。

专注上位机开发、机器视觉、机器学习、嵌入式软硬件开发 3401

Delphi写的轻量WebSocket服务端,带Demo工程和完整源码(Indy实现)

这是一个专为Delphi开发者准备的WebSocket服务端组件包,底层基于Indy网络库实现,支持文本和二进制数据的双向实时通信。包内含一个可直接编译运行的演示项目(WebSocketServer_Demo.dpr),主界面可视化,集成日志记录功能(uWX_PUB_LogFiles.pas)和封装好的WebSocket服务控件(uWebSocket_Component.pas)。支持向指定客户端单发消息、向所有连接客户端广播、自动检测并清理后台断连的客户端连接。组件以Delphi包形式(myWebSock

pear55的博客 311

DELPHI TIdTCPClient,TIdTCPServer,SOCKET通讯小例子

SERVER: unit Unit1;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, Sockets, StdCtrls, IdBaseComponent, IdComponent,  IdTCPConnection, IdTCPC

的专栏 1万+

delphi多线程socket服务器客户端

delphi多线程socket服务器客户端

【180609】剑侠情缘_整套源码+地图编辑器(单机学习例子)

剑侠情缘_整套源码+地图编辑编(单机学习例子)完整源码下载地址:点击下载备用下载地址:点击下载

资源小站 6278

IdTCPClient和IdTCPServer

3 : BoundIP 指定使用IdTCPClient组件的计算机系统的IP地址,也就是说,其 中是空白那么什么样的计算机都可以使用,但如果指定的IP地址为239.126.12.2,那么 就只有IP地址为239.126.12.2的计算机可以使用它.虽然IdTCPClient可以直接使用,它不可以被单独的使用,它必须与相应 的IdTCPServer组件相配合才能发挥特定的作用,当然,如果相应的网络系统中具有这 样的TCP服务器应用,那么IdTCPClient也可以直接与它们进行通讯.

LiuManchao的博客 1292

滚动时域优化方法

滚动时域优化(Receding Horizon Optimization, RHO),也被广泛称为模型预测控制(Model Predictive Control, MPC),是一种用于动态系统优化和控制的。其核心思想是“在每个当前时刻k,控制器只考虑未来一个(称为“预测时域”或“优化时域”,长度N)内的系统行为。(通过测量或估计得到)。(描述状态如何随输入和干扰变化)。(如果有,可能基于历史数据或假设)。在这个有限的未来时域[k, k+N-1]上,求解一个。这个优化问题的目标是找到一个。

m0_69522810的博客 2291

INDY10idTCPSERVER与idTCPCLIENT通讯示例:构建高效网络通讯的基石

INDY10idTCPSERVER与idTCPCLIENT通讯示例:构建高效网络通讯的基石 去发现同类优质开源项目:https://gitcode.com/ 在当今网络通讯技术日益发展的背景下,INDY10idTCPSERVER与idTCPCLIENT通讯示例项目应运而生。该项目提供了一个简洁、高效的解决方案,助力开发者快速实现TCP服务器与客户端之间的通信。 项目介绍 INDY10idTCPSE...

gitblog_06758的博客 353

CSP-J 入门级第一轮认证 2025 详细解析

2025年CSP-J入门级第一轮认证模拟赛提供10套免费试题,含选择题与解析。选择题涉及计算机科学基础,如32位无符号整数最大值计算(约42.9亿,选A)、C++位运算(255&254=254,选B)、递归函数分析(calc(5)=6,选B)、哈夫曼树构造(带权路径长度186,选B)等。其他题目涵盖图论(有向图边数等于入度/出度和,选B)、组合数学(120种选法,选C)、布尔逻辑(选项C不恒等)、模运算周期性(f[2025]=6,选D)、C++字符串特性(支持string+char,选B)及引用传参

lan_in的博客 2939

[Stanford CS217]CUDA中矩阵乘法GEMM优化的最关键点:向量内积和向量外积分别取行和取列

对于矩阵C中的每一个tile,矩阵A与矩阵B中的tile只需要读取一次,这样就可以达到 O(N) 的计算强度。理想情况下性能应当受限于算术吞吐量,确切来说对于一个大型方阵,即 M=N=K ,矩阵乘法的数学操作复杂度为 O(N3) ,而数据量为 O(N2) ,同时计算强度为 N (这里的计算强度可以被理解为同一个数据被重复利用的次数)。GEMM就是指计算 C=A∗B+C ,其中 A 、B和C都是矩阵,A是 M×K 的矩阵,B是 K×N 的矩阵, C是 M×N 的矩阵。这就是向量内积和向量外积的最大区别。

weixin_55035144的博客 1425

解决中文乱码问题:Indy10 TIdTCPCLient/TIdTCPServer 应用实例推荐

解决中文乱码问题:Indy10 TIdTCPCLient/TIdTCPServer 应用实例推荐 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在网络通信中,中文乱码问题一直是开发者头疼的难题。为了帮助开发者更好地解决这一问题,我们推出了基于 Indy10 的 TIdTCPCLient 和 TIdTCPServer 的应用实例。该项目不仅成功解决了传输过程中的中文乱码...

gitblog_09817的博客 1189

华为OD机试双机位C卷-组装新的数组(Py/Java/C/C++/Js/Go)

华为OD机试(机考)双机位C卷 【组装新的数组】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试 - 组装新的数组。

qq_45776114的博客 1145

Delphi 2025 发布,Indy TCP 组件助力高效网络应用开发

在网络编程领域,Delphi的Indy组件库一直是实现TCP通信的可靠选择。随着Delphi 2025的发布,Indy在性能、稳定性和易用性上都有了显著提升

2509_93883384的博客 448

【2025最新版】间接平差——以水准网平差为例 (python详细过程版)

水准网间接平差的python代码实现。博客长期更新,本文最新更新时间为:2025年5月20日。

点云侠的博客 1702

★教程1:matlab学习教程入门100例目录

★基础入门 1.为什么要学习MATLAB 2.MATLAB安装 持续更新....... ★MATLAB基础编程语言熟悉

FPGA/MATLAB学习教程/源码/项目合作开发 4万+

indy9做后个即时通讯的小程序

前一段时间发布几篇小文章,也是关于一个即时通讯的,但是那是公司的一个项目,因为涉及到公司的一些机密,没有发表完。 前段时间一个朋友托我给他们公司做个小的局域网的即时通讯,准备把它整理一下,发上来,初学者可以看看。高手嘛,也可以看看,指出其中的不足,也能帮助我来提高自己的水平,^_^ 这个小程序用的indy9来做的,主要用到了IdTcpServer,IdTcpClient,IdFTP

Net 634

人工智能在软件测试中的广泛应用领域

人工智能在软件测试中的应用领域涵盖了自动化测试、缺陷预测和缺陷检测、智能化测试报告生成等方面。以上提供的示例代码只是其中的一小部分,实际上,人工智能在软件测试中还有许多其他的应用。通过结合人工智能和软件测试,可以提高测试效率和质量,减少测试工作的人力成本,并帮助开发人员更好地理解和改进软件产品。人工智能(Artificial Intelligence,简称AI)在软件测试领域的应用越来越广泛。下面将介绍几个人工智能在软件测试中的主要应用领域,并提供一些相关的源代码示例。

FycPerformance的博客 462

Indy10 即时通讯Demo

最近闲来无事,重新学习了Indy10,顺手写了一段即时通讯代码。与上次写的笔记有不同之处,但差别不大。 未研究过TCP打洞技术,所以下面的代码采用的是 客户端--服务器--客户端 模式,也就是服务器端转发消息的模式。 客户端模仿了QQ,可以在屏幕四周停靠自动隐藏 本文也演示了在线程中操作VCL的两张方法: 1:向主线程发送消息 2:在线程中使用临界区 program Serv...

weixin_30621959的博客 504

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

关于读QQHTTP协议的感想

我认为QQ的使用HTTP协议是客户端与服务端之间的通讯,何此篇文章所议的是所有的点对点通讯均采用HTTP协议到服务器交换信息.这样的方法是不合理的.如果这样腾讯拥有上万台服务器也不够用.合理的应该是客户端与服务端做常用的通讯采用HTTP协议,然后客户与客户进行点对点的UDP或TCP链接.如果网络链接失败,则通过HTTP协议进行服务器的中转!这样应该是比较何理 有一年没有发表文章了,最近

清风一吹(清风博客) 3932

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Netty 高并发 (长文)

目录 Netty+Zookeeper 亿级 高并发实战 (长文) 写在前面 1. 高并发IM架构与部分实现 1.1. 高并发的学习和应用价值 1.1.1. 高并发IM实战的价值 1.1.2. 高并发IM的应用场景 ...

weixin_33753003的博客 284

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

TidHttpServer 的使用示例

unit Main; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ActnList, StdCtrls, IdComponent, IdTCPServer, IdHTTPServer, Buttons, ComCtrls, IdGlobal, Id...

yygyyygy1233的博客 2290

delphi多线程超时控Delphi7中Indy控件对于网络数据的接收

  1.引言   随着我国经济和社会的发展,水资源的科学管理与合理配置显得越来越重要。而获取大量的、实时的、动态的水资源及其相关信息则是实现水资源科学管理的基础。传统的水资源信息获取采用人工抄取数据后逐级的方式,这种方式收集数据困难且缺乏实时性,对水资源的科学管理造成了很大的困难。水资源的监测点地域分布广,搭建通讯网络不切实际且不适合移动的需要。本文介绍一种采用GPRS技术的水资源无线监测系统及...

weixin_30687587的博客 859

关于idtcpserver的使用

 用idTCPServer,客户端接上来时,如何取得客户端的IP?  IP:=AThread.Connection.Binding.PeerIP;Port:=AThread.Connection.Binding.PeerPort;  尝试解答你的疑问:问题一:在Form1中放入IDTCPServer控件,一旦有socket连接,IDTCPServer自动建立一个线程与之建立一个TCP/IP

7646

Delphi常用总结

1.定义leftstr,midstr时需uses strutils. 2.打开记事本需要在單元接口部分引用 SHELLAPI單元 3.获取计算机名与IP时,需定义uses winsock; 4.试用sndplaysound,需定义mmsystem。 4、VCL组件中引用CxGrid导出Excel表格时可引用cxExportGrid4Link, 如:procedure TForm1.BitBtn3Click(Sender: TObject); begin if sdlgEXCEL.E...

fangyuan621的专栏 258
下一篇: Indy的TCPServer到底能支持多少个连接
Devillyd
博客等级 码龄23年 58粉丝 101原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值