用QTcpSocket做客户端用来测试TCP,但不能接收数据,求指教!

ccp668 2012-10-27 12:08:07
#include <QMessageBox>
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
this->setFixedSize( this->width (),this->height ()); //固定窗口大小
TcpSocket = new QTcpSocket(this);
connect(ui->ConnectBtn,SIGNAL(clicked()),this,SLOT(Connect()));
connect(ui->StopBtn,SIGNAL(clicked()),this,SLOT(Stop()));
connect(ui->ClearReceiveBtn,SIGNAL(clicked()),this,SLOT(ClearReceive()));
connect(ui->ClearSendBtn,SIGNAL(clicked()),this,SLOT(ClearSend()));
connect(ui->SendBtn,SIGNAL(clicked()),this,SLOT(Send()));
connect(TcpSocket,SIGNAL(readyRead()),this,SLOT(ReadMessage()));
connect(TcpSocket,SIGNAL(error(QAbstractSocket::SocketError)),
this,SLOT(displayError(QAbstractSocket::SocketError)));
}

Widget::~Widget()
{
delete ui;
}


void Widget::displayError(QAbstractSocket::SocketError)
{
qDebug() << TcpSocket->errorString(); //输出错误信息
}

void Widget::ReadMessage()
{
qDebug("Read");
if(TcpSocket->waitForConnected(30000)){
QString Msg;
QByteArray qba = TcpSocket->readAll();
Msg=QVariant(qba).toString();
ui->Receive_textBrowser->append(Msg);}
}

void Widget::Connect()
{
// BlockSize = 0; //初始化其为0
TcpSocket->abort(); //取消已有的连接
TcpSocket->connectToHost(ui->Remote_IP_lineEdit->text(),
ui->Remote_Port_lineEdit->text().toInt());
ui->ConnectBtn->setEnabled(false);
ui->StopBtn->setEnabled(true);
}

void Widget::Stop()
{
TcpSocket->close();
qDebug("socket break");
ui->StopBtn->setEnabled(false);
ui->ConnectBtn->setEnabled(true);
}

void Widget::Send()
{
qDebug("send message");
int length = 0;
QString Msg= ui->SendMsg_lineEdit->text();
if((length = TcpSocket->write(Msg.toStdString().c_str(),strlen(Msg.toStdString().c_str()))) != Msg.length())
{
qDebug("send fail");
}
qDebug("%d", length);
qDebug()<< Msg;
}

void Widget::ClearSend()
{
ui->SendMsg_lineEdit->setText ("");
}

void Widget::ClearReceive()
{
ui->Receive_textBrowser->setText("");
}

...全文
771 24 打赏 收藏 举报
写回复
24 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
三元中悦 2014-09-11
  • 打赏
  • 举报
回复
楼主问题解决了吗? 我也遇到了一些问题,就是能发送出去,但是服务器返回的数据我接收不到,不知道是为什么
xiachm 2012-10-29
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]

我想问下,我这个代码有没问题? 我也是参考网上的。
另外我改成了QByteArray,还是不能够接收服务端的信息。
不能进入到ReadMessage函数
[/Quote]
我没看出啥问题

我的建议是,你自己用QTcpServer做一个简单的服务器端程序,配合你这个客户端进行一次测试。如果你写的服务器程序能够和你的客户端通讯,那说明,你的客户端程序是正确的。问题一定是出在传输的内容上,或是服务器那边。

服务器程序也就二三十行代码,为什么不试试呢?
ccp668 2012-10-29
  • 打赏
  • 举报
回复
我想问下,我这个代码有没问题? 我也是参考网上的。
另外我改成了QByteArray,还是不能够接收服务端的信息。
不能进入到ReadMessage函数
xiachm 2012-10-29
  • 打赏
  • 举报
回复
唉……楼主啊……

你发送的仍然是字符串呀!这是一个很基础的问题,比如你的数据包00 00 00 00 00 06 01 03 00 1B 00 02

你按二进制形式发送,“00” = 0x00,只占一个字节。而用字符串发送“00” = 0x30 0x30,这是俩字节呀!

你说的网上的测试工具,它发的是二进制数据,和你的不一样。

先把QByteArray这个类看一下,帮助里面已经很明确的告诉你怎么用了

QByteArray ba;
ba.resize(5);
ba[0] = 0x3c;
ba[1] = 0xb8;
ba[2] = 0x64;
ba[3] = 0x18;
ba[4] = 0xca;

ccp668 2012-10-29
  • 打赏
  • 举报
回复
别人的客户端是用C++ 或者 C#做的,会不会跟这个也有关系?两者的数据类型有差异
ccp668 2012-10-29
  • 打赏
  • 举报
回复
我用网上的TCP测试工具,输入的内容和Qt做的客户端里的输入的内容是一样的,用TCP测试工具是可以读取服务端的数据的。
我修改了用16进制的格式发送和接收,情况还是一样,不能进入ReadMessage函数。
void Widget::Send()//发送数据
{
qDebug("send message");
int length = 0;
QString Msg= ui->SendMsg_lineEdit->text();
if((length = TcpSocket->write(Msg.toAscii())) != Msg.length())
{
qDebug("send fail");
}
qDebug("%d", length);
qDebug()<< Msg.toAscii();
}

