#include "widget.h"
#include "ui_widget.h"
#include <QNetworkInterface>
#define MyqDebug() qDebug()<<"文件:"<<__FILE__<<",行号"<<__LINE__<<",函数"<<__FUNCTION__
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
tcpserver=NULL;
//tcpSocket=new QTcpSocket(this);
tcpserver = new QTcpServer(this);//创建监听套接字,指定父对象,让其自动回收空间
tcpserver->listen(QHostAddress::AnyIPv4,8888);//监听的指定ip地址和指定端口号,这里指定地址为任意地址.端口号是一个16位的短整型的数。可取值:1-65535有效,
//用于浏览网页服务的80端口,用于FTP服务的21端口
setWindowTitle("服务器");
//链接成功信号-获取通信套接字,打印链接成功数据
connect(tcpserver,&QTcpServer::newConnection,
[=]()
{
//取出建立好链接的套接字
QTcpSocket *tcpSocket = new QTcpSocket(this);
tcpSocket = tcpserver->nextPendingConnection();//取队列中的下一个链接
TcpSockets_List.append(tcpSocket);//把新进来的客户端存入列表
//获取对方的ip,端口
QString temp = QString("[%1:%2]成功链接").arg(tcpSocket->peerAddress().toString()).arg(tcpSocket->peerPort());
ui->textBrowser_read->append(temp);
//for(int i=0;i<tcpserver->nextPendingConnection()->size();i++){
//qDebug()<<tcpserver->nextPendingConnection()->size();
//}
//connect(tcpSocket, &QTcpSocket::readyRead, this, &Widget::socket_Read_Data);
//收到数据触发readyRead()信号-读取数据。这个connect函数不能放外面,因为tcpSocket是指针,上面取到套接字才不是野指针。
temp="#server#connect success#成功连接到服务器";
tcpSocket->write(temp.toUtf8().data());//发送数据到客户端,连接成功
connect(tcpSocket,&QTcpSocket::readyRead,
[=]()
{
//从通信套接字中取出内容
//多个客户端连接时,这个tcpSocket已经变成最后一个来连接的客户端套接字了,
//所以不能再用这个tcpSocket来读不知道是谁发来的数据。
QByteArray array = tcpSocket->readAll();
//判断是否为创建创建账号
MessageProcess(tcpSocket,array);
});
connect(tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)), //断开连接处理
this, SLOT(MSGError(QAbstractSocket::SocketError)));//建立槽函数,获取错误信息
}
);
ui->label_ip->setText(QString("ip地址:%1").arg(getHostIpAddress()));
ui->label_port->setText("端 口:8888");
mySqlInit();
}
Widget::~Widget()
{
QSqlQuery query;
//删数据
//query.exec("delete from clientInfo"); //删除名为clientInfo的表中的所有数据
//query.exec("delete from student"); //删除名为clientInfo的表中的所有数据
//query.exec("delete from StuInfo"); //删除名为clientInfo的表中的所有数据
//删表
query.exec("DROP TABLE clientInfo"); //删除名为students的表
query.exec("DROP TABLE student"); //删除名为students的表
query.exec("DROP TABLE StuInfo"); //删除名为students的表
db.close();
delete ui;
}
//获取本地ip地址
QString Widget::getHostIpAddress()
{
QString strIpAddress;
QList<QHostAddress> ipAddressesList = QNetworkInterface::allAddresses();
// 获取第一个本主机的IPv4地址
int nListSize = ipAddressesList.size();
for (int i = 0; i < nListSize; ++i)
{
if (ipAddressesList.at(i) != QHostAddress::LocalHost && //at(i)比[i]执行更快
ipAddressesList.at(i).toIPv4Address()) {
strIpAddress = ipAddressesList.at(i).toString();
break;
}
}
// 如果没有找到,则以本地IP地址为IP
if (strIpAddress.isEmpty())
strIpAddress = QHostAddress(QHostAddress::LocalHost).toString();
return strIpAddress;
}
//数据库初始化 //参考原文:https://www.cnblogs.com/lifexy/p/10921958.html
//https://blog.csdn.net/weixin_44261839/article/details/109718844
//https://blog.csdn.net/qinpanke/article/details/51038739
/*
QString create_sql = "create table student (id int primary key, name varchar(30), age int)";
QString select_max_sql = "select max(id) from student";
QString insert_sql = "insert into student values (?, ?, ?)";
QString update_sql = "update student set name = :name where id = :id";
QString select_sql = "select id, name from student";
QString select_all_sql = "select * from student";
QString delete_sql = "delete from student where id = ?";
QString clear_sql = "delete from student";
//删除数据库
QFile::remove("database.db");
"show tables";//显示所有表
https://www.cnblogs.com/gaidy/p/9019376.html
-- auto_increment :自动增长
-- not null :表示不为空
-- primary key :表示主键
-- default :默认值
-- 插入一条数据到students表中
insert into students values(0, "mike", 18, 145,"保密",2)
-- 修改表
-- 修改全部年龄
update students set age= 30;
-- 修改指定id的年龄
update students set age=28 where id=1;
-- 定条件查询
select * from students where id=2;
select * from students where id>=1 and id<=3;
--查询指定的列
select id, name from students where id>=1 and id<=3;
select name, id from students where id>=1 and id<=3;
*/
void Widget::mySqlInit()
{
#if 0
//sqlite3数据库
db = QSqlDatabase::addDatabase("QSQLITE");//QMYSQL:驱动类型名
db.setDatabaseName("..\\TalkingServer2\\test.db");//永久的数据库,且必须要加.db
#else
//mysql数据库
db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("localhost");//db.setHostName("127.0.0.1");
db.setPort(3306);
db.setDatabaseName("mydatabase");//("数据库名");
db.setUserName("root");//("用户名");
db.setPassword("1111qqqq");//("密码");
#endif
if(!db.open()){ //如果不存在则创建
QMessageBox::warning(this,"错误",db.lastError().text());
}else{
//创建表格
QSqlQuery query;
//QString str = "create table student(id int primary key,name varchar)";
//mysql数据库的varchar字符型必须指定字节大小,否则执行语句失败,sqlite3数据库则不指定也行
//QString str = "create table clientInfo(id int,userName varchar,userPassword varchar,ip varchar,port int);";
QString str = "create table clientInfo(id int,userName varchar(8),userPassword varchar(8),ip varchar(17),port int);";
if(!query.exec(str))//若表已存在,则创建失败
{
qDebug()<<"1.sql语句执行失败,表已存在:"<<query.lastError().text();
}
}
//db.close();
clientCount=0;//客户端上线数初始化为0
}
QString Widget::FindOtherUserDatabase(int id)
{
QString retstr="other user#";
QSqlQuery query;//创建表格
//查询
query.exec("select * from clientInfo;");//查找表名为clientInfo的表的信息
while(query.next())
{
qDebug()<<"查询"<<query.value(0).toInt()<<query.value(1).toString();
if(query.value(0)!=id){
retstr += query.value(0).toString()+"#";
自古套路得人心@
- 粉丝: 4
- 资源: 8
最新资源
- 基于Django和HTML的新疆地区水稻产量影响因素可视化分析系统(含数据集)
- windows conan2应用构建模板
- 3_base.apk.1
- 基于STM32F103C8T6的4g模块(air724ug)
- 基于Java技术的ASC学业支持中心并行项目开发设计源码
- 基于Java和微信支付的wxmall开源卖票商城设计源码
- 基于Java和前端技术的东软环保公众监督系统设计源码
- 基于Python、HTML、CSS的crawlerdemo软件工程实训爬虫设计源码
- 基于多智能体深度强化学习的边缘协同任务卸载方法设计源码
- 基于BS架构的Java、Vue、JavaScript、CSS、HTML整合的毕业设计源码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论2