又是我...Indy使用问题 局域网聊天程序的又一些困惑

Princezhouf 2009-06-25 08:42:31
由于一开始的不了解,我的程序已经不能完全按照最优化的方法来写了,对我来说时间不够了。
我的聊天程序大概是这样的:
1)在服务器设置了一个队列List用来保存已经连接的线程信息吗,其中包括Thread

2)在客户端的聊天界面设置了一个进程,监听发过来的信息,保存到TStringList里面。同时,设置了一个Timer,每过一段时间读取TStringList,并作出处理。

3)在好友列表里面,又用了一个Timer,不断的Write指令给服务器,让他传回当前所有在线用户的信息。

4)我用LockList阻塞所有的线程,然后,对每一个线程都发送数据,再在客户端进行分析处理,是自己的信息就拿走,不是自己的信息就放过。

大概就是这些。我现在又三个问题


1)聊天的时候,聊着聊着会卡住。例如A对B说:你好 ,B会卡死, A再对B说一次你好,则B会收到两次你好的信息,并且先发送的你好在后面显示出来了。

2)聊天界面的当前时间提示(一个Label和Timer控制的)会卡住

3)有时候会出现Out of **** memory 大概是这个的错误信息。

我曾经想到的解决办法

1)是好友列表里面的Timer不断Write的缘故。所以曾经多设置过一个TcpClient用于区分,失败

2)网友说是我的Write和Read都应该建立线程,分别处理,我的Write语句是和主进程一起进行的,所以会出现上面提到的“卡死”。不知道是不是这样

3)卡死的源头到底在哪里呢?为什么呢?网络上的例子我认真分析过了,但是很少有可以运行成功的例子供我分析,Indy Demo里面的例子,我运行了都卡死了..


有时间的朋友,帮帮忙,我很着急。谢谢啦

我的分数有限,但是还可以加一些。大家帮帮我。
...全文
103 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
ourcsdn 2009-07-03
  • 打赏
  • 举报
回复
楼主,INDY每个连接是个线程,得注意同步问题,你可尝试换换其它控件试试,如异步的ICS。
shuihan20e 2009-07-01
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 funxu 的回复:]
indy本身就是阻塞模式的,想建聊天室用udp吧
[/Quote]
udp是不可靠的,如果仅仅想做一个聊天室的话不如用asp.net
funxu 2009-07-01
  • 打赏
  • 举报
回复
indy本身就是阻塞模式的,想建聊天室用udp吧
shuihan20e 2009-06-25
  • 打赏
  • 举报
回复
把监听别人发来的消息放在一个自定义线程里,发送消息可以放在主线程里,就像indy demo里的chat一样,不要写一个死循环来不停的读取
Princezhouf 2009-06-25
  • 打赏
  • 举报
回复
是说两句话就阻塞了,其中一个聊天者进入到了假死状态,等到另一个人又说了一句话,又一下子把卡住的话全发回来了
这个是什么问题呢
shuihan20e 2009-06-25
  • 打赏
  • 举报
回复
由于一开始的不了解,我的程序已经不能完全按照最优化的方法来写了,对我来说时间不够了。
我的聊天程序大概是这样的:
1)在服务器设置了一个队列List用来保存已经连接的线程信息吗,其中包括Thread

2)在客户端的聊天界面设置了一个进程,监听发过来的信息,保存到TStringList里面。同时,设置了一个Timer,每过一段时间读取TStringList,并作出处理。
//监听这个地方用一个线程,读取TStringList并处理的过程肯定 会阻塞,不卡才怪,处理完成了就不卡了

3)在好友列表里面,又用了一个Timer,不断的Write指令给服务器,让他传回当前所有在线用户的信息。
//为啥不断的Write?为什么不在用户状态发生变化时,由服务器主动向所有客户端广播用户列表?当然你也需要一个监听线程,如果压力不大,完全可以和前面用同一个线程

4)我用LockList阻塞所有的线程,然后,对每一个线程都发送数据,再在客户端进行分析处理,是自己的信息就拿走,不是自己的信息就放过。
//服务器端来LockList吧,是服务器判断后,发给相应客户端的线程,难道你要广播给所有用户,客户端自己分析数据包来决定是否显示在聊天窗口?麻烦吧
大概就是这些。我现在又三个问题


1)聊天的时候,聊着聊着会卡住。例如A对B说:你好 ,B会卡死, A再对B说一次你好,则B会收到两次你好的信息,并且先发送的你好在后面显示出来了。

2)聊天界面的当前时间提示(一个Label和Timer控制的)会卡住

3)有时候会出现Out of **** memory 大概是这个的错误信息。

我曾经想到的解决办法

1)是好友列表里面的Timer不断Write的缘故。所以曾经多设置过一个TcpClient用于区分,失败

//都在主线程里,当然仍然会卡死,主动发送好了,不用客户端不断Write,难道你想发心跳包给服务器?2)网友说是我的Write和Read都应该建立线程,分别处理,我的Write语句是和主进程一起进行的,所以会出现上面提到的“卡死”。不知道是不是这样

//Write可以单独创建线程,也可放在主线程里3)卡死的源头到底在哪里呢?为什么呢?网络上的例子我认真分析过了,但是很少有可以运行成功的例子供我分析,Indy Demo里面的例子,我运行了都卡死了..
//哪个卡死?


有时间的朋友,帮帮忙,我很着急。谢谢啦

我的分数有限,但是还可以加一些。大家帮帮我。
hongqi162 2009-06-25
  • 打赏
  • 举报
回复
通信链路保存,你可以使用TThreadList来保存
Princezhouf 2009-06-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hongqi162 的回复:]
局域网内聊天采用udp协议就可以了

>>熊猫超人,你说的是那个chat的目录吗?


是的
[/Quote]

我看了那个啊 他运行时客户端卡死了.... 我差不多是按照那个做的
对了 那个你说的链路层里面的Thread的类型是定义成Pointer还是TIdPeerThread啊
Princezhouf 2009-06-25
  • 打赏
  • 举报
回复
大家没有帮我分析问题啊
谁能带带我
hongqi162 2009-06-25
  • 打赏
  • 举报
回复
局域网内聊天采用udp协议就可以了

>>熊猫超人,你说的是那个chat的目录吗?


是的
Princezhouf 2009-06-25
  • 打赏
  • 举报
回复
发送一个就建立一个?! 不是连接一个建立一个吗
Princezhouf 2009-06-25
  • 打赏
  • 举报
回复
熊猫超人,你说的是那个chat的目录吗
nbzip 2009-06-25
  • 打赏
  • 举报
回复
不太了解,顶一个.

Indy的TCP控件,本来就有线程.发送一条,建立一个.没必要自己新开.
hongqi162 2009-06-25
  • 打赏
  • 举报
回复
你用看看indy里面不是有一个聊天室的demo么

1,593

社区成员

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

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