서버 기능 :
클라이언트로부터 데이터를 받고 받은 데이터를 서버 리스트뷰에 올려주는 거밖에 못해
//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