使用QUdpSocket实现简单的聊天程序中碰到的问题

我想要实现一个简易的聊天程序,用UDP实现。
下面是源码:

界面:textEdit_record是显示聊天记录的区域,textEdit_send是消息输入框,pushButton_send是发送按钮,pushButton_close是关闭按钮。

//****************
// myqq.h
//****************
#ifndef MYQQ_H
#define MYQQ_H

#include
#include

namespace Ui {
  class MyQQ;
}

class MyQQ : public QMainWindow {
  Q_OBJECT
public:
  MyQQ(QWidget *parent = 0);
  ~MyQQ();

protected:
  void changeEvent(QEvent *e);

private:
  Ui::MyQQ *ui;
  QUdpSocket udpSocket;
// QUdpSocket udp_receive;

private slots:
  void on_pushButton_close_clicked();
  void on_pushButton_send_clicked();
  void receiveDataGram();
};

#endif // MYQQ_H

//*******************
// myqq.cpp
//*******************
#include "myqq.h"
#include "ui_myqq.h"
#include

MyQQ::MyQQ(QWidget *parent) :
  QMainWindow(parent),
  ui(new Ui::MyQQ)
{
  ui->setupUi(this);
  udpSocket.bind(5824);
  connect(&udpSocket, SIGNAL(readyRead()), this, SLOT(receiveDataGram()));
}

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

void MyQQ::changeEvent(QEvent *e)
{
  QMainWindow::changeEvent(e);
  switch (e->type()) {
  case QEvent::LanguageChange:
  ui->retranslateUi(this);
  break;
  default:
  break;
  }
}

void MyQQ::on_pushButton_send_clicked()
{
  QByteArray datagram;
  QDataStream out(&datagram, QIODevice::WriteOnly);
  out.setVersion(QDataStream::Qt_4_6);
  out << ui->textEdit_send->toPlainText();
// ui->textEdit_record->append(ui->textEdit_send->toPlainText());
  ui->textEdit_send->clear();
  udpSocket.writeDatagram(datagram, QHostAddress::LocalHost, 5824);
}

void MyQQ::receiveDataGram()
{
  QByteArray datagram;
  do{
  datagram.resize(udpSocket.pendingDatagramSize());
  udpSocket.readDatagram(datagram.data(), datagram.size());
  }while(udpSocket.hasPendingDatagrams());

  QString text_rcv;
  QDataStream in(&datagram, QIODevice::ReadOnly);
  in >> text_rcv;

  ui->textEdit_record->append(" server : " + text_rcv);
}

void MyQQ::on_pushButton_close_clicked()
{
  close();
}

问题:运行两次该程序,按照打开的顺序依次叫A和B(A先打开)。运行发现在A中发送消息给B时A的消息记录框显示发送的消息,B的消息记录框中不显示;在 B中发送给A时也是只有A的消息记录框显示信息,B自己的不显示。
调试发现:在A中发送消息给B时(即在执行完A的 udpSocket.writeDatagram(datagram, QHostAddress::LocalHost, 5824);这句以后,程序时跑到了A程序的receiveDataGram(),而不是B程序的receiveDataGram();在B中发送给A时是正常的,也就是执行完B的udpSocket.writeDatagram(datagram, QHostAddress::LocalHost, 5824);这句以后,跳到A的receiveDataGram()处执行。
请问这是什么原因,是不是跟线程有关?怎么解决之?

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22893636/viewspace-662992/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/22893636/viewspace-662992/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值