QT 使用QTcpServer QTcpSocket 建立TCP服务器端 和 客户端
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();
}
QT 使用QTcpServer QTcpSocket 建立TCP服务器端 和 客户端的更多相关文章
- TCP服务器端和客户端程序设计【转】
本文转载自:http://blog.csdn.net/yueguanghaidao/article/details/7035248# 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.实验目的 ...
- C#编程 socket编程之tcp服务器端和客户端
基于Tcp协议的Socket通讯类似于B/S架构,面向连接,但不同的是服务器端可以向客户端主动推送消息. 使用Tcp协议通讯需要具备以下几个条件: (1).建立一个套接字(Socket) (2).绑定 ...
- Node学习笔记:建立TCP服务器和客户端之间的通信
结构: socket是应用层和传输层的桥梁.(传输层之上的协议所涉及的数据都是在本机处理的,并没进入网络中) 涉及数据: socket所涉及的数据是报文,是明文. 作用: 建立长久链接,供网络上的两个 ...
- socket编程 ------ 建立 TCP 服务器和客户端流程(阻塞方式)
服务器端: 服务器端先创建一个socket,然后把这个socket绑定到端口上,接着让它向tcp/ip协议栈请求一个监听服务并创建一个accept队列来接受客户端请求. void creat_tcpS ...
- QTcpSocket 及 TCP粘包分析
----我的生活,我的点点滴滴!! 这两天用Qt简单的实现一个tcp多线程client,在此记录下知识. 一.长连接与短连接 1.长连接 Client方与Server方先建立通讯连接,连接建立后不断开 ...
- python 网络编程(三)---TCP 服务器端客户端实现
客户端 客户端主要有4个步骤: 1)创建一个socket以连接服务器. socket = socket.socket(family, type),family参数代表地址家族,可为AF_INET(包括 ...
- java 通过TCP\UDP 协议实现多人聊天,点对点,文件传送-----分服务器端和客户端
java 通过TCP\UDP 协议实现多人聊天,点对点,文件传送-----分服务器端和客户端 启动界面如下图: 首先启动服务器: 客户端登陆,登陆成功后为: 默认发送是全部用户,是多人发送. 当在边列 ...
- python小练习---TCP服务器端
针对于上一篇分享python小练习---TCP客户端 http://www.cnblogs.com/zhaijiahui/p/6926197.html我继续按书中内容,向下进行这里需要强调一个事py3 ...
- 图说使用socket建立TCP连接
在网络应用如火如荼的今天,熟悉TCP/IP网络编程,那是最好不过.如果你并不非常熟悉,不妨花几分钟读一读. 为了帮助快速理解,先上个图,典型的使用socket建立和使用TCP/UDP连接过程为(截图来 ...
随机推荐
- MySQL基本操作(+参考手册)
1.MySQL 5.1参考手册 2.基础教程 3.常用举例入下: 1 连接数据库:mysql -h主机地址 -u用户名-p用户密码 2 数据库的提示符:mysql> 3 退出数据库:exit(回 ...
- poj2420(模拟退火大法好)
// // main.cpp // poj2420 // // Created by 陈加寿 on 16/2/13. // Copyright © 2016年 chenhuan001. All rig ...
- 【BZOJ2882】工艺 后缀自动机
[BZOJ2882]工艺 Description 小敏和小燕是一对好朋友. 他们正在玩一种神奇的游戏,叫Minecraft. 他们现在要做一个由方块构成的长条工艺品.但是方块现在是乱的,而且由于机器的 ...
- 宇视4G设备采用GB/T28181协议成功接入EasyGBS国标流媒体平台的设置流程
经过了多天的调试对接,终于将宇视的布控球顺利接入到了EasyGBS的国标平台,特地写一下对接过程中遇到的问题,希望能帮助大家避开一些麻烦: 第一步:电脑连接无线网络IPCWIFI,密码12345678 ...
- iOS之事件的传递和响应机制
前言: 按照时间顺序,事件的生命周期是这样的: 事件的产生和传递(事件如何从父控件传递到子控件并寻找到最合适的view.寻找最合适的view的底层实现.拦截事件的处理)->找到最合适的view后 ...
- 启动hive --service metastore &出现Missing Hive Execution Jar: /opt/apache-hive-1.2.0-bin//lib/hive-exec-*.jar
原因:出现上述问题通常是运行hive 在bin/目录下的脚本所致. 解决办法:就是让HIVE_HOME变量指向hive-trunk/build/dist目录,将$HIVE_HOME/bin添加到PAT ...
- golang安装环境变量配置和beegoan安装
下载安装 go get github.com/astaxie/beego bee 工具的安装 go get github.com/beego/bee 升级 $ go get -u github.com ...
- zabbix-2.4.8-1添加tcp状态监控
1.安装zabbix-agentyum -y install zabbix-2.4.8-1.el6.x86_64.rpm zabbix-agent-2.4.8-1.el6.x86_64.rpm2.编辑 ...
- 爬虫四 selenium模块
一.介绍 selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题 selenium本质是通过驱动浏览器,完全模拟浏览器的操作, ...
- gitattributes手册
gitattributes(5) Manual Page 1.gitattributes是什么? gitattributes用于定义每个路径的属性. 其语法是:pattern attr1 attr2 ...