1。  如图客户端连接server后,server发送“hello tcp“ 给客户端

2. 实例代码

-----------------------------------  server端 -----------------------------------------

修改工程文件.pro, QT += network, 添加net模块

widget.h

#ifndef WIDGET_H
#define WIDGET_H #include <QWidget>
#include <QtNetwork> namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private:
Ui::Widget *ui;
QTcpServer *tcpServer;
public slots:
void sendMessages();
}; #endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QtGui> Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this); tcpServer = new QTcpServer(this);
if( !tcpServer->listen(QHostAddress::LocalHost, 13888) )
{ //监听本地主机的13888端口,如果出错就输出错误信息,并关闭
qDebug() << tcpServer->errorString();
close();
}
//连接信号和相应槽函数
connect(tcpServer, SIGNAL(newConnection()), this, SLOT(sendMessages()));
} Widget::~Widget()
{
delete ui;
} void Widget::sendMessages()
{
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->disconnectFromHost();它表示当发送完成时就会断开连接,
*这时就会发出disconnected()信号,
*而最后调用deleteLater()函数保证在关闭连接后删除该套接字clientConnection。
*/
clientConnection->write(block);
clientConnection->disconnectFromHost();
ui->statusLabel->setText("Send message successfil");
}

---------------------------------------- Client 端 ----------------------------------

clientwidget.h

#ifndef CLIENTWIDGET_H
#define CLIENTWIDGET_H #include <QWidget>
#include <QtNetwork>
#include <QtGui> namespace Ui {
class clientWidget;
} class clientWidget : public QWidget
{
Q_OBJECT public:
explicit clientWidget(QWidget *parent = 0);
~clientWidget(); private slots:
void newConnect(); //连接服务器
void readMessage(); //接收数据
void displayError(QAbstractSocket::SocketError); //显示错误 private:
Ui::clientWidget *ui;
QTcpSocket *tcpSocket;
QString message; //存放从服务器接收到的字符串
quint16 blockSize; //存放文件的大小信息
}; #endif // CLIENTWIDGET_H

clientwidget.cpp

#include "clientwidget.h"
#include "ui_clientwidget.h"
#include <QtDebug> clientWidget::clientWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::clientWidget)
{
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)));
/*这里关联了tcpSocket的两个信号,
*当有数据到来时发出readyRead()信号,我们执行读取数据的readMessage()函数。
*当出现错误时发出error()信号,我们执行displayError()槽函数。
*/
connect(ui->linkButton, SIGNAL(clicked()), this, SLOT(newConnect()));
} clientWidget::~clientWidget()
{
delete ui;
} void clientWidget::newConnect()
{
blockSize = 0;
tcpSocket->abort(); //取消已有的连接
tcpSocket->connectToHost(ui->hostLineEdit->text(),
ui->portLineEdit->text().toInt());
//连接到主机,这里从界面获取主机地址和端口号
} void clientWidget::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 clientWidget::displayError(QAbstractSocket::SocketError)
{
qDebug() << tcpSocket->errorString();
}

最新文章

  1. 通过样式class 判断多个checkbox redio 是否都选中
  2. javascript里面的数组,json对象,动态添加,修改,删除示例
  3. auto dock
  4. 易出错的C语言题目之一:宏定义与预处理
  5. MS Sql Server 中主从库的配置和使用介绍(转)
  6. Jetty提交数据时报java.lang.IllegalStateException: Form too large270468&gt;200000问题解决
  7. DATAGUARD中手工处理日志v$archive_GAP的方法
  8. gimp之旅
  9. Eclipse - 添加 PyDev 插件
  10. (转载)Java多线程的监控分析工具(VisualVM)
  11. poj 3013 Big Christmas Tree
  12. base(function strchr)
  13. Java IO编程全解(五)——AIO编程
  14. Maven-11: 从命令行调用插件
  15. 企业面试必会shell
  16. Django中程序中图片资源的路径问题(static文件夹的放置)
  17. python中类的概念
  18. 编译开源C或者C++项目最好像执行如下命令,否则可能会有这种奇葩问题
  19. Java从零开始学十(Arrays类对数组的常用方法)
  20. 常见的加密和解密算法—BASE64

热门文章

  1. eval()和exec()函数的区别
  2. 坑爹的 HTTPClient java.lang.NoSuchFieldError: INSTANCE
  3. 问题:Unable to find a &#39;userdata.img&#39; file for ABI armeabi to copy into the AVD folder.
  4. iOS 多线程之 NSOperation 的基本使用
  5. JVM 指令讲解
  6. IO多路复用、协程
  7. (2.3)学习笔记之mysql基础操作(表/库操作)
  8. spring boot 如何将没有注解的类@Autowired
  9. ubuntu常见错误--Could not get lock /var/lib/dpkg/lock解决(转)
  10. 关于付款条件ZTERM 的函数