关于写即时通讯的一些基本问题!

bcbnewbie 2005-11-02 03:57:38
以前没有接触过网络通讯,现在准备写一个即时通讯的工具,要实现如下功能:
1.同时在线1000人左右聊天
2.音频、视频聊天
3.文件传输
4.简单的对战游戏
5.可以群聊,也可以点对点的聊天

现在的问题是用BCB戴的TSocketServer和TSocketClient能不能实现上述功能,性能如何。因为我搜索了以前的帖子好像用两个控件不如直接用Socket API那样好。我对Socket API几乎没有了解,请推荐一本Socket API编程的书。
...全文
653 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
happyct 2005-11-14
  • 打赏
  • 举报
回复
其中还做了几个不大不小的控件。有点模仿QQ和MSN的感觉。自我感觉不错。如果有需要的,可以向我索取,可惜不能贴图。
happyct 2005-11-14
  • 打赏
  • 举报
回复
总结:

1、对于某某控件好,某某控件不好这样的评论,一般来说,都是不客观的。那是开发者自己水平问题(当然我的水平也不行)

2、要P2P,请用UDP,TCP没办法实现的,除非限于局域网或都是公网

3、请做好详尽的系统分析,工程约大,这项工作越重要。这个项目的的系统分析时间是1个月,除系统分析文档外,其他文档还没写

4、自我感觉速度还比较快,中间遇到过2次问题,都是安吉儿帮忙解决的,在此谢过
happyct 2005-11-14
  • 打赏
  • 举报
回复
我做这个项目也做了3个月了。用的是delphi开发
用的TindyUdpServer,目的是P2P

目前已经具有的功能:
1. 文件收发:支持文件托放操作,收发过程中的信息交互(如取消、中止、错误),支持一对多发送
2. 信息收发:包括文字、手写信息、屏幕拷贝、表情图片(可自行添加),声音信息(即录音),这些信息可以混合编辑
3. 魔法表情:除系统提供的之外,用户可自由的自行添加
4. 屏幕震动
5. 输入状态提示功能,对方开始及结束输入都可以及时看到
6. 来信提示:托盘图标闪动、主窗体上方提示闪动、弹出提示窗口,任务栏闪动等
7. 头像设定及编辑:用户可自定义头像,系统提供了一个简单方便的编辑工具,可直接对头像进行设定编辑
8. 在线状态设定及个人文字说明
9. 历史消息查询功能(正在修改)
10. 临时群组(多方会谈):包括创建、添加、修改及删除。非组创建者只能添加用户,不能删除
11. 系统皮肤整体变色
12. 用户自定义链接。类似于收藏夹

插件接口:
消息收发接口
文件收发接口(其实就是一个插件)

上述功能已经完成,同时对50个在线用户的群聊没什么问题
同时对30个用户收发文件没什么问题
视频语音还没做
我来看看CB 2005-11-14
  • 打赏
  • 举报
回复
确实是个大工程。。。
「已注销」 2005-11-14
  • 打赏
  • 举报
回复
学习
bcbnewbie 2005-11-09
  • 打赏
  • 举报
回复
老兄,能留个QQ号交流一下吗?
linuxghs 2005-11-09
  • 打赏
  • 举报
回复
我也是用bcb开发的即时通讯软件,用的udp,现在效果很好
我用的也是第二种方法。除非是离线消息才要在server存储。
constantine 2005-11-09
  • 打赏
  • 举报
回复
第二种好多了,现在的即时通基本上都是这样,但是不通的时候会让server转发
bcbnewbie 2005-11-09
  • 打赏
  • 举报
回复
qq:124271328]
bcbnewbie@21cn.com
谢谢!
alloutoflove 2005-11-09
  • 打赏
  • 举报
回复
偶是进来学习的.
niiv 2005-11-09
  • 打赏
  • 举报
回复
请留email/QQ/msn。
niiv 2005-11-08
  • 打赏
  • 举报
回复
和 constantine(飘遥的安吉儿) 有类似感觉,Indy也不见得很好。

1000个客户端同时连接服务器时,TSocketServer可以3秒左右完成所有连接,如果每客户端通过服务器转发数据,每秒1K Bytes,服务器占用的资源几乎为0%。

注:测试PC,CPU=赛扬1G,内存=256M,出入口带宽最高达1MBytes/s。

UDP方面用Indy的好些
bcbnewbie 2005-11-08
  • 打赏
  • 举报
