2021 시작

 

서버 기능 : 

클라이언트로부터 데이터를 받고 받은 데이터를 서버 리스트뷰에 올려주는 거밖에 못해

//widget.cpp

#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{

    //GUI 부분
    setFixedSize(500,700);

    list_model = QSharedPointer<QStringListModel>
            (new QStringListModel(this));

    list_view = QSharedPointer<QListView>
            (new QListView);

    list_view->setModel(list_model.get());

    layout = QSharedPointer<QVBoxLayout>
            (new QVBoxLayout(this));
    layout->addWidget(list_view.get());

    setLayout(layout.get());

    //////////////////Network 부분


    tcp_server = QSharedPointer<QTcpServer>
            (new QTcpServer(this));

    if(!tcp_server->listen(QHostAddress::Any,server_port))
    {
        qDebug()<<QString("listen error : %1\r\n")
                  .arg(tcp_server->errorString());
    }

    connect(tcp_server.get(),SIGNAL(newConnection()),
            this,SLOT(newconnection()));

}


//새로운 연결이 들어오면
void Widget::newconnection()
{
    QTcpSocket* tcp_socket = tcp_server->nextPendingConnection();


    //메모리 누수누수누수누수누수
    MyThread* my_thread = new MyThread(tcp_socket,mutex,condition,list_model);

    my_thread_list.insert(my_thread);


    //연결 끊기면 핸들 삭제
    connect(tcp_socket,&QTcpSocket::disconnected,
            this,[&]{

        my_thread_list.remove(my_thread);

    });




    //데이터 들어오면 recvMessage에 연결
    connect(tcp_socket,&QTcpSocket::readyRead,
            my_thread,&MyThread::recvMessage);


}


Widget::~Widget()
{
}

 

//my_thread.h

#ifndef MY_THREAD_H
#define MY_THREAD_H
#include <QThread>
#include <QMutex>
#include <QWaitCondition>
#include <QTcpSocket>
#include <QDebug>
#include <QStringListModel>
#include <QListView>
#include <QStringList>
#include <QMutexLocker>
#include <QSet>
///////글로벌
///


    static QStringList str_list;


class MyThread : public QThread
{
private:
    QTcpSocket* tcp_socket;
    QSharedPointer<QMutex>mutex;
    QSharedPointer<QWaitCondition>condition;
    QSharedPointer<QStringListModel>list_model;

    //Widget::newConnected에서 생성된 해당 객체가 자연 삭제가 되는것을 막기 위해 자기참조함
    //안하면 메모리 누수남 ㅠㅠㅠㅠ
    //주의?
    //QSharedPointer<MyThread>_this = QSharedPointer<MyThread>(this);//메모리 누수 위험 모르겠어ㅠㅠ



    ////Thread정의
    void run() override
    {
        QMutexLocker(mutex.get());

        QByteArray str= tcp_socket->readAll();
        str_list<<str;

        list_model->setStringList(str_list);

    }



public:
    MyThread(QTcpSocket* tcp_socket,
             QSharedPointer<QMutex>mutex,
             QSharedPointer<QWaitCondition>condition,
             QSharedPointer<QStringListModel>list_model
             );
    ~MyThread(){qDebug()<<"delete MyThread";}

public slots:
    void recvMessage();
};


#endif // MY_THREAD_H
//my_thread.cpp

#include "my_thread.h"

MyThread::MyThread(QTcpSocket* tcp_socket,
                   QSharedPointer<QMutex>mutex,
                   QSharedPointer<QWaitCondition>condition,
                    QSharedPointer<QStringListModel>list_model
                   )
    :tcp_socket(tcp_socket),
      mutex(mutex),
      condition(condition),
      list_model(list_model)
{}

//클라이언트로 부터 데이터를 받으면
void MyThread::recvMessage()
{
    this->start();

}

 

 

이게 어제 만든 프로그램인데 앜ㅋㅋㅋ 내가 만들어봤지만 진짜 개차반으로 만들었더라 그냥 ㄹㅇㅋㅋ만쳐야지 

sender()라는 함수가 있는지도 몰랐어! 한 번 찾아보니까 엄청 편리한 함수더라고 그래서 오늘 다시 한번 만들어 보려고 해

그래도 동작은 하더라 

tcp_server_1 (2).zip
0.01MB

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading