上一篇写了对套接字操作的封装,这一节使用已封装好的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; }
结果:
服务器端
客户端