捐赠 | 广告 | 注册 | 发布 | 上传 | 关于我们    
  粤ICP备10103342号-1 DELPHI盒子 | 盒子文章 | 盒子问答悬赏 | 最新更新 | 盒子检索 | 下载中心 | 高级搜索    
  精品专区 | 繁體中文 | 奖励公告栏 | 直通车账号登陆 | 关闭GOOGLE广告 | 临时留言    
 
广告
评论:类似QQ的UDP聊天程序
zxh806 41025 2010/9/28 10:41:23
有个问题,如果是客户端异常退出呢,比如掉电,或者网线断开了,那么这个时候服务器怎么知道客户端掉线了呢
b43ok 33019 2008/2/9 16:30:57
只是文字聊天而已,而且又不穿NAT的
名不符实
normtang 29518 2007/5/21 13:00:54
我的麦卡菲也发现有病毒。
hello3366 23626 2006/5/16 7:29:08
前辈你好~看了你的程序后,有一个疑问:
MsgInfo中的一个分量info:array [0..1023] of char;是1024大小的数组,这个数组除了用来传输聊天内容外,还用于在线用户列表的传输。
若规定一个用户的用户名为5个字节,IP地址的长度为15个字节,那么一个用户的在线信息如:aaaaa,xxx.xxx.xxx.xxx;长度就为22个字节,也就是说info这个分量只能传输大约46人的在线信息,这样就限制了聊天的人数了~
如果想使得大约一两百人聊天,能不能通过把info分量的大小改大,
如info:array [0..4095] of char;让它可以记录更多的用户在线信息。可是这样的话,每次传输的包的大小就增加了,一旦用户多的时候,会不会容易造成丢包等问题???
如果不采用这样的方法,该怎么样实现一两百人个人聊天??
谢谢你~期待回答~
jojozzf 23130 2006/4/21 20:20:39
呵呵,问题解决了!觉得自己中午问的问题好傻呵呵
jojozzf 23116 2006/4/21 13:10:00
liuyax,你好,我又来了,想问你一个问题:
UDPClient.sendbuffer();可以用来传送如integer,TColor类型的数据吗?

我在MsgInfo记录类型中加上了fontcolor:integer分量,想用来记录用户在ColorBox中选中的ItemIndex值(整型),可是后来又发现你都是用Fillchar(msg,sizeOf(msg));来初始化msg的,那是不是说明msg中的分量类型都要是pchar类型的??
若想发送包含分量为整型的MsgInfo,要怎么修改程序????

谢谢!期待你的回答!
jojozzf 23115 2006/4/21 13:07:52
liuyax,你好,我又来了,想问你一个问题:
UDPClient.sendbuffer();可以用来传送如integer,TColor类型的数据吗?

我在MsgInfo记录类型中加上了fontcolor:integer分量,想用来记录用户在ColorBox中选中的ItemIndex值(整型),可是后来又发现你都是用Fillchar(msg,sizeOf(msg));来初始化msg的,那是不是说明msg中的分量类型都要是pchar类型的??
若想发送包含分量为整型的MsgInfo,要怎么修改程序????

谢谢!期待你的回答!
jojozzf 22968 2006/4/16 13:57:58
1、试过了把frmMain.Close改成了Application.Terminate;可当提示重名后点击MessageBox的确定按钮还是回到了frmMain界面(未登录),而不能退出整个程序。
if (msg.msgtype = WRONG_INFO)  then
  begin
   //提示用户名存在
   Application.MessageBox('该用户名已存在,请重新登录','错误',MB_IConERRR);   
   DeleteFile('Config.ini');
   Application.Terminate;
  end;
是不是因为这段程序是写在UDPRead过程中的呀?所以不能调用Application.Terminate;
2、检查过了当server端收到LOGOUT消息时会更新了自己的在线列表,程序也检查了好几遍了还是没头绪,明天去学校机房找几台电脑再运行下程序找找原因。
liuyax 22961 2006/4/15 21:00:49
^_^,不好意思输错了,是Application.Terminate
liuyax 22960 2006/4/15 20:52:53
1、程序退出用Application.termited就可以了。
2、当一个用户退出,它向server发送退出消息,server收到后首先更新自己的在线用户列表,把退线的这个用户从列表中删除,然后把新的列表依次发送给所有当前在线的client,client端收到消息再更新自己的在线列表。看看是否你的server端在收到LOGOUT消息时没有更新自己的在线列表?
jojozzf 22944 2006/4/15 13:26:34
1、我在你的程序的基础上加上了Server端检测登录重名的功能,若重名,Server端向重名的Client端发送msg.msgtype=WRONG_INFO信息,Client端在UDPRead过程中判断
if (msg.msgtype = WRONG_INFO)  then
  begin
   //提示用户名存在
   Application.MessageBox('该用户名已存在,请重新登录','错误',MB_IConERRR);   
   DeleteFile('Config.ini');
   isExit:=True;
   frmMain.Close;//提示用户名存在后,要怎么样才可以退出整个程序??我这样写不行呀?
  end;