回复
谢谢大家回复!
想请教 niiv(一叶) 对于多人聊天的方案,就性能方面有什么看法。
比如说方案一由服务器转发用户的所有的数据包,服务器采用阻塞+多线程 或者非阻塞方式
第二种服务器转发登录用户的好友的IP,让登录用户和他的好友直接p2p的方式联系,在客户端用多线程+自己定义的消息格式。
那个更好一点,或则有更好的方案?
niiv 2005-11-08
  • 打赏
  • 举报
回复
测试结构如下:
服务器处于公网(电信级机房托管服务器),
服务器配置:CPU=赛扬1G,内存=256M,出入口带宽最高达1MBytes/s。
使用BCB的TSocketServer

客户端使用BCB的TSocketClient,生成1000个实例后,使用循环连接该服务器的同一端口(也就是相同IP的相同端口).

服务器端记录第1个连接到第1000个连接(OnAccept事件)的时间差。
最短时间3秒以下,一般在10秒左右。

个人用TSocketServer和TSocketClient有4年了,无论从效率和稳定性上都非常好,但也经常看到论坛上有人说丢包之类的问题,我没碰到过,估计是程序有问题。

To: BCB2006(i like bcb)
TSocketServer,无法区分你的数据是否为“文件或语音视频”,只视乎数据传送量。
BCB2006 2005-11-08
  • 打赏
  • 举报
回复
楼上的你是如何测试1000个并发连接的?如果是传送文件或语音视频呢?
这么说TSocketServer很强啊
constantine 2005-11-07
  • 打赏
  • 举报
回复
indy 很好我到不见的,还是有些不见人意,版本变化比较大,对于升级不好
如果你用TSocketServer和TSocketClient,那么是无法实现p2p的,p2p只能用udp
不过如果要简单用server转发很简单,不过这样会增加server的负担
另外你说的情况不会出现,既然是多线程,那么每个client的线程都是独立的,“那么其他用户是不是可能会得不到服务”这个不用担心
如果真要做到你提的要求,你可以考虑用indy的idudpserver控件来做
bcbnewbie 2005-11-07
  • 打赏
  • 举报
回复
谢谢大家回帖,我的想法就是服务器指转发更行IP的管理,然后客户端采用点对点直接联系。定义一些通讯命令字。还有一点疑问采用阻塞加线程的方式如果同时有几百个连接请求,服务器不是要同时开几百个线程对应,那不是对服务器的要求很高,,如果是非阻塞的方式,假设一个客户连接的请求处理很长时间,那么其他用户是不是可能会得不到服务?
wyb_45 2005-11-07
  • 打赏
  • 举报
回复
socket api比较简单 也跨平台
就是要自己处理 多线程
WORD wVersionRequested;
WSADATA wsaData;
Sleep(100);
wVersionRequested=MAKEWORD(2,0);
int err=WSAStartup(wVersionRequested,&wsaData);
。。。
int Connect_Server(AnsiString host, u_short port)
{
int i, s;
long* p;
hostent* phe;
sockaddr_in sin;
DWORD Address;
sin.sin_family = AF_INET;
sin.sin_port = htons(port);

Address = inet_addr(host.c_str());
if (Address == INADDR_NONE) {
phe = gethostbyname(host.c_str());
if (phe) {
p = (long*)(*phe->h_addr_list);
sin.sin_addr.s_addr = *p;
}
}
else {
i = inet_addr(host.c_str());
if (i!=-1)
sin.sin_addr.s_addr = i;
}

s = socket(PF_INET,SOCK_STREAM,0);
if (s == INVALID_SOCKET)
return 0;
if (connect(s,(struct sockaddr FAR *)&sin,sizeof(sin))<0) // == SOCKET_ERROR) {
{
closesocket(s);
return(-1);
//int i = WSAGetLastError();
// return 0;
}
else
return s;
}

BOOL RecvStream(SOCKET s, TMemoryStream* Stream)
{
char buf[PACKAGESIZE];
//int namelen;
int pktlen;
int i = 1;
for (;;i++) {
Application->ProcessMessages();
if ((pktlen = recv(s,buf,sizeof(buf),0))<0) {
//接收数据失败
return false;
}
else if (pktlen == 0)
break;
else {
Stream->Seek(0,soFromEnd);
Stream->Write(buf,pktlen);
}
}
Stream->Seek(0,soFromBeginning);
closesocket(s);
return true;
}


if((pktlen =send(sockfd,buf,send_len,0))<=0)
{
。。。
break;
}
我不懂电脑 2005-11-07
  • 打赏
  • 举报
回复
Indy 很稳定,效率很好,而且跨平台。
wangxiangsjz 2005-11-07
  • 打赏
  • 举报
回复
http://www.loveunix.net/bbs/index.php?showtopic=22093
加载更多回复(9)

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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