请问QQ的消息接收是怎么实现的?
是在聊天窗口接收还是在主面板中接收的呢?如果是在主面板中接收,那么又是怎么在聊天窗口中及时更新聊天信息的呢?
提前祝大家节日快乐,不管有没有满意答案,周一都结帖
[解决办法]
先占沙发
[解决办法]
但愿不是无满意答案结贴
[解决办法]
请问QQ的消息接收是怎么实现的?
-------------------------------
QQ应该是在好友主列表对消息进行接收,然后在通过主窗体去改变子窗体(聊天窗体)中的内容,以实现信息的即时收取
同样的道理在发送信息是也应该是通过父窗口进行发送.
个人观点,如有雷同,实属巧合.
[解决办法]
up~
Everybody ! happy for our festival !
[解决办法]
有个MsgOleInRich.dll
估计是在窗口中接收的吧
[解决办法]
应该是QQMsgRecver.dll和QQMsgFriendMng.dll这两个……
这么看好像又是在主面板中接收的了……
[解决办法]
值项
[解决办法]
和在那个窗口没关系.
如果我是qq的开发人员. 会有一个负责所有和服务器通讯的进程.
这个进程根据消息操纵其他进程.
[解决办法]
接分
谢谢
[解决办法]
学习中。。。。
[解决办法]
我也想知道
[解决办法]
我觉得在主程序和窗口可能都有,我写过一个简单的即时聊天程序,一般和某个好友建立聊天以后,都直接使用p2p方式发送消息,
当对方没有返回接收确认的时候,就暂存到服务器。
所以我认为,当好友在线(无论隐身与否)都是听过窗口来接收的,当有一方不在线,或者掉线的时候会通过服务器转发,
这个时候很可能是通过主程序接收,然后在窗口显示的。
呵呵,纯属个人猜测!
[解决办法]
个人认为应该是两部分接收工作,或者是一个接收工作通过两部分来实现
首先是否有消息的通知应该在主窗口或者是通过主窗口加载的其他组件进行接收,之后子窗口会接收具体的消息
另外一种就是主窗口接收了全部消息,并将消息保存到一个什么地方(临时文件或者内存中的某个地方),并通知子窗口有消息了,之后子窗口会从相关的地方读出具体的消息。
[解决办法]
虽然不是很懂~学习先
[解决办法]
个人认为应该是在主面板中接收,如果在聊天窗口接收的话,一个聊天窗口就需要一个socket,太消耗资源了。
应该是主面板中接收,再根据消息内容决定更新哪个聊天窗口中的内容。
[解决办法]
学习`
谢谢`
[解决办法]
估计和socket有关,没做过 猜测
[解决办法]
主窗口,如果增加了视频/语音的话,子窗口!
[解决办法]
不太明白...
[解决办法]
我也觉得是在主窗口
[解决办法]
以前看过一个类此的源代码,是在主窗体接受,然后传递给子窗体的,这样其实别叫容易控制!楼主可以搜索以下类似的源码!
[解决办法]
找个腾迅的人问问撒
[解决办法]
学习下
[解决办法]
接收消息 ,然后写入文件,聊天窗口去取文件
你没发现吗,QQ每次只要你登录了,然后结束掉,不看消息,下次登录时就不会闪了
[解决办法]
楼上的说的有点玄乎。跟真的一样。呵呵
------解决方案--------------------
up
[解决办法]
up
[解决办法]
学习ing
[解决办法]
搞笑吧,看样子C#的人对C\S不太了解,
QQ是用分层结构,低层接收消息,用事件回调GUI层,
回调方式是用委托.看看下面源码
#ifndef _EVENT_SUPPORT_H_
#define _EVENT_SUPPORT_H_
//C++通用事件支持宏 Copyright (c) Tencent Inc. 2001
//本代码是经过对Visual C++ 7.0新引入的事件机制进行研究和反编译,
//接近乎相同的原理,编写而来.
//优点:
//任何C++类都可作为事件源和事件接收者
//事件接收者的数目不限
//支持编译时的类型检测
//接口简单
//Written by sjh (jhshu@tencent.com)
//Version 1.1(2001-09)
//Version 1.2(2001-10)
//取消了DECLARE_EVENT_SUPPORT宏
//加入DECLARE_EVENT_RECEIVER宏
//自动判断事件接收对象是否可用,防止接收对象被delete后的访问从突
//Version 1.3 (2002-6-12)
//加入多线程支持
/*
使用说明:
EVENT:
用来在事件源中定义一个事件,事件的参数可自由定义.
EVENT( 函数名, (参数定义), (相应的参数列表) )
HookEvent:
为事件源添加一个事件接收者.
Source.HookEvent(事件名,接收对象指针,接收函数)
UnhookEvent:
删除一个事件源的事件接收者.
Source.UnhookEvent(事件名,接收对象指针,接收函数)
RaiseEvent:
触发事件源的事件.
Source.RaiseEvent(事件名(事件参数))
DECLARE_EVENT_RECEIVER(classname)
代码示例:
//事件源
class CSource
{
public:
//为CSource添加一个 void OnTimer(void) 的事件
EVENT(OnTimer,(),());
//为CSource添加一个 void OnData(BYTE* pBuf, DWORD nLen) 的事件
EVENT(OnData,(BYTE* pBuf,DWORD nLen),(pBuf,nLen));
public:
void FireOnTimer()//内部也可以激发事件
{
RaiseEvent( OnTimer() );//使用宏触发OnTimer事件
OnTimer();//也可直接调用OnTimer
}
}
//接收者
class CReceiver
{
DECLARE_EVENT_RECEIVER(CReceiver)
public:
void OnTimer();
void OnData(BYTE* pBuf,DWORD nLen);
};
...
CSource s;
CReceiver r;
s.HookEvent(OnTimer, &r, &CReceiver::OnTimer);
s.HookEvent(OnData, &r, &CReceiver::OnData);
s.RaiseEvent(OnTimer());//激发s的OnTimer事件
BYTE buf[128];
s.RaiseEvent(OnData(buf,128)); //激发s的OnData事件
...
s.UnhookEvent(OnData,&r,&CReceiver::OnData);
*/
#define EVENT(f,p,v) DECLARE_EVENT(public,f,p,v)
//DECLARE_EVENT定义事件
//access为事件激发函数的访问类型
//如果事件只允许在内部被激发,可以将access设为protected
#define DECLARE_EVENT(access,f,p,v) \
private:\
struct _event_node_##f\
{\
virtual bool _Invoke p = 0;\
virtual bool _IsEqual(void* pt,void* pf) = 0;\
_event_node_##f* _pNext;\
};\
template<class T,class F>\
struct _handler_##f: public _event_node_##f\
{\
T* _pThis;\
F _pFun;\
int _nPtrData;\
bool _Invoke p\
{\
bool _b = false;\
try{if(memcmp((BYTE*)_nPtrData,"################",16)==0)_b=true;}catch(...){}\
if(_b)(_pThis->*_pFun)v;return _b;\
}\
bool _IsEqual(void* pt,void* pf)\
{\
if( (void*)_pThis==pt && (pf==NULL || *((void**)&_pFun)==pf))\
return true;\
return false;\
}\
};\
struct _nodes_##f\
{\
CRITICAL_SECTION m_cs;\
_nodes_##f(){_pNodes=NULL;InitializeCriticalSection(&m_cs);}\
~_nodes_##f(){DeleteCriticalSection(&m_cs);_event_node_##f* pNode = _pNodes;_event_node_##f* pTemp;while(pNode){pTemp=pNode->_pNext;delete pNode;pNode=pTemp;}}\
_event_node_##f* _pNodes;\
void _Lock(){EnterCriticalSection(&m_cs);}\
void _Unlock(){LeaveCriticalSection(&m_cs);}\
}_xNodes_##f;\
public:\
template<class T,class F>\
long HookEvent_##f(T* pThis,F pFun)\
{\
if(pThis)\
{\
_xNodes_##f._Lock();\
_handler_##f<T,F>* pNode = new _handler_##f<T,F>;\
pNode->_pThis = pThis;\
pNode->_nPtrData = (int)pThis + pThis->_xEventReceiver.nOffset;\
pNode->_pFun = pFun;\
pNode->_pNext = _xNodes_##f._pNodes;\
_xNodes_##f._pNodes = pNode;\
_xNodes_##f._Unlock();\
return 1;\
}\
return 0;\
}\
template<class T,class F>\
long UnhookEvent_##f(T* pThis,F pFun)\
{\
_xNodes_##f._Lock();\
_event_node_##f* pNode = _xNodes_##f._pNodes;\
_event_node_##f* pPre = NULL;\
long nResult = 0;\
void* pTemp = pFun==NULL ? NULL : *((void**)&pFun);\
while(pNode)\
{\
if(pNode->_IsEqual(pThis,pTemp))\
{\
if(pPre)\
pPre->_pNext = pNode->_pNext;\
else\
_xNodes_##f._pNodes = pNode->_pNext;\
delete pNode;\
if(pPre)\
pNode = pPre->_pNext;\
else\
pNode = _xNodes_##f._pNodes;\
if(pTemp){nResult=1;break;}\
}\
else\
{\
pPre = pNode;\
pNode = pNode->_pNext;\
}\
}\
_xNodes_##f._Unlock();\
return nResult;\
}\
void RemoveAllEvent_##f()\
{\
_xNodes_##f._Lock();\
_event_node_##f* pNode = _xNodes_##f._pNodes;\
_event_node_##f* pTemp = NULL;\
while(pNode)\
{\
pTemp = pNode->_pNext;\
delete pNode;\
pNode = pTemp;\
}\
_xNodes_##f._pNodes = NULL;\
_xNodes_##f._Unlock();\
}\
access:\
void f p\
{\
_xNodes_##f._Lock();\
try{\
_event_node_##f* pNode = _xNodes_##f._pNodes;\
_event_node_##f* pPre = NULL;\
while(pNode)\
{\
if( (pNode->_Invoke v) )\
{ pPre = pNode; pNode = pNode->_pNext; }\
else\
{TRACE(_T("Detected died event receiver , removed ok .\n"));if(pPre){pPre->_pNext = pNode->_pNext; delete pNode; pNode = pPre->_pNext;}\
else{_xNodes_##f._pNodes = pNode->_pNext; delete pNode; pNode = _xNodes_##f._pNodes?_xNodes_##f._pNodes:NULL;}\
}\
}\
}catch(...){_xNodes_##f._Unlock();throw;}\
_xNodes_##f._Unlock();\
}\
#define HookEvent(e,t,f) HookEvent_##e(t,f)
#define UnhookEvent(e,t,f) UnhookEvent_##e(t,f)
#define RemoveAllEvent(e) RemoveAllEvent_##e()
#define RaiseEvent(e) e
#define DECLARE_EVENT_RECEIVER(classname) \
public:\
struct _event_Receiver\
{\
_event_Receiver(){memset(data,'#',16);nOffset=offsetof(classname,_xEventReceiver);}\
~_event_Receiver(){memset(data,0,16);}\
BYTE data[16];\
int nOffset;\
}_xEventReceiver;\
#endif //_EVENT_SUPPORT_H_