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连接过程为(截图来 ...
随机推荐
- Codeforces Round #324 (Div. 2) (快速判断素数模板)
蛋疼的比赛,当天忘了做了,做的模拟,太久没怎么做题了,然后C题这么简单的思路却一直卡到死,期间看了下D然后随便猜了下,暴力了下就过了. A.找一个能被t整除的n位数,那么除了<=10以外,其他都 ...
- 海康、大华NVR网络硬盘录像机录像无插件全平台访问实现—录像回放时间轴功能实现方法
在之前的博文中我们有介绍方案*NVR硬件录像机web无插件播放方案(支持取特定时间段视频流)*:该片博文旨在介绍时间轴功能的实现和相关接口的调用: 时间轴样式展示: 问题分析 对于 时间轴的展示实现需 ...
- 巨蟒django之CRM5 学习记录&&课程记录&&班级管理&&私户的数量上限
1.公户变私户(事务+行级锁) 2.私户的数量上限 3.班级的管理 4.课程记录管理 5.学习记录的初始化 6.展示和编辑学习记录
- 巨蟒python全栈开发django11:ajax&&form表单上传文件contentType
回顾: 什么是异步? 可以开出一个线程,我发出请求,不用等待返回,可以做其他事情. 什么是同步? 同步就是,我发送出了一个请求,需要等待返回给我信息,我才可以操作其他事情. 局部刷新是什么? 通过jq ...
- 信息搜集之常见的web组合
环境: Win2003或Win7 Asp解析环境搭建 小旋风 Php解析环境搭建 phpstudy aspx解析环境搭建 IIS jsp解析环境搭建 jspstudy 常规渗透环境网络环境解析 1.操 ...
- [转载]使用iscroll.js-tab左右滑动导航--tab点击无效果
转载自:http://blog.csdn.net/zuoyiran520081/article/details/77369421 最近在页面中用iscroll.js,但是但是有跳转,用a标签的hre ...
- 批处理 ECHO命令输出空行
众所周知,如果echo后面跟一个环境变量,但是该变量却为空时,相当于不加任何参数的echo,即输出当前echo是on还是off.很多文章或者教程给出的解决方案都是在echo后面加一个点号echo.,这 ...
- Can’t connect to local MySQL server through socket 解决办法
启动mysql 报错: ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/lib/mysql/m ...
- phonegap file api
https://github.com/chrisben/imgcache.js/tree/master/examples 1.FILE API file api最大的两个功能是download和upl ...
- javascript语言基础知识
一.JavaScript语法的引入方式. 1.直接引入(在html的head中直接引入js语法) <script> js语法 </script> 2.导入文件(以导入文件的方式 ...