To dfw001:
都说了Indy 是基于Block与线程的了,当然你的工作框架也应该这样。
Indy通常是采用C/S的结构吧,Server中每个连接都是独立的。
如果你认为聊天文本会与文件传输混乱了,那就错了,就算是把两者的功能
都写在同一个TTcpipConnection的OnExecute中去,也不会混乱,因为它是基于
线程的,而且是Block。
可以在OnExecute事件中采用:
with athread.connection do begin
case cmd of
cmd_chat: begin
sChat:=readln;
...
end;
cmd_filetrans: begin
nSize:=readInteger();
sFileName:=readLn();
end;
.....
end;
end;
即使还有很多很多命令加到这里,也不会出现混乱。
不写了,再写就没意思。
Indy的处理方式与FastNet的处理方式很是不同,不但TCPIP,UDP也是。
To barton:
要发送100M的文件,就先把这100M的文件读入内存。好,先撇下
Delphi的Stream处理机制不提,就看Windows的,如果你机子内存真的可以容
纳下这庞大的家伙就算你走运,否之,Windows则非常聪明地用硬盘帮你先搁
下来,听着硬盘吱吱地响,那也只是做从[red]硬盘读出数据再写入硬盘[/red]这愚蠢的操
作,你觉得这样做爽吗?
不要用100M的文件去试了,干脆用200M的吧,哈哈,看你的机子不死翘翘才怪。
你又不是不知道Windows的内存管理有多糟!
To barton:
怪不得你的口气这么牛了,原来有1G作后盾,哈哈。
俺的服务器才2G,自己的电脑才256M,因为俺穷,所以我要省着用[]
你认为用API读入块,不好么?嘿嘿,哪个VCL不是最终是调用API的?
如果是繁复的API,俺也不赞成采用,但是这文件读入嘛,简单得要命,
不用白不用。
To dfw001:
这也不一样的做嘛。
对于Indy来说,所谓的Client Side,也应该有TTcpipServer来监听吧?(前提是用
TCPIP协议)
Server Side 也一样,开一个TTCPIPServer作主监听。因为每一个连接,Indy均开一个
Thread进行侍服,所以,建议你每个Connection建立时,开一个Tdatamodule,然后在datamodule中建立一procedure与TTCPIPServer的OnExecute相对接。TdataModule里面建立一个TTCPIPClient来进行中转,连接断开时,则释放此module(Thread无须手动释放)。
这样的处理,很模块化,而且绝对不会造成数据混乱。
Indy 这样的处理方式,非常易用,而且绝对不会造成数据混乱,恰好相反,Fastnet
的组件才容易,因为它是基于事件的,而且自己定义数据包,无形中发送大量的垃圾,如果在对速度要求很高的网络环境下,最不适采用。