您的位置:首页 > 运维架构 > Linux

Linux socket编程(二) 服务器与客户端的通信

2015-06-23 23:32 429 查看

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;
}


结果:
服务器端



客户端

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: