关于大量数据通信的方法?(300分)

  • 主题发起人 主题发起人 zhj_nc
  • 开始时间 开始时间
Z

zhj_nc

Unregistered / Unconfirmed
GUEST, unregistred user!
我正准备写一个服务器,数据来源于另一个服务器。它是多线程的方式向我发送数据。
我查看了以前的帖子,有很多的讨论,也有很多实行的方法。我想问问下面的问题:
1。很多人主张直接调用WinSock的API函数,说是TServerSocket和TClientSocket,效率不高,有很多限制。我在用时也发现,发送数据超过了8192就要分包,据说API可以发2k.
2.有人建议用Indy或是ICS。
3。还有线程的问题,我这个服务器也需开多线程接收,还是一个线程就可以了。
总之,我想了解各位富翁的经验之谈,我现在的情况用怎样的方式实现比较合理?
 
1,看你的能力,能力强就用API,能力不够就用控件,不过实际上我感觉都一样,你用
控件碰到的问题用API一样都要碰到,就看你如何处理了
2,答案同上
3,看你是否需要控制流量,如果不需要就几个线程接受,不过这个要用API实现,控件
实现很难
 
我用Stock写过,觉得挺简单的
 
to 张无忌:
我是新手,您建议我使用控件,那应使用TServerSocket、Indy、ICS中的哪一个呢。是否使用这些控件它们有能力处理,不必开多线程。还有一般会遇到什么问题?
 
这里有些例子给你参考一下
ftp://61.152.210.98/Socket2.rar
ftp://61.152.210.98/ThreadBlocking.rar
ftp://61.152.210.98/chat.rar
 
to zhj_nc
你可以研究研究indy,
我目前在使用它的线程池,
开到15个,能够在单机上同时承受1000个连接和处理,
再多就没测试了。
 
to zhj_nc

能否介绍一下 indy 线程池用用法? indy中似乎没有这种的例子.我另给你分.
 
to liboy.com:
我也不懂,正在虚心请教。
to all:
发送数据给我的服务器,是另一个人写的,它是开了多线程,在每个线程中绑定了一个WinSock的连接,都是调用API函数写的。我用这些控件,是否需要成对的使用,它用API,
我是否也必须用API呢?
 
API函数要求高些
控件相對來說要求低,在有些地方只能用API函数就方面 如:线程的處理 
 
TO SunBai:
何为要求高、低。
 
你 是怎么发的?使用 TSocketStream 也有这个限制吗?不会吧
 
TO WorldCreater
我现在还没有做,先寻求一个方法。就是别人是用WINSOCK的API发数据给我,我可否用INdy来接收数据。
TO ALL:
大家请踊跃发言。
 
:zhj_nc
Indy可以收到,只要端口IP正确。
indy里面有的,找一找,
好像叫做poolThread控件,
连接到socketSever上就可以了。
线城池大致意思就是程序启动的时候创建指定数量的线程,保持闲置状态。
当数据到达的时候,呼叫一个线程来处理数据,处理完毕之后继续保持闲置状态。
线程池最大的优势在于节约了由于频繁创建销毁线程而耗费的资源。
不过线程的数量是要慎重设定的,过多的闲置线程会造成系统资源的浪费。。

 
socket单次能发多大的数据?我用猫拨号发送,发现只能在1.5K左右,请教各位,是不是这样啊?
 
学习!!!
 
我测试了一下,Indy可以与我同事写的程序配合。但是我同事的程序是多线程的,而且每个线程一个Socket端口,向我发数据。我了解了一下,TIdTCPServer可以和TIdThreadMgrPool配合使用。但是具体怎样用,有例程吗?
 
没人愿意告诉我吗?
 
socket发的最大数据和网络速度有关,这个没有办法控制
 
我正在学习《Windows 网络编程》这本书,是C写的。
我在重叠I/O模型时,出现了问题,各位高手请问:
var
wsad:WSADATA ;
Sck: TSocket;
addr: TSockAddr;
EventHandle:THandle;

begin
WSAStartUp (MAKEWORD(2,2), wsad);
Sck := Socket(AF_INET, Sock_Stream, IPPROTO_TCP);

addr.sin_family := AF_INET;
addr.sin_port := 13;
addr.sin_addr.S_addr := inet_addr('192.168.0.10');

bind(Sck, addr, Sizeof(addr));
connect (Sck, addr, sizeof (addr));
***** EventHandle := WSACreateEvent();
WSAEventSelect (Sck, EventHandle, FD_READ and FD_WRITE and FD_CLOSE);
WSACleanup();
end;

打*****一句总是报错,为什么?
 
过了很多天了,我在各位的帮助下,在网络编程方面有了一点了解。感谢各位的帮助!
我看了《Windows 网络编程》这本书,还有很多不解的地方。程序是控制台程序,要在window下怎样处理,程序是C++写的,我看了不太习惯。书上的例子也省掉了许多代码。
所以希望各位大侠再拉小弟一把,发点在window下的例程给我,我准备给分了。
 
后退
顶部