http://www.cnblogs.com/-Lei/archive/2012/09/04/2670964.html
上一篇写了对套接字操作的封装,这一节使用已封装好的Socket类实现服务器与客户端的通信(Socket的定义见上篇Socket.h)
服务器端:
ServerSocket.h
#ifndef SERVERSOCKET_H #define SERVERSOCKET_H#include "Socket.h"class ServerSocket:public Socket {public:ServerSocket(const int port);ServerSocket();virtual ~ServerSocket();void Accept(Socket& socket); };#endif
ServerSocket.cpp
#include "ServerSocket.h" #include "SocketException.h"ServerSocket::ServerSocket(const int port) {if ( ! Socket::Create() ){throw SocketException ( "Could not create server socket." );}if ( ! Socket::Bind ( port ) ){throw SocketException ( "Could not bind to port." );}if ( ! Socket::Listen() ){throw SocketException ( "Could not listen to socket." );} }ServerSocket::~ServerSocket() { }void ServerSocket::Accept(Socket& socket) {if ( ! Socket::Accept ( socket ) ){throw SocketException ( "Could not accept socket." );} }
//============================================================================ // Name : ChatServer.cpp // Author : Lei // Version : // Copyright : // Description : ChatServer in C++, Ansi-style //============================================================================ #include <iostream> #include <string> #include "ServerSocket.h" #include "SocketException.h" using namespace std;int main() {cout<<"Running server..."<<endl;try{ServerSocket server(8080);while(true){Socket newSocket;server.Accept(newSocket);try{string message;server.Receive(newSocket,message);cout<<"Receive message: "<<message<<endl;message="Here is server";server.Send(newSocket,message);}catch(SocketException&){}}}catch(SocketException& ex){cout << "Exception was caught:" << ex.Description() << "\nExiting.\n";}return 0; }
接下来是客户端:
ClientSocket.h
#ifndef CLIENTSOCKET_H #define CLIENTSOCKET_H#include "Socket.h" #include <string>class ClientSocket:public Socket {public:ClientSocket (const std::string& host,const int port );virtual ~ClientSocket();bool Send(const std::string& message) ;int Receive(std::string& message) ; };#endif
ClientSocket.cpp
#include "ClientSocket.h" #include "SocketException.h"ClientSocket::ClientSocket(const std::string& host,const int port) {if(!Socket::Create())throw SocketException("Could not create client socket.");if(!Socket::Connect(host,port))throw SocketException( "Could not connect to port." ); }ClientSocket::~ClientSocket() {}bool ClientSocket::Send(const std::string& message) {return Socket::Send(static_cast<Socket&>(*this),message); }int ClientSocket::Receive(std::string& message) {return Socket::Receive(static_cast<Socket&>(*this),message); }
这里使用了 dynamic_cast来将this指针向下转型,转成指向基类Socket的指针
//============================================================================ // Name : ChatClient.cpp // Author : Lei // Version : // Copyright : // Description : ChatClient in C++, Ansi-style //============================================================================ #include <iostream> #include <string> #include "ClientSocket.h" #include "SocketException.h" using namespace std;int main() {cout<<"Running client...."<<endl;try{ClientSocket clientSocket("127.0.0.1",8080);clientSocket.Send("Hello,here is client");string message;clientSocket.Receive(message);cout<<"Response from server: "<<message<<endl;}catch(SocketException& ex){cout << "Exception was caught:" << ex.Description() << "\n";}return 0; }
结果:
服务器端
客户端