一是用TidTCPClient我傻了

houyichong 2010-04-28 10:42:21
以前用TClientSocket,TServerSocket做过呼叫中心的程序
就一直没有使用过Indy的TidTCPClient,TidTCPServer来实现
现在就用这两个indy控件来实现一个简单的聊天程序
用户A 发信息给用户B,用户B的客户端收到信息怎么写啊(TidTCPClient)

现在用INDY阻塞方式来实现就没有事件来实现该功能了。
...全文
984 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
Mit1208 2010-05-29
  • 打赏
  • 举报
回复
up.
houyichong 2010-05-28
  • 打赏
  • 举报
回复
zxd19821102,服务器肯定是可以马上回去客户端了,目前是客户端A通过服务器发送给B,B什么时候回复,B再通过服务器回复A,你想想吧。

sanguomi,你可以使用非堵塞方式,我不会用idTcpServer使用非阻塞式.

incoldwinter,装的是D7,INDY9没有demo可看,d6的demo不知道你看过没有,都是扯淡得很。

我觉得用IndyTCP做客户端和服务器端的通讯,而且是即时能反应处理的,这样用indy的效率很高,使用RFC格式会很爽,但是如果不同客户端间通过服务器进行通讯就很麻烦了。
天牌 2010-05-23
  • 打赏
  • 举报
回复
看INDY的DEMO吧
zxd19821102 2010-05-23
  • 打赏
  • 举报
回复
哦,没有发错帖子,呵呵
zxd19821102 2010-05-23
  • 打赏
  • 举报
回复
晕,发错帖子了
zxd19821102 2010-05-23
  • 打赏
  • 举报
回复
procedure TForm1.idtcpsrvr1Execute(AThread: TIdPeerThread);
var
rstr,tstr: string;
begin
AThread.connection.readtimeout:= 100;
try
AThread.Connection.CheckForDisconnect(True,True);
rstr:= AThread.Connection.ReadLn();
tstr:= Copy(rstr,0,7);
if rstr <> '' then
AThread.Connection.WriteLn('服务器已经收到您发来的信息:'+rstr);
mmo1.Lines.Add(rstr);
except
end;
end;
注:
INDY里的tcp是阻塞式传输。如果不设置AThread.connection.readtimeout的话,这个事件创建的线程会一直等待,多个客户端的时候,会耗资源.
SS_LO 2010-05-21
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 ss_lo 的回复:]

各自能同时上线5000个的
[/Quote]
⊙﹏⊙b汗 鸽子
SS_LO 2010-05-21
  • 打赏
  • 举报
回复
各自能同时上线5000个的
sanguomi 2010-05-20
  • 打赏
  • 举报
回复
明白你的意思了
你可以新开一线程,把他挪到线程去处理
另外也可以,INDY的SOCKET默认是堵塞方式,你可以使用非堵塞方式
不会影响你其他操作,但是对你的技术要求高点
houyichong 2010-05-19
  • 打赏
  • 举报
回复
sanguomi:

如果A一发消息给B马上就能收到B的回复,
代码可以这样写:

IdTCPClient1.WriteLn(sMsg);
IdTCPClient1.ReadLn(';',-1,1000);
//但是如果B半天不回复你,这个客户端就死翘翘在干等,当然可以设置超时时间了。
//问题的关键是A用户给B用户发消息后不知道B用户什么时候会回复,IdTCPClient1没有相应的事件。
失踪的月亮继承TIdTCPClient定义一个类添加事件,但是还是用了
ReadFromStack(False, -1, False);会遇到同样的问题:干等的话,A客户端还能发送、接收其他消息吗?

你这样还不明白你还要我怎么问啊
tigerii 2010-05-18
  • 打赏
  • 举报
回复
还是用TClientSocket和TServerSocket好
sanguomi 2010-05-17
  • 打赏
  • 举报
回复
自己去看DEMO,连问问题都不会问
houyichong 2010-05-17
  • 打赏
  • 举报
回复
不行啊,客户端用TClientSocket,服务端会拒绝服务啊
houyichong 2010-05-17
  • 打赏
  • 举报
回复
客户端使用TClientSocket吧
sanguomi 2010-05-15
  • 打赏
  • 举报
回复
看了半天不知道楼主想表达什么意思
houyichong 2010-05-15
  • 打赏
  • 举报
回复
用户A发给用户B,用户B 1小时候回复用户A,我是通过服务器实现他俩之间的通讯的
hongqi162 2010-05-09
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 houyichong 的回复:]

即时通系统,用户A发消息给用户B,但是用户B 半天不回答
InpLastSize := InpSize + FTCPClient.ReadFromStack(False, -1, False);
这行代码就会一直等待

这个时候用户A还得要收发其他消息该怎么处理?
[/Quote]


你把我发的那个组件安装上用了么?你用到DoDataAvailableEvent这个事件了么?

你要想接收其他用户的消息,你需要考虑的是建立点对点连接还是通过服务器中转,如果不通过服务器中转,实现你的要求不是一个tcpclient就可以解决的,你需要考虑一下你的程序架构再来写代码
houyichong 2010-05-08
  • 打赏
  • 举报
回复
当然如果真的做即时通是使用UDP的
houyichong 2010-05-08
  • 打赏
  • 举报
回复
一发命令就能够马上得到回复的当然用TIdTCPClient,TIdTCPServer是很理想的。
houyichong 2010-05-08
  • 打赏
  • 举报
回复
即时通系统,用户A发消息给用户B,但是用户B 半天不回答
InpLastSize := InpSize + FTCPClient.ReadFromStack(False, -1, False);
这行代码就会一直等待

这个时候用户A还得要收发其他消息该怎么处理?
加载更多回复(9)

1,593

社区成员

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

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