3
\$\begingroup\$

This is my client code:

(My server is very similar at the moment but I will upload it below this one just in case somebody wants to run it)

#include <SFML/Graphics.hpp>
#include <SFML/Network.hpp>
#include <thread>

int main()
{
    sf::RenderWindow main_win(sf::VideoMode(800, 800), "Chatcy!");
    main_win.setPosition(sf::Vector2i(sf::VideoMode::getDesktopMode().width/2 -400, sf::VideoMode::getDesktopMode().height/2 -400));
    main_win.setVerticalSyncEnabled(true);

    //chatcy logo
    sf::Texture chatcy;
    chatcy.loadFromFile("image_chatcy.png");
    sf::Sprite logo;
    logo.setTexture(chatcy); //200x800

    //font
    sf::Font font;
    font.loadFromFile("FreeSerif.ttf");

    //name
    sf::String name("Client");
    name += ": ";

    //text input area and background
    sf::RectangleShape in_background(sf::Vector2f(800, 100));
    in_background.setFillColor(sf::Color::Black);
    in_background.setPosition(0, 700);

    sf::Text inText;
    inText.setFont(font);
    inText.setPosition(0, 700);
    inText.setCharacterSize(24);
    sf::String input(name);
    inText.setString(input);

    //text output area
    sf::Text outText;
    outText.setFont(font);
    outText.setCharacterSize(24);
    outText.setPosition(0, 200);
    sf::String output;

    //networking
    sf::TcpSocket socket;
    sf::Socket::Status status = socket.connect("31.216.109.207", 55552);
    if(status != sf::Socket::Done)
    {
        outText.setString("\nCannot connect to the server!\n");
        return -1;
    }
    else
        outText.setString("\nYou have been connected to the server!\n");

    socket.setBlocking(false);

    //Packet for incoming msg
    sf::Packet in_packet;

    while(main_win.isOpen())
    {
        sf::Event event;
        while(main_win.pollEvent(event))
        {
            switch (event.type)
            {
            case sf::Event::Closed: main_win.close(); break;
            case sf::Event::TextEntered: 
                if(event.text.unicode != '\b' && event.text.unicode != '\n' && event.text.unicode != '\r')
                    input += event.text.unicode;
                inText.setString(input);
                if(inText.findCharacterPos(1000).x >= 780) //1000<msg length so I get the pos of last ch.
                    input += '\n';
                break;
            case sf::Event::KeyPressed: 
                if(sf::Keyboard::isKeyPressed(sf::Keyboard::BackSpace) && input.getSize()>name.getSize()) //2nd par to protect name
                    input.erase(input.getSize()-1);
                if(sf::Keyboard::isKeyPressed(sf::Keyboard::Return))
                {
                    output += '\n' + input;
                    outText.setString(output);
                    //send msg
                    sf::Packet out_packet;
                    out_packet << input;
                    while(socket.send(out_packet) == sf::Socket::Partial)
                        socket.send(out_packet);

                    input.clear();
                    input += name;

                    //autoscroll
                    if(outText.findCharacterPos(outText.getString().getSize()).y >= 680)
                        outText.move(0, -33);

                }
                break;
            case sf::Event::MouseWheelScrolled: 
                //-7 for speed and to go the same way with scroll (-)
                outText.move(0, event.mouseWheelScroll.delta*-7);
                break;

            }
        }

        //read msg
        if(socket.receive(in_packet) == sf::Socket::Done)  
        {   
            sf::String msg;
            in_packet >> msg;
            output += '\n' + msg;
            outText.setString(output);
            //autoscroll
            if(outText.findCharacterPos(outText.getString().getSize()).y >= 680)
                outText.move(0, -33);

        }

        //check if connected
        if(socket.getRemoteAddress() == sf::IpAddress::None)
        {
            output += "\nConnection has been terminated. Goodbye!\n";
            outText.setString(output);
        }

        main_win.clear(sf::Color::Black);
        main_win.draw(outText);
        main_win.draw(in_background);
        main_win.draw(logo);
        main_win.draw(inText);
        main_win.display();
    }
}

I need a way to put this mess in an order. I would like to find an object oriented way to make the client more efficient and then I will use the classes to make an actually server! (I will post another question for the server I guess :P )

Server:

#include <SFML/Graphics.hpp>
#include <SFML/Network.hpp>
#include <SFML/Audio.hpp>
#include <iostream>

