| 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,这样更好理解些。 |