跪求类似于QQ聊天服务器/客户端搭建思路,倾家荡产级散分,不过了!

jn_ios_vc_symbian 2012-07-10 03:55:37
最近想搞搞IM聊天之类的东东,之前搞过一些简单的,现在想搞点专业点的。现在列举下自己的一些疑问,望各位高人指点下。
1.实时监测好友的状态改变,利用心跳的方式是不是最佳方式?还是自己状态改变后,利用服务器通知自己的好友?
2.客户端发送数据一个线程,接收数据一个线程够不够用?当同时接收到多条记录时,该如何处理?
3.发送数据时,假如我们传输的是一个文件,在文件数据发送完毕前,再发送文字信息,这时该如何处理?
4.服务器端同时收到多个客户端发来的数据时,该如何处理?也就是说recv一个客户端的数据时,又接收到另一个客户端发来的数据。
5.A向B发送信息,通过服务器转发,信息中携带了A和B的唯一标示ID,服务器怎么找到与B建立的连接?
望高手不吝赐教~~~~全部分都在这一个帖子上了,好害怕啊。
...全文
675 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
a358763471 2013-12-23
  • 打赏
  • 举报
回复
引用 30 楼 Andy511823558 的回复:
我这两天研究了一下NAT穿越和P2P打洞的技术,可以解决两个在不同路由器下的内网主机间的相互通信,但是必须要有一个公网的服务器作为中间连接者,现在又遇到个新问题,我们单位的服务器只开放了HTTP端口,我的程序是用UDP作用通信的,请问有什么办法可以解决这个问题?
你好,请问你的问题解决了吗?当时如何解决的?给点思路,谢谢
Andy511823558 2012-07-22
  • 打赏
  • 举报
回复
我这两天研究了一下NAT穿越和P2P打洞的技术,可以解决两个在不同路由器下的内网主机间的相互通信,但是必须要有一个公网的服务器作为中间连接者,现在又遇到个新问题,我们单位的服务器只开放了HTTP端口,我的程序是用UDP作用通信的,请问有什么办法可以解决这个问题?
jj8113414 2012-07-19
  • 打赏
  • 举报
回复
楼主想干什么?我也在做这种开发,感觉不难,只是效率问题.
jn_ios_vc_symbian 2012-07-19
  • 打赏
  • 举报
回复
这俩天忙,没来得及及时结贴,sorry。
这个娜戒海了 2012-07-18
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 的回复:]

引用 4 楼 的回复:

没做过,以我的有限认识来回答一下楼主的问题

1、心跳包是最好的检测客户端是否在线的方法,也是唯一的方法。(拔网线、停电 服务端无法收到通知)
2、客户端应该没必要做多线程。
3、发送文件一般通过p2p,或者上传服务器时应该是用ftp,都是另起线程来做,跟发送聊天数据应该是不同的模块。
4、服务端要用IOCP模型,当然是多线程的。
5、每个客户端连到服……
[/Quote]

文件有个函数可以解决,TransmitFile()
sunnysab 2012-07-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

没做过,以我的有限认识来回答一下楼主的问题

1、心跳包是最好的检测客户端是否在线的方法,也是唯一的方法。(拔网线、停电 服务端无法收到通知)
2、客户端应该没必要做多线程。
3、发送文件一般通过p2p,或者上传服务器时应该是用ftp,都是另起线程来做,跟发送聊天数据应该是不同的模块。
4、服务端要用IOCP模型,当然是多线程的。
5、每个客户端连到服务器后他的socket对象就是唯……
[/Quote]
回答2.
多个端口吧?主线程负责调配,比如说端口123,服务器像123端口发送即将传送文件消息,然后接受文件名,再新建一个线程来接收文件。(个人见解)
Andy511823558 2012-07-17
  • 打赏
  • 举报
回复
http://blog.csdn.net/andy511823558/article/details/7755377
Andy511823558 2012-07-16
  • 打赏
  • 举报
回复
我想请教个问题,我现在写了个聊天程序,使用udpSocket发送,目前只能在局域网中互相通信(用内网IP通信),我现在想跟外网通信,应该怎么做啊?步骤是什么?
我跟我朋友测试了,他能发送消息给我,因为我的电脑做了端口映射,他发消息到我的路由器IP上我就能收到,但是我不能发送消息给他,我这边获取到对方的IP地址是对方的路由器IP,发送消息则发送到对方的路由器IP上,对方电脑收不到,请问有什么办法在对方不做端口映射的前提下发送消息到对方电脑(类似QQ)?
这个娜戒海了 2012-07-16
  • 打赏
  • 举报
