上一篇写了对套接字操作的封装,这一节使用已封装好的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;
}
结果:
服务器端
客户端
原文链接: https://www.cnblogs.com/-Lei/archive/2012/09/04/2670964.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/61819
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!