一篇文章贯穿ACE各种发送接收组件 1.2版
来源:互联网 发布:淘宝创业成功故事 编辑:程序博客网 时间:2024/06/06 09:30
TCP通信过程介绍
首先介绍一下socket通信的基本过程:这里先假设有两个家伙在通信,一个是S,另一个叫C
(1)S打开端口监听本地的端口看看有没有人来连接;
(2)与此同时C试图去连接远程的S,连接的地址就是S的地址加上S监听的端口号;
(3)S收到C的请求之后,建立连接,双方共同持有连接的通道,可互相发送/接收数据任意次,此时S和C无区别;
(4)其中一方断开连接,或者因为网络原因中断连接,另一方也会关闭;
(5)此时通信过程结束;
整个过程如下图所示
普通ACE通信类ACE_SOCK_*通信过程
ACE_SOCK_Connector ACE_SOCK_Stream ACE_SOCK_Acceptor完成上面的通信过程:
TimerServer Edition 1.0 单次发送
双方建立连接》互发数据》关闭连接
Client:发送自己的签名给Server之后就准备接受Server发来的时间
Server:在连接建立后打印对方发来的签名,之后回复自己的时间给对方
Server 端 time_server_main.cpp
#include <ace/OS.h>#include <ace/ACE.h>#include <ace/Log_Msg.h>#include <ace/SOCK_Acceptor.h>#include "ace/Date_Time.h"int main(int argc, char *argv[]){ ACE_INET_Addr addr(1500); ACE_SOCK_Acceptor server; ACE_SOCK_Stream stream; //启动监听 if(server.open(addr)==-1) { ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Server启动监听本地端口1500失败\n"))); return 1; } else { ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Server启动监听本地端口1500成功\n"))); } char msg[1000]; //建立链接 if(server.accept(stream)!=-1) { ACE_INET_Addr raddr; stream.get_remote_addr(raddr); ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Server建立链接成功 %s %d\n"),raddr.get_host_addr(),raddr.get_port_number())); if(stream.recv(msg,sizeof(msg)-1)==-1) // just call socket recv ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Server recv failed\n"))); else { ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Server recv : %s\n"),msg)); //get current time ACE_Date_Time date; sprintf(msg,"%ld-%ld-%ld %02ld:%02ld:%02ld:%02ld",date.year(),date.month(),date.day(),date.hour(),date.minute(),date.second(),date.microsec()); //发送数据 stream.send_n(msg,sizeof(msg)); ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("发送当前时间%s至 %s %d\n"),msg,raddr.get_host_addr(),raddr.get_port_number())); } } else { ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Server建立链接失败\n"))); } //关闭链接 stream.close(); ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Server链接关闭了\n"))); server.close(); return 0;}
Client端time_client_main.cpp
#include "ace/OS.h"#include <ace/OS_main.h>#include <ace/ACE.h>#include <ace/Log_Msg.h>#include <ace/SOCK_Connector.h>int main(int argc, char *argv[]){ ACE_INET_Addr addr(1500,"127.0.0.1"); //remote address ACE_SOCK_Connector con; // connetor for socket client ACE_SOCK_Stream stream; // stream is for socket read/write //建立链接 if(con.connect(stream,addr)==-1) //connect to remote address { ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Client建立链接失败\n"))); return 1; } else { ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Client建立链接成功\n"))); } const char msg[] = "Hello,ACE!"; //发送数据 stream.send_n(msg,sizeof(msg)); // send_n function send exactly n bytes char buffer[1024] = {0}; //接收数据 if(stream.recv(buffer,sizeof(buffer)-1)==-1) // just call socket recv { ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Client recv failed\n"))); return 1; } else { ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Client recv:%s\n"),buffer)); } //断开链接 if (stream.close () == -1) //close the connection { ACE_ERROR ((LM_ERROR,ACE_TEXT ("Client close failed\n"))); return 1; } else { ACE_ERROR ((LM_ERROR,ACE_TEXT ("Client close successed\n"))); } return 0;}
输出:
TimerServer Edition 2.0 多次发送
双方建立连接》互发数据》关闭连接
(1)Client:发送自己的签名给Server之后就准备接受Server发来的时间,此过程重复三次
(2)Server:在连接建立后打印对方发来的签名,之后回复自己的时间给对方,此过程直到对方关闭链接
Server 端 time_server_main.cpp
#include <ace/OS.h>#include <ace/ACE.h>#include <ace/Log_Msg.h>#include <ace/SOCK_Acceptor.h>#include "ace/Date_Time.h"int main(int argc, char *argv[]){ ACE_INET_Addr addr(1500); ACE_SOCK_Acceptor server; ACE_SOCK_Stream stream; //启动监听 if(server.open(addr)==-1) { ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Server启动监听本地端口1500失败\n"))); return 1; } else { ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Server启动监听本地端口1500成功\n"))); } char msg[1000]; //建立链接 if(server.accept(stream)!=-1) { ACE_INET_Addr raddr; stream.get_remote_addr(raddr); ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Server建立链接成功 %s %d\n"),raddr.get_host_addr(),raddr.get_port_number())); while(stream.recv(msg,sizeof(msg)-1)!=-1) // just call socket recv { ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Server recv : %s\n"),msg)); //get current time ACE_Date_Time date; sprintf(msg,"%ld-%ld-%ld %02ld:%02ld:%02ld:%02ld",date.year(),date.month(),date.day(),date.hour(),date.minute(),date.second(),date.microsec()); //发送数据 stream.send_n(msg,sizeof(msg)); ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("发送当前时间%s至 %s %d\n"),msg,raddr.get_host_addr(),raddr.get_port_number())); ACE_OS::sleep(1); } } else { ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Server建立链接失败\n"))); } //关闭链接 stream.close(); ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Server链接关闭了\n"))); server.close(); return 0;}
Client端time_client_main.cpp
#include "ace/OS.h"#include <ace/OS_main.h>#include <ace/ACE.h>#include <ace/Log_Msg.h>#include <ace/SOCK_Connector.h>int main(int argc, char *argv[]){ ACE_INET_Addr addr(1500,"127.0.0.1"); //remote address ACE_SOCK_Connector con; // connetor for socket client ACE_SOCK_Stream stream; // stream is for socket read/write //建立链接 if(con.connect(stream,addr)==-1) //connect to remote address { ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Client建立链接失败\n"))); return 1; } else { ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Client建立链接成功\n"))); } const char msg[] = "I'm Client ABC"; //发送数据 int n=3; for (int i=0; stream.send_n(msg,sizeof(msg)) != -1 && i<3;++i) { ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Client send successed\n"))); char buffer[1024] = {0}; //接收数据 if(stream.recv(buffer,sizeof(buffer)-1)==-1) // just call socket recv { ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Client recv failed\n"))); return 1; } else { ACE_DEBUG ((LM_DEBUG,ACE_TEXT ("Client recv:%s\n"),buffer)); } ACE_OS::sleep(1); } //断开链接 if (stream.close () == -1) //close the connection { ACE_ERROR ((LM_ERROR,ACE_TEXT ("Client close failed\n"))); return 1; } else { ACE_ERROR ((LM_ERROR,ACE_TEXT ("Client close successed\n"))); } return 0;}
TimerServer Edition 2.0 多次发送
多个客户端分多次发送 0 0
- 一篇文章贯穿ACE各种发送接收组件 1.2版
- 转载一篇Flex组件生命周期的文章
- springboot 邮件接收发送 阿里云发送短信组件
- ACE基本的UDP通信(一)简单的发送和接收 1.0
- 如何使用JMAIL组件实现邮件的发送与接收
- 四大组件 — BroadCastReceiver广播接收者-接收 | 发送
- 转载一篇amazon大牛评论各种语言的文章
- 转载一篇关于“vue学习--组件”的文章
- ACE相关学习文章
- ACE基本的UDP通信(二)对UDP封装,并测试:连续发送和连续接收 1.0
- 一篇文章
- RabbitMQ第一篇——初识RabbitMQ,简单的消息发送和接收
- 文章标题 Android系统广播的发送短信和接收短信的一些用法
- 安卓BroadcastReceiver组件使用系列1:普通广播的发送和接收
- Android深入四大组件(四)广播的注册、发送和接收过程
- ACE 文章收集连接 【经典】
- ACE入门---很好的文章
- ACE入门---很好的文章
- 39个让你受益的HTML5教程
- DexFile_openDexFileNative函数解析
- Objective-C 单例、用户首选项(UserDefaults)、对象归档
- javascript事件监听
- Python中time模块
- 一篇文章贯穿ACE各种发送接收组件 1.2版
- android获取手机信息
- 更新android sdk
- shell中$0,$?,$!等的特殊用法
- 【歪谈】重构浪漫:未来属于浪漫的80后
- chapter01使用angularjs 的基本
- 程序员面试资源大收集
- hbase基础整理
- C++ sizeof之虚继承