网上的资料太过于书面化,所以看起来有的让人云里雾里,看不懂C-tcpsockt和S-tcpsocket的关系
所以我稍微画了一下草图帮助大家理解两个套接字之间的关系。字迹有的飘逸勉强看看
下面是代码
服务端:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//在头文件创建了qtcpserver,在这里将他设定为listen状态
m_server.listen(QHostAddress::Any,8888);
//当有客服端链接的地址跟接口与listen的一致时,m_server会发出信号【*注意】
connect(&m_server,&QTcpServer::newConnection,this,&MainWindow::new_connect);}
void MainWindow::new_connect()
{
QMessageBox::information(this,"connect sation","connect success");//提示收到信号,链接成功
QTcpSocket* s_socket=m_server.nextPendingConnection(); //让服务器端的tcpsocket与客户端的链接(或者说接受链接请求)
//给客户端发送数据
s_socket->write("hello world");//接收客户端的数据
//需要先接收到读取信号后,server才能正常读取数据
connect(s_socket,&QTcpSocket::readyRead,[=]()
{
QString s=s_socket->readAll();
qDebug()<<s;});
【*注意】:严谨来讲,这里应该先connect后再把m_server.listen。先将信号和槽绑定,等到有信号时就会执行槽函数。
客户端:
void MainWindow::on_pushButton_clicked()
{
//寻找输入到ip、port文本编辑框对应的server
socket.connectToHost(ui->IP->text(),ui->PORT->text().toShort());
//给套接字写入数据
socket.write(ui->textEdit->toPlainText().toUtf8());
//若客户端收到数据
connect(&socket,&QTcpSocket::readyRead,[=]()
{
QString msg=socket.readAll() ;
qDebug()<<msg;
});
}