对网络编程做的比较少,用 indy 简单的写了一个应付程序更新的服务器,对 indy 的工作原理还是有些疑惑1. indy 的 server 和 client 的读写必须一对一么? 比如说,客户端发送一个命令给服务器,服务器可能多次调用 write 发送内容,客户端必须依次进行接收,且清楚知道服务器传递过来的是什么东西,否则,客户端假死或者下次 read 读取到错误的内容。 这个发送什么内容,以及如何接收,是不是就是所谓的“沟通协议”的概念?2. 因为 indy 是阻塞式的,是不是意味着客户端如果要有好的客户体验,一般都是要做成多线程的?
若自己写服务嚣与客户端,先定义好有那些命令与所代表的功能,然后根据接收到的命令做出不同的动作,
通信基本要做成应答模式, 即有请求就有回应2.那要看是做什么功能了,像IdTCPClient就是要用线程读取的
文件服务的命令格式:fup://Check?FileName=a.exe&UserName=sea
图片服务的命令格式:pic://GetPic?PicName=ABC001
消息服务的命令格式:msg://Chat?....
数据库服务:dbs://dbname=db1?Query....类似这样子的想法,然后这个服务在服务器上进行注册,idTcpServer 根据客户端的请求命令,分配任务给相应的服务进行响应
关于协议你就看你自己定义了,不过像你在上面定义的那些协议肯定是不行的,有些像自定义协议的样子,不过那不是用于网络传输的,更像是本地调用的,不知道你能否明白
2. 客户端防止界面阻塞,可以使用TIdAntiFreeze控件来解决。
比如:
CMD=(cLogin, cUserList);
TLogin=record
UserName,
Password:string[255];
end;TUserList=record
UserList:array[0..1024] of char;
end;数据包这样
命令名,数据长度,数据,校验.
在发包的模块,对调用者都是异步的
即使他内部可能用的是同步socket模式
indy是采用阻塞式socket模型,也就是直到send或recv执行完成,否则函数不会返回。
indy的的服务器实现中采用多线程+阻塞,也就是说send和recv是相对于他所在的线程而言。