18,356
社区成员
发帖
与我相关
我的任务
分享
/* 1) 通知接口方法:*/
OnPrepareConnect(CONNID dwConnID, SOCKET socket)
OnConnect(CONNID dwConnID)
OnSend(CONNID dwConnID, const BYTE* pData, int iLength)
OnReceive(CONNID dwConnID, const BYTE* pData, int iLength) //(Push 模型)
OnReceive(CONNID dwConnID, int iLength) //(Pull 模型)
OnClose(CONNID dwConnID)
OnError(CONNID dwConnID, EnSocketOperation enOperation, int iErrorCode)
OnAgentShutdown()
/* 2) 主要操作方法:*/
Start(LPCTSTR pszBindAddress = nullptr, BOOL bAsyncConnect = TRUE)
Stop()
Connect(LPCTSTR pszRemoteAddress, USHORT usPort, CONNID* pdwConnID = nullptr)
Send(CONNID dwConnID, const BYTE* pBuffer, int iLength)
Disconnect(CONNID dwConnID, BOOL bForce = TRUE)
Fetch(CONNID dwConnID, BYTE* pData, int iLength) //(Pull 模型)
1) TcpServer:TCP 通信服务端组件,支持 PUSH/PULL 模型
2) TcpClient:TCP 通信客户端组件,支持 PUSH/PULL 模型
3) TcpAgent :TCP 通信 Agent 组件,支持 PUSH/PULL 模型
4) UdpServer:UDP 通信服务端组件,支持 PUSH 模型
5) UdpClient:UDP 通信客户端组件,支持 PUSH 模型
/* 0: 应用程序加入 hpsocket-3.2.1.jar 和 jna-4.1.0.jar */
/* 1: 创建通信组件对象 */
TcpAgent agent = TcpAgent.create(Mode.PUSH);
/* 2: 设置回调函数对象 */
// (可选)
agent.setCallBackOnPrepareConnect(new OnPrepareConnectImpl());
// (可选)
agent.setCallBackOnConnect(new OnConnectImpl());
// (必须)PUSH 模型需要设置 OnReceive 回调函数对象
agent.setCallBackOnReceive(new OnReceiveImpl());
// (必须)PULL 模型需要设置 OnPullReceive 回调函数对象
// agent.setCallBackOnPullReceive(new OnPullReceiveImpl());
// (可选)
agent.setCallBackOnSend(new OnSendImpl());
// (必须)
agent.setCallBackOnClose(new OnCloseImpl());
// (必须)
agent.setCallBackOnError(new OnErrorImpl());
// (可选)
agent.setCallBackOnAgentShutdown(new OnAgentShutdownImpl());
/* 3:启动通信组件 */
agent.start("127.0.0.1", false);
/* 4:连接服务器 */
agent.connect("localhost", (short)5555, pdwConnID);
/* 5:处理通信数据 */
// 响应 OnReceive / OnPullReceive 事件接收数据
// 使用 agent.send(dwConnID, data, data.length) 发送数据
/* 6:关闭通信组件 */
agent.stop();
/* 7:销毁通信组件 */
TcpAgent.destroy(agent);
/* 示例代码一:*/
/* ----------------------------------------------------------------------- */
ISocketListener::EnHandleResult CServerDlg::OnClose(CONNID dwConnID)
{
// 以前版本:
// 有可能存在并发的 OnClose()/OnError(),要把代码放在临界区中并检测返回值
CCriSecLock locallock(m_csPkgInfo); // <-- 临界区
PVOID pInfo = nullptr;
// <-- 检测返回值
if(m_Server->GetConnectionExtra(dwConnID, &pInfo) && pInfo != nullptr)
{
m_Server->SetConnectionExtra(dwConnID, nullptr);
delete pInfo;
}
}
/* 示例代码二:*/
/* ----------------------------------------------------------------------- */
ISocketListener::EnHandleResult CServerDlg::OnClose(CONNID dwConnID)
{
// v3.1.2 版本:
// 只会接收到一个 OnClose()/OnError() 事件,能安全地移除临界区代码和检测代码
PVOID pInfo = nullptr;
m_Server->GetConnectionExtra(dwConnID, &pInfo);
ASSERT(pInfo != nullptr);
delete pInfo;
}
方法一:
----------------------------------------------------------------------------
(0) (C/C++ 程序)包含 HPSocket4C.h 头文件
(1) 调用 ::Create_HP_XxxListener() 函数创建监听器对象
(2) 调用 ::Create_HP_Xxx(pListener) 函数创建 HPSocket 对象
(3) 调用 ::HP_Set_FN_Xxx_OnYyy(pListener, ...) 函数设置监听器的回调函数
(4) 调用相关导出函数操作 HPSocket 对象
(5) ...... ......
(6) 调用 ::Destroy_HP_Xxx(pSocket) 函数销毁 HPSocket 对象
(7) 调用 ::Destroy_HP_XxxListener(pListener) 函数销毁监听器对象
方法二:
----------------------------------------------------------------------------
(1) 应用程序把需要用到的导出函数封装到特定语言的包装类中
(2) 通过包装类封装后,以面向对象的方式使用 HPSocket
4、HPSocket4C.dll 动态链接库发行版本
(1) x86/HPSocket4C.dll - (32位/MBCS/Release)
(2) x86/HPSocket4C_D.dll - (32位/MBCS/DeBug)
(3) x86/HPSocket4C_U.dll - (32位/UNICODE/Release)
(4) x86/HPSocket4C_UD.dll - (32位/UNICODE/DeBug)
(5) x64/HPSocket4C.dll - (64位/MBCS/Release)
(6) x64/HPSocket4C_D.dll - (64位/MBCS/DeBug)
(7) x64/HPSocket4C_U.dll - (64位/UNICODE/Release)
(8) x64/HPSocket4C_UD.dll - (64位/UNICODE/DeBug)
/* 1) 通知接口方法:*/
OnPrepareConnect(CONNID dwConnID, SOCKET socket)
OnConnect(CONNID dwConnID)
OnSend(CONNID dwConnID, const BYTE* pData, int iLength)
OnReceive(CONNID dwConnID, const BYTE* pData, int iLength) //(Push 模型)
OnReceive(CONNID dwConnID, int iLength) //(Pull 模型)
OnClose(CONNID dwConnID)
OnError(CONNID dwConnID, EnSocketOperation enOperation, int iErrorCode)
OnAgentShutdown()
/* 2) 主要操作方法:*/
Start(LPCTSTR pszBindAddress = nullptr, BOOL bAsyncConnect = TRUE)
Stop()
Connect(LPCTSTR pszRemoteAddress, USHORT usPort, CONNID* pdwConnID = nullptr)
Send(CONNID dwConnID, const BYTE* pBuffer, int iLength, int iOffset = 0)
Disconnect(CONNID dwConnID, BOOL bForce = TRUE)
Fetch(CONNID dwConnID, BYTE* pData, int iLength) //(Pull 模型)
5、增加 TcpAgent / TcpPullAgent 使用示例:
* Agent-PFM
* Agent-Pull
* Agent-4C
> 增加 HPSocket for Java SDK:
-----------------
1、提供 Java 开发包:hpsocket-3.2.1.jar(通过 JNA 实现,目前只支持 Windows 平台)
2、运行环境:JDK 1.6+,JVM 运行在 server 模式("java -server",在 client 模式下性能受影响)
3、增加示例工程 TestEcho-4J,展示 HPSocket4J 的使用方法(包括 PULL 模型示例和性能测试示例)
4、MBCS 和 Unicode 版本分布位于包 org.jessma.hpsocket.mbcs 和 org.jessma.hpsocket.unicode
5、HPSocket for Java SDK 提供以下通信组件:
1) TcpServer:TCP 通信服务端组件,支持 PUSH/PULL 模型
2) TcpClient:TCP 通信客户端组件,支持 PUSH/PULL 模型
3) TcpAgent :TCP 通信 Agent 组件,支持 PUSH/PULL 模型
4) UdpServer:UDP 通信服务端组件,支持 PUSH 模型
5) UdpClient:UDP 通信客户端组件,支持 PUSH 模型
6、HPSocket4J 的使用方法(以 TcpAgent 为例):
/* 0: 应用程序加入 hpsocket-3.2.1.jar 和 jna-4.1.0.jar */
/* 1: 创建通信组件对象 */
TcpAgent agent = TcpAgent.create(Mode.PUSH);
/* 2: 设置回调函数对象 */
// (可选)
agent.setCallBackOnPrepareConnect(new OnPrepareConnectImpl());
// (可选)
agent.setCallBackOnConnect(new OnConnectImpl());
// (必须)PUSH 模型需要设置 OnReceive 回调函数对象
agent.setCallBackOnReceive(new OnReceiveImpl());
// (必须)PULL 模型需要设置 OnPullReceive 回调函数对象
// agent.setCallBackOnPullReceive(new OnPullReceiveImpl());
// (可选)
agent.setCallBackOnSend(new OnSendImpl());
// (必须)
agent.setCallBackOnClose(new OnCloseImpl());
// (必须)
agent.setCallBackOnError(new OnErrorImpl());
// (可选)
agent.setCallBackOnAgentShutdown(new OnAgentShutdownImpl());
/* 3:启动通信组件 */
agent.start("127.0.0.1", false);
/* 4:连接服务器 */
agent.connect("localhost", (short)5555, pdwConnID);
/* 5:处理通信数据 */
// 响应 OnReceive / OnPullReceive 事件接收数据
// 使用 agent.send(dwConnID, data, data.length) 发送数据
/* 6:关闭通信组件 */
agent.stop();
/* 7:销毁通信组件 */
TcpAgent.destroy(agent);
> 优化数据发送策略:
-----------------
1、IClient/IServer/IAgent 组件的 Send() 方法不直接把数据投递到完成端口
2、在高负载情形下,数据会放入发送队列,并进行数据包合并,避免高负载下发生 10055 错误
3、当发送大量小数据包时,自动组包机制能大大提高发送效率
4、应用程序可以通过 GetPendingDataLength() 获取队列中未发出的数据,从而实现流量控制
> 其它更新:
-----------------
1、IServer 的 GetClientAddress() 方法改名为 GetRemoteAddress()
2、IClient 的 Send() 方法删除 “CONNID dwConnID” 参数
3、IClient/IServer/IAgent 的 Send() 方法增加发送数据缓冲区指针偏移量参数 “int iOffset”
4、EnServerError / EnClientError 枚举类型合并为 EnSocketError
5、EnSocketError / EnHandleResult / EnFetchResult 枚举类型从原所在类中移到外部
6、IClient/IServer/IAgent 增加方法:BOOL GetPendingDataLength(),获取连接中未发出数据的长度
7、HPSocket4C.dll 增加方法 SendPart(),支持指定缓冲区指针偏移量
8、增加 HPSocket for C# SDK(由 int 2e 提供)
9、公共代码包 vc-common-src 更新为 v2.3.4(参考:vc-common-src v2.3.4 的 Change Log)