回复
要不要结贴了,打字好累
Andy511823558 2012-07-16
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20120716/16/24968eb9-f466-444d-9435-6f165b8d6058.html
Andy511823558 2012-07-16
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20120716/16/24968eb9-f466-444d-9435-6f165b8d6058.html
jn_ios_vc_symbian 2012-07-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

我之前研究过聊天系统,我来讲下自己的思想
1.服务器端可以维护一张用户状态列表(客户名,ID,IP,状态,等等),每个用户登录,暂离,聊天,登出和断线都在该表中能够显示出来,各种客户端只要连上服务器,服务器就为该客户注册一个ID,然后改变其状态。
聊天系统很关键的就是客户端的状态问题,通过客户端之间的心跳包感觉效率低下
2.客户端发送数据不需要线程,简单点发送即可
3.transmitf……
[/Quote]
客户端和客户端直接通信这一块怎么处理?望高手说下思路
这个娜戒海了 2012-07-12
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]

客户端接收的话用异步接收就可以了,可以用WSAAsynSelect
具体看下这个
http://topic.csdn.net/u/20110220/12/144b6d5a-f541-43ac-984a-b3d471fc57ca.html
[/Quote]

那个连接说的很清楚了
jn_ios_vc_symbian 2012-07-12
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]

引用 14 楼 的回复:

在利用IOCP的时候,客户端用send发送了一个字符串"SSS",服务器在收到数据的时候,再把数据转发给客户端。在GetQueuedCompletionStatus的时候,返回的 lpnumberofbytes的值为1300,服务器在利用WSASend向客户端发送数据的时候为什么客户端收到6次FD_READ网络事件(客户端的接收用的select),用Messag……
[/Quote]
怎么用WSASend一次发送数据的时候,发送的数据很小(“SSS”字符串),客户端收的了6次FD_READ事件?
这个娜戒海了 2012-07-12
  • 打赏
  • 举报
回复
客户端接收的话用异步接收就可以了,可以用WSAAsynSelect
具体看下这个
http://topic.csdn.net/u/20110220/12/144b6d5a-f541-43ac-984a-b3d471fc57ca.html
jn_ios_vc_symbian 2012-07-12
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]

在利用IOCP的时候,客户端用send发送了一个字符串"SSS",服务器在收到数据的时候,再把数据转发给客户端。在GetQueuedCompletionStatus的时候,返回的 lpnumberofbytes的值为1300,服务器在利用WSASend向客户端发送数据的时候为什么客户端收到6次FD_READ网络事件(客户端的接收用的select),用MessageBox弹出收到的数据,前5次收到……
[/Quote]
不用select方式的话,只弹出接收的实际数据。如果客户端采用select,在FD_READ中还要排除收到空的数据吗?
jn_ios_vc_symbian 2012-07-12
  • 打赏
  • 举报
回复
在利用IOCP的时候,客户端用send发送了一个字符串"SSS",服务器在收到数据的时候,再把数据转发给客户端。在GetQueuedCompletionStatus的时候,返回的 lpnumberofbytes的值为1300,服务器在利用WSASend向客户端发送数据的时候为什么客户端收到6次FD_READ网络事件(客户端的接收用的select),用MessageBox弹出收到的数据,前5次收到的数据为空,最后一个收到的才是真实的数据,前5次是什么情况?1个WSASend可能进行多次发送操作,是不是客户端不应该用select的方式?求高手指点~
这个娜戒海了 2012-07-11
  • 打赏
  • 举报
回复
我做过1W+客户连接量的系统,MAP绰绰有余,压力测试可以到8W个同时在线
这个娜戒海了 2012-07-11
  • 打赏
  • 举报
回复
通过MAP的便利搜索很快的,可以说非常快,所以说服务器列表的效率不需要考虑
这个娜戒海了 2012-07-11
  • 打赏
  • 举报
回复
我之前研究过聊天系统,我来讲下自己的思想
1.服务器端可以维护一张用户状态列表(客户名,ID,IP,状态,等等),每个用户登录,暂离,聊天,登出和断线都在该表中能够显示出来,各种客户端只要连上服务器,服务器就为该客户注册一个ID,然后改变其状态。
聊天系统很关键的就是客户端的状态问题,通过客户端之间的心跳包感觉效率低下
2.客户端发送数据不需要线程,简单点发送即可
3.transmitfile这个函数知道不知道,可以百度下,用这个函数就不用考虑文件和聊天消息的切换了
4.用IOCP,网上例子很多,随便搜搜
5.和第一个问题差不多,只要在列表中搜索一下就行了

至于聊天内容,客户端可以与客户端直接通信,服务器只负责列表,这样就减少了服务器的压力。当然也可以客户端通过服务端转发,这样的话,服务端功能会更多一点
小小见解,有问题的话可留言讨论
加载更多回复(7)

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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