自己回复把,犯了一个低级错误,这里备注下,避免别人被此帖误导。
抓包看了下,主要客户端没发送数据就直接FIN 关闭TCP链接了。然后自己去看了看Qt自带的loopback示例,参考改了下,不是在connecttohost之后直接write数据,而是连接到client socket的connected后再在slot中发送数据,这样就OK了,想了想,也是有道理,tcp分为好几个阶段,connecttohost只是握手阶段,不能直接connecttohost就发送数据,因为这个时候链路也许还没准备好!
具体见下面的client端代码,可以对比上面的看:
#include "widget.h"
#include "ui_widget.h"
#include "QTcpSocket"
#include <QDebug>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()
{
client = new QTcpSocket(this);
ui->pushButton->setEnabled(false);
client->connectToHost("127.0.0.1", 8080);
connect(client, SIGNAL(connected()), this, SLOT(socket_Conn()));
connect(client, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(printError(QAbstractSocket::SocketError)));}
void Widget::socket_Conn()
{
int len = 0;
len = client->write("hello");
if (-1 == len)
{
qDebug() << "write error!";
}
else
{
qDebug() << "write succ";
}
client->close();
}
void Widget::printError(QAbstractSocket::SocketError err)
{
qDebug() << "occur error!";
qDebug() << err;
}