-
Notifications
You must be signed in to change notification settings - Fork 0
/
brain_stroke_server.cpp
82 lines (78 loc) · 2.79 KB
/
brain_stroke_server.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include "brain_stroke_server.h"
#include <string>
#include <iostream>
#include <QtCore>
#include "QsLog.h"
#include "QsLogDest.h"
#include "calculate_method.h"
#include "contable.h"
#include "config.h"
#include "tcp_deal.h"
#include <QTcpServer>
#include <QHostAddress>
#include <QMutexLocker>
brain_stroke_server::brain_stroke_server(QObject *parent) :
QObject(parent){
connect(&server, SIGNAL(newConnection()), this,SLOT(accept_new_connection()));
server.listen(QHostAddress::Any, 8888);
calculate_flag = false;
puts("listen");
}
void brain_stroke_server::accept_new_connection(){
QTcpSocket * client = server.nextPendingConnection();
std::cout << "accept new" << client->peerAddress().toString().toStdString() << std::endl;
QLOG_DEBUG() << "accept" << client << " " << QThread::currentThread();
//use a deque to block request: one by one
calculate_flag_mutex.lock();
if(!calculate_flag){
calculate_flag = true;
calculate_flag_mutex.unlock();
tcp_deal * tcp_deal_thread = new tcp_deal();
tcp_deal_thread -> set_socket(client);
connect(tcp_deal_thread, SIGNAL(finished()), this, SLOT(deal_next_request()));
connect(tcp_deal_thread, SIGNAL(finished()), tcp_deal_thread, SLOT(deleteLater()));
tcp_deal_thread -> start();
return;
}
else{
//push to request_list
puts("push to request_list");
QMutexLocker deque_mutex_locker(&deque_mutex);
request_list.push_back(client);
}
calculate_flag_mutex.unlock();
}
brain_stroke_server::~brain_stroke_server(){
server.close();
}
void brain_stroke_server::deal_next_request(){
puts("deal next");
//get next request
deque_mutex.lock();
if(request_list.size() != 0){
puts("has next");
QTcpSocket * client = request_list.front();
request_list.pop_front();
deque_mutex.unlock();
//ignore closing socket
if(client->state() == QTcpSocket::UnconnectedState || client->state() == QTcpSocket::ClosingState){
client->close();
QLOG_DEBUG() << "close client" << client;
std::cout << "close client:" << client->peerAddress().toString().toStdString() << std::endl;
//search next from request_list
deal_next_request();
return;
}
tcp_deal * tcp_deal_thread = new tcp_deal();
tcp_deal_thread -> set_socket(client);
connect(tcp_deal_thread, SIGNAL(finished()), this, SLOT(deal_next_request()));
connect(tcp_deal_thread, SIGNAL(finished()), tcp_deal_thread, SLOT(deleteLater()));
tcp_deal_thread -> start();
return;
}
deque_mutex.unlock();
QMutexLocker calculate_flag_mutex_locker(&calculate_flag_mutex);
//no calculating now
calculate_flag = false;
return;
}