首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > QT开发 >

TCP的一个例子但通信不成功,该怎么处理

2012-05-30 
TCP的一个例子但通信不成功client.cpp#include widget.h#include ui_widget.hWidget::Widget(QWidget

TCP的一个例子但通信不成功
client.cpp
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
  QWidget(parent),
  ui(new Ui::Widget)
{
  ui->setupUi(this);
  tcpSocket = new QTcpSocket(this);
  connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readMessage()));
  connect(tcpSocket,SIGNAL(error(QAbstractSocket::SocketError)),
  this,SLOT(displayError(QAbstractSocket::SocketError)));
  connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(on_pushButton_clicked()));

}

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

void Widget::newConnect()
{
  blockSize = 0; //初始化其为0

  tcpSocket->abort(); //取消已有的连接

  /* tcpSocket->connectToHost(ui->hostLineEdit->text(),

  ui->portLineEdit->text().toInt());*/

  tcpSocket->connectToHost("192.168.1.24",6666);
  //连接到主机,这里从界面获取主机地址和端口号

}

void Widget::readMessage()

{

  QDataStream in(tcpSocket);

  in.setVersion(QDataStream::Qt_4_7);

  //设置数据流版本,这里要和服务器端相同

  if(blockSize==0) //如果是刚开始接收数据

  {

  //判断接收的数据是否有两字节,也就是文件的大小信息

  //如果有则保存到blockSize变量中,没有则返回,继续接收数据

  if(tcpSocket->bytesAvailable() < (int)sizeof(quint16)) return;

  in >> blockSize;

  }

  if(tcpSocket->bytesAvailable() < blockSize) return;

  //如果没有得到全部的数据,则返回,继续接收数据

  in >> message;

  //将接收到的数据存放到变量中

  ui->messageLabel->setText(message);

  //显示接收到的数据

}

void Widget::displayError(QAbstractSocket::SocketError)

{

  qDebug() << tcpSocket->errorString(); //输出错误信息

}
void Widget::on_pushButton_clicked() //连接按钮

{

  newConnect(); //请求连接

}




server.cpp
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
  QWidget(parent),
  ui(new Ui::Widget)
{
  ui->setupUi(this);
  tcpServer = new QTcpServer(this);

  if(!tcpServer->listen(QHostAddress::LocalHost,6666))

  { //监听本地主机的6666端口,如果出错就输出错误信息,并关闭

  qDebug() << tcpServer->errorString();

  close();

  }
  connect(tcpServer,SIGNAL(newConnection()),this,SLOT(sendMessage()));

}

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

void Widget::sendMessage()

{

  QByteArray block; //用于暂存我们要发送的数据

  QDataStream out(&block,QIODevice::WriteOnly);

  //使用数据流写入数据

  out.setVersion(QDataStream::Qt_4_7);

  //设置数据流的版本,客户端和服务器端使用的版本要相同

  out<<(quint16) 0;

  out<<tr("hello Tcp!!!");

  out.device()->seek(0);

  out<<(quint16)(block.size()-sizeof(quint16));

  QTcpSocket *clientConnection = tcpServer->nextPendingConnection();

  //我们获取已经建立的连接的子套接字

  connect(clientConnection,SIGNAL(disconnected()),clientConnection,

  SLOT(deleteLater()));

  clientConnection->write(block);

  clientConnection->disconnectFromHost();

  ui->statusLabel->setText("send message successful!!!");



  //发送数据成功后,显示提示

}

但结果显示"Connection refused" 这是为什么 各位大侠帮帮忙

[解决办法]
我还没有做过QT的网络,不过建议你可以参考下QTcreator提供的例子,或者直接在上面修改:


例子在:QtSDK/Examples/4.7/network下面,找找看,应该有你需要的!
[解决办法]
你的代码是没问题的,出现“Connection refused”error String,是因为已有连接建立,不能重复连接。。。。。

热点排行