请用过indy的高手给些建议(200分)

  • 主题发起人 主题发起人 jenhon
  • 开始时间 开始时间
J

jenhon

Unregistered / Unconfirmed
GUEST, unregistred user!
最近要给人做一个企业内部的信息管理,类似qq,但是要求简单很多,而因为要嵌入比较多的其他模块(都可以用sql解决,不关信息传递的事情),所以只能自己写。

现在想请教各位大大,用indy合适吗?

开发费不多,所以功能就打算给个简陋的打字对话窗口,大致有50左右个连接,但是连接时间比较长,大概是8点到23点,几乎是整天,(大多数连接点都是靠路由器上网,都封闭了80端口,不允许上网看网页),但是一般通信量不大,就是一天可能就发一句话给服务器内网的3、4台机,但是都要求连着,因为内部有可能发出通知。

打算开服务器的一个固定端口来响应各个点的连接需求,就放一个idTCPServer来响应各个连接,不用去考虑什么udp穿透nat之类的功能了,都没钱去做那些,也没这个需求,对话都通过服务器,留一个备份再送到对方的thread里。

1、像这样的需求、通信量、工作时间,使用indy合适吗?

请各位大大指导一下。
(刚才看到一篇文章说:idTCPServer连接时间长是灾难性的,因为每个thread都占住位子很久会导致服务器资源耗尽。是不是这样?)

在调试过程中,遇到几个问题顺便帮忙解答
2、使用idTCPServer/idTCPClient通信,如果client不是主动断掉连接,而是突然断线了、意外关闭了,好像Server端会出现异常抛出,而且好像没法拦截,有什么好方法解决这个错误?

3、server主动发信息之后,idTCPClient收到信息时,没有事件发生,直接readln才能读到,有什么办法指导server有信息来?(轮询的方式也行啊,谁叫钱不多,但是过度的readln会导致client假死,而且我传的也可能非字符,想请教client哪种方式可以知道缓冲里面有东西再去读。)

4、打算服务器能主动断掉一些没有的thread,如果这个thread还是活着的话,有错误抛出,难道又得像udp方式一样搞一个心跳?

暂时碰到的问题就这些,麻烦高手指导指导,先谢谢了。

思路不对的地方也请不吝指正。
 
用RemObject SDK来做吧.
 
我的目的是想用一个tmp adoquery去更新数据库,因为tmp adoquery是多个表的view,而多个表view,adoquery.post会更新多个tabel,所以用update set ...去更新Table
adod.sql.add(我想动态产生)
如何确定要个field被更改过,我用ados.fields.oldvalue <> ados.fields.value 比较,但这里出现错误.

function Tform1.updatetable(ados:Tadoquery;lcTable:string):Boolean;
var
i:integer;
msql:string;
lnparm:string;
lnkey:variant;
msql1,msql2,msql3:string;
adod:Tadoquery;
// lcold,lcnew:variant;
begin
lnparm:='';
msql:='';
adod:=Tadoquery.Create(nil);
adod.Connection:=form1.ADOConnection1;
adod.Close;
adod.SQL.Clear;
lnkey:=ados.Fields[0].AsInteger;
if (lnkey>0) then
begin
msql1:='update '+lcTable +' set ';
msql2:='';
msql3:='';
for i:=1 to ados.FieldCount-1 do
if ((copy(ados.Fields.FieldName,0,2) <> 'tmp') and (ados.Fields.FieldName <> 'iren') and (ados.Fields.FieldName <> 'idate') and (ados.Fields.FieldName <> 'uren') and (ados.Fields.FieldName <> 'udate')) then
begin
if ados.Fields.OldValue<>ados.Fields.Value then ----> ERROR "Invaild variant operation" please help me
msql2:=msql2+ados.Fields.FieldName+'=:'+ados.Fields.FieldName+',';
end;
// end;
msql2:=copy(trim(msql2),0,length(trim(msql2))-1);
if (length(msql2) <> 0) then
begin
msql1:=msql1+msql2+',uren=:uren,udate=:udate where id=:id';
adod.SQL.add(msql1);
for i:=1 to ados.FieldCount-1 do
begin
if ((copy(ados.Fields.FieldName,0,2) <> 'tmp') and (ados.Fields.FieldName <> 'iren') and (ados.Fields.FieldName <> 'idate') and (ados.Fields.FieldName <> 'uren') and (ados.Fields.FieldName <> 'udate')) then
begin
if [red]ados.Recordset.Fields.OriginalValue<>ados.Recordset.Fields.Value[/red] then ---
begin
lnparm:=ados.Fields.FieldName ;
adod.Parameters.ParamByName(lnparm).Value:=ados.Fields.Value;
end;
end;
end;
adod.Parameters.ParamByName('uren').Value :='admin';
adod.Parameters.ParamByName('udate').Value:=now();
adod.Parameters.ParamByName('id').value:=ados.Fields[0].Value;
adod.Prepared:=true;
try
adod.ExecSQL;
result:=true;
except
result:=false;
end;
adod.Free;
end;
end
 
