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
  • 2
    \$\begingroup\$ Have you researched any chat protocols? rfc2812 \$\endgroup\$ Commented Jan 17, 2018 at 8:15
  • \$\begingroup\$ I wasn't even aware of their existence! :P Time to do some research :D \$\endgroup\$
    – alienCY
    Commented Jan 17, 2018 at 15:13

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Browse other questions tagged or ask your own question.