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

上一篇写了对套接字操作的封装,这一节使用已封装好的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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值