indy可以了。
 
delphi交流群:4654765
 
Indy很合適你這種情況。
 
谢谢各位了,有哪些地方有比较有用的资料麻烦推荐一下。

另外,如果碰到过 我所说的后面的几个问题 而已经解决的高手 也帮忙指点一二。

三楼的那位zxwwen,好像你贴错地方了,麻烦挪挪位置,我的原话已经够长了,还顶这么长的一篇,帮忙拿开一下,谢谢。
 
1:INDY完全可以满足需求
2、目前用INDY10没有发现该问题
3、可以用单独一个线程来读,或是一个过程都行.
如果有问题,可以给个例子你!
 
谢谢楼上。

方便的话,给一份:jenhon@tom.com

我一直在用 d6,indy10是不是至少得 d7?
(因为改d7我当心我以前的程序重编有问题,不敢贸然升上去,非常感谢你的指点。)
 
用INDY的UDP控件来传送文字信息,因为是无连接,所以不能耗资源。
用INDY的TCP控件来传文件,因为是实时连接,安全,还有传文件一定要多线程,才能提高速度。
 
indy10 究竟能不能for d6呢?
知道的说下,谢谢!
 
可以在D6里用,不懂用的话加我QQ
15104368.
 
回楼上,我qq加你了,还没通过。

indy10自己刚弄好,而且源TerminateYarn出错的地方也改好了,还没去看效果。
谢谢你的指导。
有个问题,我下的indy10有4个目录:System,Core,Protocols,SuperCore
1、SuperCore里面好像只有d7的是不是可以不用理?
2、system先要加载,但是Core和Protocols好像不能并存,装这个另外一个就没了,是不是这样,不过我只用到Core下面的idTCPServer这些,好像不用理Protocols下面那么多东西,如果方便的话,说说是不是这样,谢谢。


另外,风清杨朋友说过用upd做为文字信息传送,现在就是考虑不用udp打洞穿透nat的问题,如果使用udp,服务器发布信息给client时,服务器好像不知道当前这个id对应的ip和port是不是依然对的,不知道是不是这样?

因为udp不耗费资源比较吸引人,如果简单的能用udp就好了。

而tcp却顾虑是不是能支撑工作一天,怕到时做出来根本达不到实用的要求。

所以我才开这个贴,请教一下,用过indy的朋友,用tcp是否可行,免得走冤枉路。
 
indy完全可以满足,估计你担心的是用TCP方式连接后,是否能保证长时间的稳定连接。
这主要看你的网络环境的稳定程度,与indy无关;
为了提高通讯的稳定性,可在开发时考虑TCP连接模式的短连接方式;
这样即解决了通讯的稳定性,也能解决TCP资源站用比UDP大的问题;

另:经我在多个项目中使用indy的经验来看,在硬件配置为CPU-P4-2G,内存未1G的情况下,稳定的长连接数最多为200左右,而短连接没有限制。
 
谢谢楼上,你的话说出我想问的,我的意思确实是想问indy的tcp能维持多大规模的应用,你的话让我安心了好多。

本来贴应该结的,但是我刚着手做一些具体编程,希望能挂多几天好交流多几个问题。

贪心了,请多原谅啊,不会挂太久的。
 
交流交流也是好的.
 
后退
顶部