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