int main()
{
    sf::RenderWindow main_win(sf::VideoMode(800, 800), "Chatcy server");
    main_win.setPosition(sf::Vector2i(sf::VideoMode::getDesktopMode().width/2 -400, sf::VideoMode::getDesktopMode().height/2 -400));
    main_win.setVerticalSyncEnabled(true);

    //chatcy logo
    sf::Texture chatcy;
    chatcy.loadFromFile("image_chatcy.png");
    sf::Sprite logo;
    logo.setTexture(chatcy); //200x800

    //font
    sf::Font font;
    font.loadFromFile("FreeSerif.ttf");

    //name
    sf::String name("George");
    name += ": ";

    //text input area and background
    sf::RectangleShape in_background(sf::Vector2f(800, 100));
    in_background.setFillColor(sf::Color::Black);
    in_background.setPosition(0, 700);

    sf::Text inText;
    inText.setFont(font);
    inText.setPosition(0, 700);
    inText.setCharacterSize(24);
    sf::String input(name);
    inText.setString(input);

    //text output area
    sf::Text outText;
    outText.setFont(font);
    outText.setCharacterSize(24);
    outText.setPosition(0, 200);
    sf::String output;

    //networking
    sf::TcpListener listener;
    if(listener.listen(55552) == sf::Socket::Done)
        std::cout << "Server is up and running!\n";

    sf::TcpSocket client;
    listener.accept(client);
    client.setBlocking(false); //after we connect

    //packet to put messages in
    sf::Packet in_packet;

    //sound notification
    sf::SoundBuffer buffer;
    buffer.loadFromFile("bell_magic.wav");
    sf::Sound sound;
    sound.setBuffer(buffer);
    sound.play(); //plays after a client is connected

    outText.setString("\nClient has been connected!\n");

    while(main_win.isOpen())
    {
        sf::Event event;
        while(main_win.pollEvent(event))
        {
            switch (event.type)
            {
            case sf::Event::Closed: main_win.close(); break;
            case sf::Event::TextEntered: 
                if(event.text.unicode != '\b' && event.text.unicode != '\n' && event.text.unicode != '\r')
                    input += event.text.unicode;
                inText.setString(input);
                if(inText.findCharacterPos(1000).x >= 780) //1000<msg length so I get the pos of last ch.
                    input += '\n';
                break;
            case sf::Event::KeyPressed: 
                if(sf::Keyboard::isKeyPressed(sf::Keyboard::BackSpace) && input.getSize()>name.getSize()) //2nd par to protect name
                    input.erase(input.getSize()-1);
                if(sf::Keyboard::isKeyPressed(sf::Keyboard::Return))
                {
                    output += '\n' + input;
                    outText.setString(output);
                    //send msg
                    sf::Packet out_packet;
                    out_packet << input;
                    while(client.send(out_packet) == sf::Socket::Partial)
                        client.send(out_packet);

                    input.clear();
                    input += name;

                    //autoscroll
                    if(outText.findCharacterPos(outText.getString().getSize()).y >= 680)
                        outText.move(0, -33);

                }
                break;
            case sf::Event::MouseWheelScrolled: 
                //-7 for speed and to go the same way with scroll (-)
                outText.move(0, event.mouseWheelScroll.delta*-7);
                break;

            }
        }

        //read msg
        if(client.receive(in_packet) == sf::Socket::Done)  
        {   
            sf::String msg;
            in_packet >> msg;
            output += '\n' + msg;
            outText.setString(output);
            //autoscroll
            if(outText.findCharacterPos(outText.getString().getSize()).y >= 680)
                outText.move(0, -33);
        }

        //check if connected
        if(client.getRemoteAddress() == sf::IpAddress::None)
        {
            output += "\nConnection has been terminated. Goodbye!\n";
            outText.setString(output);
        }

        main_win.clear(sf::Color::Black);
        main_win.draw(outText);
        main_win.draw(in_background);
        main_win.draw(logo);
        main_win.draw(inText);
        main_win.display();
    }
}

You may ignore the sound or put your own if you are going to run it. The image is a cosmetic logo. Also note that background is used so that text behind it is not visible.

\$\endgroup\$
  • 2
    \$\begingroup\$ Have you researched any chat protocols? rfc2812 \$\endgroup\$ – Martin York Jan 17 '18 at 8:15
  • \$\begingroup\$ I wasn't even aware of their existence! :P Time to do some research :D \$\endgroup\$ – alienCY Jan 17 '18 at 15:13

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.