服务器
server.h
class Server : public QMainWindow
{
Q_OBJECT
public:
Server(QWidget *parent = 0, Qt::WFlags flags = 0);
~Server();
public:
Ui::ServerClass ui;
protected:
TcpServer tcpServer;
private slots:
void doRecv();
void doStart();
public:
QString* recv;
};
server.cpp
Server::Server(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui.setupUi(this);
recv=new QString;
}
Server::~Server()
{
delete recv;
}
void Server::doRecv()
{
const QString str=*recv;
ui.recvEdit->setText(str);
}
void Server::doStart()
{
//监听
while (!tcpServer.isListening() && !tcpServer.listen(QHostAddress::Any, 6000))
{
QMessageBox::StandardButton ret = QMessageBox::critical(this,
QString::fromLocal8Bit("回环"),
QString::fromLocal8Bit("无法开始测试: %1.").arg(tcpServer.errorString()),
QMessageBox::Retry| QMessageBox::Cancel);
if (ret == QMessageBox::Cancel)
return;
}
}
tcpserver.h
class TcpServer:public QTcpServer
{
Q_OBJECT//不能少啊,否则没有slots,没有moc!!!
public:
TcpServer();
~TcpServer();
private slots:
void recvData();
protected:
void incomingConnection(int socketDescription);
protected:
QTcpSocket* m_socket;
};
tcpserver.cpp
#include "server.h"
TcpServer::TcpServer()
{
}
TcpServer::~TcpServer()
{
}
void TcpServer::recvData()
{
Server ser;
QByteArray inBlock=m_socket->readAll();
*(ser.recv)=QVariant(inBlock).toString();
}
void TcpServer::incomingConnection(int socketDescription)
{
m_socket=new QTcpSocket;
if (!m_socket->setSocketDescriptor(socketDescription)) //将两个套接字关联起来。
{
return;
}
m_socket->waitForReadyRead();
connect(m_socket,SIGNAL(readyRead()),this,SLOT(recvData()));
}
客户端
client.h
class Client : public QMainWindow
{
Q_OBJECTpublic:
Client(QWidget *parent = 0, Qt::WFlags flags = 0);
~Client();
private:
Ui::ClientClass ui;
private slots:
int doHostConnection();
void doSend();
public:
QTcpSocket *m_socket;
QString send;
};
client.cpp
Client::Client(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui.setupUi(this);
}Client::~Client()
{}int Client::doHostConnection()
{
m_socket=new QTcpSocket;
m_socket->connectToHost("127.0.0.1",6000);//连接成功后,会给m_socket分配一个socket描述符,
//并把它传给服务器incomingconnection()。
QAbstractSocket::SocketState _connect_stat = m_socket->state();
if (_connect_stat==QAbstractSocket::ConnectingState)
{
ui.status->setText(QString::fromLocal8Bit("成功"));
return 0;
}
else
{
ui.status->setText(QString::fromLocal8Bit("失败"));
return 0;
}
}
void Client::doSend()
{
send=ui.sendEdit->toPlainText();
m_socket->write(send.toStdString().c_str());
m_socket->waitForBytesWritten();
}
tcpserver.cpp中巢函数recvData()没有被调用,而readyread()已触发,不知道什么原因,请大牛指示一下