使用 indy 的疑惑

searoom 2012-07-12 05:46:49
对网络编程做的比较少,用 indy 简单的写了一个应付程序更新的服务器,对 indy 的工作原理还是有些疑惑

1. indy 的 server 和 client 的读写必须一对一么?

比如说,客户端发送一个命令给服务器,服务器可能多次调用 write 发送内容,客户端必须依次进行接收,且清楚知道服务器传递过来的是什么东西,否则,客户端假死或者下次 read 读取到错误的内容。

这个发送什么内容,以及如何接收,是不是就是所谓的“沟通协议”的概念?

2. 因为 indy 是阻塞式的,是不是意味着客户端如果要有好的客户体验,一般都是要做成多线程的?
...全文
845 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2013-05-27
  • 打赏
  • 举报
回复
lz的想法是对的。细节的话,建议直接读indy源码。这里问不出啥的。 indy是采用阻塞式socket模型,也就是直到send或recv执行完成,否则函数不会返回。 indy的的服务器实现中采用多线程+阻塞,也就是说send和recv是相对于他所在的线程而言。
ygnet 2013-05-26
  • 打赏
  • 举报
回复
indy不论是server,还是client 在发包的模块,对调用者都是异步的 即使他内部可能用的是同步socket模式
shuihan20e 2012-11-07
  • 打赏
  • 举报
回复
引用 9 楼 searoom 的回复:
引用 6 楼 的回复: INDY的服务器端的EXEUTE方法本身就是写在了线程里,客户端最好有一个监听线程,这个客户端就不会阻塞,因为你的主线程还有很多其他的事情要做,而且客户端也不是一直有数据可以读取 关于协议你就看你自己定义了,不过像你在上面定义的那些协议肯定是不行的,有些像自定义协议的样子,不过那不是用于网络传输的,更像是本地调用的,不知道你能否明白 谢谢,我的基本想法是这个服务……
其实你完全不用那样来做,定义几个Record就可以了 比如: CMD=(cLogin, cUserList); TLogin=record UserName, Password:string[255]; end; TUserList=record UserList:array[0..1024] of char; end; 数据包这样 命令名,数据长度,数据,校验.
boneheart 2012-09-24
  • 打赏
  • 举报
回复
indy的server控件绝对是动态多线程的。
kaikai_kk 2012-07-13
  • 打赏
  • 举报
回复
1.不一定是1对1,比如smtp,可以直接用它连接163,qq等
若自己写服务嚣与客户端,先定义好有那些命令与所代表的功能,然后根据接收到的命令做出不同的动作,
通信基本要做成应答模式, 即有请求就有回应

2.那要看是做什么功能了,像IdTCPClient就是要用线程读取的
searoom 2012-07-13
  • 打赏
  • 举报
回复
如果要做到客户端可以被动接受服务器传递的消息和内容,在客户端增加一个 server 监听端口是比较好的选择吧?否则是不是只能定时主动发消息给服务器轮询了?
searoom 2012-07-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

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

[/Quote]

谢谢,我的基本想法是这个服务器不要只是做项简单的服务,所以我才有这样子设计的想法,目前做的在应付着用的“破”服务器实现了传递一点简单的信息和文件更新服务,当然,我知道如果加入数据集传递,工作难度还很大。

设计的思路是:

1. 客户端发送命令,命令字符串中带入了需求的服务和命令以及参数
2. 服务器响应并分析命令,根据需求调用不同的服务,再把命令和参数传递给该服务
3. 在服务中根据命令和参数具体执行具体任务,返回需要传递的内容给客户端

我比较疑惑的地方在意,要怎么定义一套传输“协议”出来,使得每个任务不会都是特殊发送接收次序
wzwcn 2012-07-13
  • 打赏
  • 举报
回复
看楼主的需求,我觉得你用http更合适,你可以看看TIdHttpserver和TIdHttp.因为用http很简单,你不用考滤很多东西
JPEXE 2012-07-13
  • 打赏
  • 举报
回复
1. 对,需要“沟通协议”。
2. 客户端防止界面阻塞,可以使用TIdAntiFreeze控件来解决。
shuihan20e 2012-07-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

我是想写一个服务端出来,文件更新服务只是服务器的一个服务而已,其他的服务还可能包括:图片传送服务、消息服务、数据库服务等...

比如:
文件服务的命令格式:fup://Check?FileName=a.exe&UserName=sea
图片服务的命令格式:pic://GetPic?PicName=ABC001
消息服务的命令格式:msg://Chat?....
数据库服务:……
[/Quote]
INDY的服务器端的EXEUTE方法本身就是写在了线程里,客户端最好有一个监听线程,这个客户端就不会阻塞,因为你的主线程还有很多其他的事情要做,而且客户端也不是一直有数据可以读取
关于协议你就看你自己定义了,不过像你在上面定义的那些协议肯定是不行的,有些像自定义协议的样子,不过那不是用于网络传输的,更像是本地调用的,不知道你能否明白
酣酣 2012-07-13
  • 打赏
  • 举报
回复
呵呵!RemObject吧!
searoom 2012-07-13
  • 打赏
  • 举报
回复
我是想写一个服务端出来,文件更新服务只是服务器的一个服务而已,其他的服务还可能包括:图片传送服务、消息服务、数据库服务等...

比如:
文件服务的命令格式:fup://Check?FileName=a.exe&UserName=sea
图片服务的命令格式:pic://GetPic?PicName=ABC001
消息服务的命令格式:msg://Chat?....
数据库服务:dbs://dbname=db1?Query....

类似这样子的想法,然后这个服务在服务器上进行注册,idTcpServer 根据客户端的请求命令,分配任务给相应的服务进行响应
cdchq 2012-07-12
  • 打赏
  • 举报
回复
1.indy有很多东西,并不是必须server 和 client成对使用。象ftp或http之类的,就可以只用client。如TIdHTTP访问一个网站。即使是tcp协议的,也可以不成对使用。如你已经有一个VC写的tcp协议的服务端程序,那么你可以只用tcpclient来写一个客户端。

2.比较简单的的还是可以不多线程的,如你隔几分钟才接收几十个字节,完全没必要搞多线程,客户感觉不到的。

你的意思好象是要写一个程序自动更新的东西。一般可以写一个网页放在服务器上,然后用TIdHTTP访问这个网页,分析内容得到需不需要更新,再下载需要更新的文件。
SQLDebug_Fan 2012-07-12
  • 打赏
  • 举报
回复
如果是用TCPServer,可以把发送和接收理解为写流和读流,如果错乱一个字节就没法恢复了。

INDY客户端一般都用多线程。

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