2、关于刷新用户在线列表的问题,当一个用户退出时,Server端treeview中该用户的结点消失,但是其他client端treeview中还是存在这个节点,我修改了server端的程序,在if (recv_msg.msgtype = LOGOUT) then 中也加上了向客户端发送在线名单的代码,可是这种情况依然存在:当一个client退出后,其他client端无法更新列表。
jojozzf 22933 2006/4/14 11:18:03
嗯,好的,我自己琢磨一下。
呵呵,觉得你编程的习惯很好,程序让人容易学习。我还找了一些这方面的例子,可有的程序没有注解就是看不懂。真的好谢谢你耐心的帮忙,一开始决定问问题时真的没想到你会有问必答,我会继续学习的,谢谢!
liuyax 22924 2006/4/14 8:49:53
这个程序只是个UDP通讯的简单例子,其中又很多不完善或者错误的问题,你可以自己改正。
jojozzf 22910 2006/4/13 20:48:57
在学习程序的过程中,我发现个问题,
Server端发送更新的用户在线列表信息给每个Client端时,设置msg_type:= ONLIE_LIST,Client端根据判断
if (msg.msgtype = ONLIE_LIST) then
  begin
    islogin := True;
 //问题出在这里!也就是说,用户A登录以后,每次有其他新的用户登录,用户A在获得在线用户信息以更新列表的的同时,随着其他用户的不断上线,也会在memRecv中显示许多的“登录成功!”字样。
    memRecv.Lines.Add('登录成功!');
    OnlineList:= msg.info;
    ParseList(OnlineList);
  end
liuyax 22905 2006/4/13 17:39:37
显示字体可以用richedit,比如:
  richedit.SelAttributes.Color:=clblue;          颜色
  richedit.SelAttributes.Name := '宋体';         字体
  richedit.SelAttributes.Size := 10;          大小
至于fontStyle和fontColor,你可以自己定义,比如用枚举类型实现,或者定义常量实现都可以,只要你自己能够识别就行。
jojozzf 22853 2006/4/12 10:23:45
刚刚查了程序发现了问题,是粗心漏写了begin..end;
我想实现字体颜色大小类型的选择,所以在frmSend里添加了comboBox选择字体类型、大小;用colorBox选择颜色,还用CheckBox设置了粗体,下划线,斜体的选择,这些字体的编辑在frmSend运行都可以实现,可是当其他客户端接收消息时候只能显示信息内容,这些字体信息并不能在RecvMem中显示,我认为是要在MsgInfo这个记录类型中添加分量如:fontSize(字号)、fontStyle(风格:粗体、下划线、斜体)、fontName(字体类型)、fontColor(字体颜色),来记录字体信息
 MsgInfo = record 
    msgtype:TMsgType; 
    nikename:array [0..9]  of char;
    from_ip: array [0..15] of char;
    to_ip:   array [0..15] of char; 
    info:    array [0..1023] of char;
    fontSize:array[0..2] of char;//字体大小设为:8、9、10、12、14、16...20
    fontStyle://这里的类型该这么写??[fsBold]、[fsItalic]、[fsunderline]是集          合类型呀
    fontName:array[0..20] of char
    fontColor://颜色的数据类型该怎么写?颜色也是集合类型的吧?
对于字体问题,你有什么更好的建议吗?
liuyax 22850 2006/4/12 9:22:48
1、frmConfig在frmMain的FormShow事件中创建,首先执行FromShow事件中的语句,执行完后再显示该窗体。
  将procedure TfrmMain.FormShow(Sender: TObject);中改为
  if isExit then
  begin
    //halt; 原来
    Application.Terminate;//新加
    exit;          //新加
  end;
  即可退出程序
2、可能你没有根据msg的类型进行解析发送过来的信息。
jojozzf 22840 2006/4/11 22:36:48
问题:
1、客户端:frmConfig是在procedure TfrmMain.FormShow(Sender: TObject);中被创建的,为什么在运行客户端时不会是先显示frmMain再显示frmConfig?运行客户端程序frmConfig时,要是想放弃聊天点选右上方关闭按钮后依然会进入聊天界面,为此我在frmConfig里加了退出按钮并加入 frmMain.Close;语句后会出现frmMain先Show后close。有没有什么办法解决这个问题?
2、我是按照你的代码编写的,可是用户登录成功后在MemRecv显示“登录成功!”后却同时显示了“用户名,IP;用户名,IP;……”也就是,从server发给这个client的msg.info中存放当前在线用户的列表的内容,这些内容是在msg.msgtype=ONLIE_LIST类型时存在msg.info中的,为什么当msg.msgtype = INFO时候这些内容还是被显示在memRecv中?memRecv.Lines.Add(msg.info);我对照程序暂时还没有查出来为什么。明天我再好好检查一下程序。

谢谢你总是耐心的回答我的问题,给你添麻烦了。
jojozzf 22811 2006/4/11 11:57:05
谢谢你提的建议,我现在正在找相关的书籍和资料学习~~
liuyax 22779 2006/4/10 8:55:58
你可以看看socket通讯的基础知识,包括server端与client,先用基础的实现,再返回来看idudp或idtcp,这样更好理解些。
第一页 上一页 下一页 最后页 有 43 条纪录 共3页 1 - 20
 用户名:
 密 码:
自动登陆(30天有效)
 
  DELPHI盒子版权所有 技术支持:深圳市麟瑞科技有限公司 1999-2024 V4.01 粤ICP备10103342号-1 更新RSS列表