实现的功能是每一个客户端发送的信息,通过服务器,都可以转发给其它所有人看到。
前提是所有人都连接到服务器。
采取的方法是:
(1)服务器检测到连接,就开启一个线程,应对这个连接
(2)客户端开启两个线程,一个线程负责发送消息,另外一个负责接收消息。
所有代码在ACE框架中实现:
下面是服务器端的代码
#include "stdafx.h" #include "ace/SOCK_Acceptor.h" #include "ace/SOCK_Stream.h" #include "ace/INET_Addr.h" #include "ace/OS.H" #include "ace/Thread.h" #include "ace/Synch.h" #include <string> #include <iostream> using namespace std; #pragma comment(lib,"aced.lib") #pragma comment(lib,"ace.lib") /************ 服务端程序 **************** * * 使用ACE框架进行简单的服务器 * 反馈客户端程序,只能处理一个连接 * ACE源码保存在D:/ACE_wrappers * 环境变量以及编译的添加库 * 也据此设计 * *****************************/ ACE_SOCK_Stream peer[5]; unsigned __stdcall mythread1(LPVOID arg) { char buffer[1024]; SSIZE_T bytes_received; ACE_INET_Addr addr; ACE_SOCK_Stream peer1=*((ACE_SOCK_Stream*)arg); peer1.get_remote_addr(addr); /* 获得客户端的ip以及端口号 */ cout<<endl<<"mythread one\t"<<addr.get_host_name()<<"\t"<<addr.get_port_number()<<endl; while(1) { while ((bytes_received =peer1.recv (buffer, sizeof(buffer))) != -1) //读取客户端发送的数据 { //cout<<"in thread1"<<endl; buffer[bytes_received]='\0'; string str=buffer; cout<<str<<endl; int i=0; for(i=0;i<5;i++) { //peer[i].send(str.c_str(), str.length()); //对客户端发数据 peer[i].send(buffer,bytes_received); } //Sleep(10); } peer1.close (); } } int _tmain(int argc, _TCHAR* argv[]) { ACE::init(); /*ACE 初始化*/ WSADATA wsaData; if(WSAStartup( MAKEWORD(2,0), &wsaData) != 0) { ACE_OS::printf("start failed"); } ACE_INET_Addr port_to_listen(6000); /* 端口对象 */ ACE_SOCK_Acceptor acceptor1; /* 连接器 */ if (acceptor1.open(port_to_listen,1)==-1) /* 打开监听端口 */ { cout<<endl<<"first bind port fail"<<endl; system("pause"); return -1; } cout<<endl<<"bind port success"<<endl; /* 打开监听端口成功 */ ACE_Time_Value timeout1(10,0); int i=0; HANDLE hthread; while (1) { if(acceptor1.accept(peer[i])!=-1) /* 连接成功 */ { cout<<endl<<endl<<"client connect"<<endl; hthread=(HANDLE)_beginthreadex(0,0,(unsigned(__stdcall*)(void *))mythread1,(LPVOID)&peer[i],0,0); if(hthread!=NULL) { cout<<"连接成功,创建线程成功"<<endl; i++; } } } return 0; } <strong> </strong>下面是客户端代码
#include "stdafx.h" #include <ace/SOCK_Stream.h> #include <ace/SOCK_Connector.h> #include <ace/INET_Addr.h> #include <ace/Time_Value.h> #include <ace/os.h> #include <string> #include <iostream> using namespace std; #pragma comment(lib,"aced.lib") /************ 客户端程序 **************** * * 不断请求连接,知道成功 * 然后发送数据,并且打印 * 从服务端接收到的程序 * * 客户端应该是两个线程,一个用来处理接收 * 一个用来处理发送 ******************************/ unsigned __stdcall ClientRcv(LPVOID arg) { ACE_SOCK_Stream peer1=*(ACE_SOCK_Stream *)arg; char buffer[1024]; SSIZE_T rcvbytes=0; while(1) { if((rcvbytes=peer1.recv(buffer,sizeof(buffer)))!=-1) //接收到数据 { buffer[rcvbytes]='\0'; string str=buffer; cout<<str<<endl; system("gnome-terminal"); } } } unsigned __stdcall ClientSend(LPVOID arg) { ACE_SOCK_Stream peer1=*(ACE_SOCK_Stream *)arg; char buffer[1024]; SSIZE_T rcvbytes; while(1) { cout<<"请输入一段文字"<<endl; string str; cin>>str; peer1.send(str.c_str(),str.length()); } } int _tmain(int argc, _TCHAR* argv[]) { WSADATA wsaData; if( WSAStartup( MAKEWORD(2,0), &wsaData) != 0) { ACE_OS::printf("start failed"); } ACE_INET_Addr addr(6000,"127.0.0.1"); ACE_SOCK_Connector connector; ACE_Time_Value timeout(5,0); ACE_SOCK_Stream peer; char buffer[1024]; SSIZE_T bytes_received; while(connector.connect(peer,addr,&timeout)!=0) { cout<<"connection failed!"<<endl; } cout<<"connected"<<endl; HANDLE sendhandle=(HANDLE)_beginthreadex(0,0,(unsigned(__stdcall *)(void *))ClientRcv,&peer,0,0); if(sendhandle==0) { cout<<"create sendthread fail"<<endl; } sendhandle=(HANDLE)_beginthreadex(0,0,(unsigned(__stdcall *)(void *))ClientSend,&peer,0,0); if(sendhandle==0) { cout<<"create sendthread fail"<<endl; } while(1); system("pause"); return 0; }