赞
踩
UDP发送消息实现代码
- #ifndef WIDGET_H
- #define WIDGET_H
-
- #include <QWidget>
- #include <QLabel>
- #include <QPushButton>
- #include <QLineEdit>
- #include <QUdpSocket>
-
- class Widget : public QWidget
- {
- Q_OBJECT
-
- public:
- Widget(QWidget *parent = 0);
- ~Widget();
- private:
- QLabel *label1, *label2, *label3, *label4;
- QLineEdit *edit1, *edit2, *edit3, *edit4;
- QPushButton *btn1, *btn2;
- QUdpSocket *udpsocket;
- private slots:
- void on_clicked1();
- void on_clicked2();
- void dataReceived();
- };
-
- #endif // WIDGET_H
- #include "widget.h"
- #include <QHBoxLayout>
- #include <QMessageBox>
- #include <QList>
-
- Widget::Widget(QWidget *parent)
- : QWidget(parent)
- {
- udpsocket = new QUdpSocket(this);
- setWindowTitle(tr("udp聊天"));
- label1 = new QLabel;
- label1->setText("请输入bind端口号");
- label2 = new QLabel;
- label2->setText("请输入目的IP地址");
- label3 = new QLabel;
- label3->setText("请输入目的端口号");
- label4 = new QLabel;
- label4->setText("请输入发送的消息");
-
- edit1 = new QLineEdit;
- edit2 = new QLineEdit;
- edit3 = new QLineEdit;
- edit4 = new QLineEdit;
-
- btn1 = new QPushButton;
- btn1->setText(tr("bind"));
- btn2 = new QPushButton;
- btn2->setText(tr("发送"));
-
- QGridLayout *layout1 = new QGridLayout(this);
- layout1->addWidget(label1, 0, 0);
- layout1->addWidget(edit1, 0, 1);
- layout1->addWidget(btn1, 1, 0);
- layout1->addWidget(label2, 2, 0);
- layout1->addWidget(edit2, 2, 1);
- layout1->addWidget(label3, 3, 0);
- layout1->addWidget(edit3, 3, 1);
- layout1->addWidget(label4, 4, 0);
- layout1->addWidget(edit4, 4, 1);
- layout1->addWidget(btn2, 5, 0);
-
- connect(btn1, SIGNAL(clicked()), this, SLOT(on_clicked1()));
- connect(btn2, SIGNAL(clicked()), this, SLOT(on_clicked2()));
- connect(udpsocket, SIGNAL(readyRead()), this, SLOT(dataReceived()));
- }
-
- Widget::~Widget()
- {
-
- }
-
-
- void Widget::on_clicked1()
- {
- udpsocket->close();
- udpsocket->bind(edit1->text().toInt());
- }
-
- void Widget::on_clicked2()
- {
- QHostAddress addr;
- addr.setAddress(edit2->text());
- int port = edit3->text().toInt();
- udpsocket->writeDatagram(edit4->text().toUtf8(), addr, port);
- }
-
- void Widget::dataReceived()
- {
- QHostAddress addr;
- char buf[1024];
- while (udpsocket->hasPendingDatagrams())
- {
- memset(buf, 0, sizeof(buf));
- udpsocket->readDatagram(buf, sizeof(buf), &addr);
- QMessageBox::information(this, tr("消息"), tr("来自") + addr.toString() + tr("的消息:\n") + buf);
- }
- }
TCP发送文件实现代码,
客户端代码
- #ifndef DIALOG_H
- #define DIALOG_H
-
- #include <QDialog>
- #include <QLabel>
- #include <QPushButton>
- #include <QLineEdit>
- #include <QTcpServer>
-
- class Dialog : public QDialog
- {
- Q_OBJECT
-
- public:
- Dialog(QWidget *parent = 0);
- ~Dialog();
-
- private:
- QLabel *label1, *label2;
- QLineEdit *edit1, *edit2;
- QPushButton *btn1;
- QTcpSocket *tcpsocket;
-
- QString filename;
-
- private slots:
- void on_clicked1();
- void dataReceived();
- };
-
- #endif // DIALOG_H
- #include "dialog.h"
-
- #include <QGridLayout>
- #include <QFileDialog>
- #include <QTcpSocket>
-
- #define BUFSIZE 262144 // 256K
-
- Dialog::Dialog(QWidget *parent)
- : QDialog(parent)
- {
- tcpsocket = new QTcpSocket(this);
-
- setWindowTitle(tr("tcp文件发送客户端"));
- label1 = new QLabel;
- label1->setText(tr("请输入目的IP地址"));
- label2 = new QLabel;
- label2->setText(tr("请输入目的端口号"));
-
- edit1 = new QLineEdit;
- edit2 = new QLineEdit;
-
- btn1 = new QPushButton;
- btn1->setText(tr("发送文件"));
-
- QGridLayout *layout = new QGridLayout(this);
-
- layout->addWidget(label1, 0, 0);
- layout->addWidget(edit1, 0, 1);
- layout->addWidget(label2, 1, 0);
- layout->addWidget(edit2, 1, 1);
- layout->addWidget(btn1, 2, 0);
-
- connect(btn1, SIGNAL(clicked()), this, SLOT(on_clicked1()));
- connect(tcpsocket, SIGNAL(readyRead()), this, SLOT(dataReceived()));
- }
-
- Dialog::~Dialog()
- {
-
- }
-
- void getfilename(const char *filename, char *name)
- {
- int len = strlen(filename);
- int i;
- for (i = (len - 1); i >= 0; i--)
- {
- if ((filename[i] == '\\') || (filename[i] == '/'))
- {
- break;
- }
- }
- strcpy(name, &filename[i + 1]);
- }
-
- void Dialog::on_clicked1()
- {
- filename = QFileDialog::getOpenFileName(this, tr("打开文件"));
- if (!filename.isEmpty())
- {
- tcpsocket->close();
- QHostAddress serverIP;
- serverIP.setAddress(edit1->text());
- tcpsocket->connectToHost(serverIP, edit2->text().toInt());
-
- char buf[1024];
- memset(buf, 0, sizeof(buf));
-
- getfilename(filename.toStdString().data(), buf);
- tcpsocket->write(buf, strlen(buf));
- }
- }
-
- void Dialog::dataReceived()
- {
- char *buf = (char *)malloc(BUFSIZE);
-
- while (tcpsocket->bytesAvailable() > 0)
- {
- memset(buf, 0, BUFSIZE);
- tcpsocket->read(buf, BUFSIZE);
- }
-
- if (strncmp(buf, "OK", 2) == 0)// 服务端回复统一接受文件
- {
- FILE *fd = fopen(filename.toStdString().data(), "rb");// 只读方式打开
- if (fd)
- {
- while (1)
- {
- memset(buf, 0, BUFSIZE);
- size_t rc = fread(buf, 1, BUFSIZE, fd);//循环读取文件,知道读到文件尾
- if (rc <= 0)
- {
- break;
- }
- else
- {
- tcpsocket->write(buf, rc);
- if (rc <= 0)
- {
- break;
- }
- }
- }
- }
- fclose(fd);
- }
- tcpsocket->close();
- free(buf);
- }
服务器代码参看前边的TCP文件传送博文
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。