对网络编程做的比较少,用 indy 简单的写了一个应付程序更新的服务器,对 indy 的工作原理还是有些疑惑1. indy 的 server 和 client 的读写必须一对一么?     比如说,客户端发送一个命令给服务器,服务器可能多次调用 write 发送内容,客户端必须依次进行接收,且清楚知道服务器传递过来的是什么东西,否则,客户端假死或者下次 read 读取到错误的内容。     这个发送什么内容,以及如何接收,是不是就是所谓的“沟通协议”的概念?2. 因为 indy 是阻塞式的,是不是意味着客户端如果要有好的客户体验,一般都是要做成多线程的?

解决方案 »

  1.   

    如果是用TCPServer,可以把发送和接收理解为写流和读流,如果错乱一个字节就没法恢复了。INDY客户端一般都用多线程。
      

  2.   

    1.indy有很多东西,并不是必须server 和 client成对使用。象ftp或http之类的,就可以只用client。如TIdHTTP访问一个网站。即使是tcp协议的,也可以不成对使用。如你已经有一个VC写的tcp协议的服务端程序,那么你可以只用tcpclient来写一个客户端。2.比较简单的的还是可以不多线程的,如你隔几分钟才接收几十个字节,完全没必要搞多线程,客户感觉不到的。你的意思好象是要写一个程序自动更新的东西。一般可以写一个网页放在服务器上,然后用TIdHTTP访问这个网页,分析内容得到需不需要更新,再下载需要更新的文件。
      

  3.   

    1.不一定是1对1,比如smtp,可以直接用它连接163,qq等
    若自己写服务嚣与客户端,先定义好有那些命令与所代表的功能,然后根据接收到的命令做出不同的动作,
    通信基本要做成应答模式, 即有请求就有回应2.那要看是做什么功能了,像IdTCPClient就是要用线程读取的
      

  4.   

    我是想写一个服务端出来,文件更新服务只是服务器的一个服务而已,其他的服务还可能包括:图片传送服务、消息服务、数据库服务等...比如:
    文件服务的命令格式:fup://Check?FileName=a.exe&UserName=sea
    图片服务的命令格式:pic://GetPic?PicName=ABC001
    消息服务的命令格式:msg://Chat?....
    数据库服务:dbs://dbname=db1?Query....类似这样子的想法,然后这个服务在服务器上进行注册,idTcpServer 根据客户端的请求命令,分配任务给相应的服务进行响应
      

  5.   

    呵呵!RemObject吧!
      

  6.   

    INDY的服务器端的EXEUTE方法本身就是写在了线程里,客户端最好有一个监听线程,这个客户端就不会阻塞,因为你的主线程还有很多其他的事情要做,而且客户端也不是一直有数据可以读取
    关于协议你就看你自己定义了,不过像你在上面定义的那些协议肯定是不行的,有些像自定义协议的样子,不过那不是用于网络传输的,更像是本地调用的,不知道你能否明白
      

  7.   

    1. 对,需要“沟通协议”。
    2. 客户端防止界面阻塞,可以使用TIdAntiFreeze控件来解决。
      

  8.   

    看楼主的需求,我觉得你用http更合适,你可以看看TIdHttpserver和TIdHttp.因为用http很简单,你不用考滤很多东西
      

  9.   

    如果要做到客户端可以被动接受服务器传递的消息和内容,在客户端增加一个 server 监听端口是比较好的选择吧?否则是不是只能定时主动发消息给服务器轮询了?
      

  10.   

    indy的server控件绝对是动态多线程的。
      

  11.   

    其实你完全不用那样来做,定义几个Record就可以了
    比如:
    CMD=(cLogin, cUserList);
    TLogin=record
      UserName,
      Password:string[255];
    end;TUserList=record
      UserList:array[0..1024] of char;
    end;数据包这样
    命令名,数据长度,数据,校验.  
      

  12.   

    indy不论是server,还是client
    在发包的模块,对调用者都是异步的
    即使他内部可能用的是同步socket模式
      

  13.   

    lz的想法是对的。细节的话,建议直接读indy源码。这里问不出啥的。
    indy是采用阻塞式socket模型,也就是直到send或recv执行完成,否则函数不会返回。
    indy的的服务器实现中采用多线程+阻塞,也就是说send和recv是相对于他所在的线程而言。