void Widget::ReadMessage()
{
qDebug("Read");
int iBytesAvailable = TcpSocket->bytesAvailable();
while(iBytesAvailable > 0)
{
if(TcpSocket->isValid())
{
QByteArray temp = TcpSocket->readAll();
QString ss=QVariant(temp).toString();
ui->Receive_textBrowser->setText(ss);;
}
}
}
xiachm 2012-10-29
  • 打赏
  • 举报
回复
我可以肯定的说,用你贴出的代码是没有问题的。我帮你整了一个服务器端的测试程序:

#ifndef CSERVER_H
#define CSERVER_H

#include <QtNetwork>

class CServer : public QTcpServer
{
Q_OBJECT

public slots:
void start()
{
listen(QHostAddress::Any, 20000);
}

protected:
void incomingConnection(int socketDescriptor)
{
QTcpSocket socket;

if (socket.setSocketDescriptor(socketDescriptor))
{
qDebug() << "connected.";
}

if (socket.waitForReadyRead())
{
qDebug() << socket.readAll();
}

socket.write("hello");

if (socket.state() == QAbstractSocket::ConnectedState)
{
socket.waitForDisconnected();
}

qDebug() << "disconnected.";
}
};

#endif // CSERVER_H

用这个和你的客户端进行通讯,没有任何问题。
ccp668 2012-10-29
  • 打赏
  • 举报
回复
报这样的错:C:\tcp_socket-build-desktop\debug\tcp_socket.exe exited with code -805306369
ccp668 2012-10-29
  • 打赏
  • 举报
回复
我试了下,客户端能发给服务端,服务端不能发给客户端,而且客户端的程序会死机,我也用网上的测试工具测试了,也一样
xiachm 2012-10-28
  • 打赏
  • 举报
回复
QByteArray
ccp668 2012-10-27
  • 打赏
  • 举报
回复
#-------------------------------------------------
#
# Project created by QtCreator 2012-10-26T12:48:04
#
#-------------------------------------------------

QT += network

TARGET = tcp_socket
TEMPLATE = app


SOURCES += main.cpp\
widget.cpp

HEADERS += widget.h

FORMS += widget.ui
ccp668 2012-10-27
  • 打赏
  • 举报
回复
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QString>
#include <QtNetwork/QTcpSocket>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
Q_OBJECT

public:
explicit Widget(QWidget *parent = 0);
~Widget();

private:
Ui::Widget *ui;
QTcpSocket *TcpSocket;
// quint16 BlockSize;

private slots:
void ReadMessage();
void displayError(QAbstractSocket::SocketError);
void Stop();
void ClearReceive();
void ClearSend();
void Send();
void Connect();
};

#endif // WIDGET_H
  • 打赏
  • 举报
回复
你可以先看一下Qt自带的TCP示例代码
ccp668 2012-10-27
  • 打赏
  • 举报
回复
Qt的函数只能发送char * 和 QByteArray 这两种类型啊 。
ccp668 2012-10-27
  • 打赏
  • 举报
回复
那改如何去转换?谢谢!
xiachm 2012-10-27
  • 打赏
  • 举报
回复
仔细看了一遍你的报文协议和你的Send函数,貌似你发送的是字符串,而不是二进制数据。

00 00 00 00 00 06 01 03 00 1B 00 02

这串文字是个字符串而已,它完全不是服务器想要的内容!!!!
xiachm 2012-10-27
  • 打赏
  • 举报
回复
对于新手来说,解决这个问题不能着急,因为你对Qt还不怎么了解,你不太好判断问题是出在报文上还是QTcpSocket的使用上,或者说是服务器端出了问题。

我的建议是,你自己用QTcpServer做一个简单的服务器端程序,配合你这个客户端进行一次测试。如果你写的服务器程序能够和你的客户端通讯,那说明,你的客户端程序是正确的。问题一定是出在传输的内容上,或是服务器那边。
ccp668 2012-10-27
  • 打赏
  • 举报
回复
报文协议是这样的:
事务处理标识: 2字节
协议标识: 2字节(0标识MODBUS协议)
后面字节数: 2字节
单元标识,即从设备地址1字节:内容为0-0xff
功能码: 1字节,内容为3
起始寄存器地址: 2字节,高字节在前
寄存器个数: 2字节,高字节在前(1-0x7D)
ccp668 2012-10-27
  • 打赏
  • 举报
回复
我是想用Qt做个网上的TCP测试的工具。服务端在智能数字量采集联网设备里,因为提供的资料比较少,只有产品介绍文档,里面有说设备作为服务端时,应该用到的报文协议,

运行后输入要发送的数据后,点击发送,出现一下信息:
Starting C:\tcp_socket-build-desktop\debug\tcp_socket.exe...
send message //发送数据
35 //数据大小
"00 00 00 00 00 06 01 03 00 1B 00 02" //发送的内容

不能进入ReadMessage函数,我取过 connect(TcpSocket,SIGNAL(readyRead()),this,SLOT(ReadMessage())) 的值是true.
xiachm 2012-10-27
  • 打赏
  • 举报
回复
你提供的信息太少了,这样问问题很难得到准确答复。“还是不行”,怎么不行了?停在哪里了?什么现象?服务器是否是先接到一个请求,然后再发送应答?服务器端也是用Qt开发的吗?有没有办法能把服务器端收到的数据打出来看看?

ReadMessage函数是没有被调用?还是调用了但结果不对?
加载更多回复(4)
相关推荐
发帖
Qt

1.5w+

社区成员

Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
帖子事件
创建了帖子
2012-10-27 12:08
社区公告
暂无公告