Qt Socket网络编程 服务器端提示QIODevice::read (QTcpSocket):qt device not openn,但是与客户端连接成功

Qt模块化笔记之network——套接字Socket网络编程起步
对Qt的套接字三说,有三大主角:QTcpSocket,QUdpSocket和QTcpServer。
套接字用来控制网络传输数据,可以将它比作电话机。参考百度百科的socket解释点击打开链接
TCP(Transmission Control Protocol,传输控制协议),是一种面向连接(连接导向)的、可靠的、基于字节流的传输层,在正式收发数据前,必须和对方建立可靠的连接。
UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去!&
简单说,要准确完整地传输数据(如传输一个文件),使用QTcpSocket,只需要往外发送数据,而不管接收方是否收到数据,使用QUdpSocket。——————————————————————————————————————————————————————————————————
如何使用用socket:
QTcpSocket与QUdpSocket都继承自QAbstractSocket,而它又继承自QIODevice。故套接字的使用方式,像IO设备操作文件一样,具有一定相似性。
网络的&另一端&的socket可以看作一个IO设备,本地的socket可以通过网线向这个设备写入或读取数据,同样,反回来也可以。
可使用socket的&read(),&write(),&readLine()和readAll()从“另一端”获取或写入数据,也可以用getChar(),&putChar(),
and&ungetChar()读取或写入单字节。
——————————————————————————————————————————————————————————————————
它们的具体联系:
——————————————————————————————————————————————————————————————————
继承自QAbstractSocket的QTcpSocket,没有新增什么函数或信号
以下查看QAbstractSocket,函数很多,可先粗略浏览下。
公有函数:
QAbstractSocket(SocketType socketType, QObject * parent)
virtual ~QAbstractSocket()
virtual void connectToHost(const QString & hostName, quint16 port, OpenMode openMode = ReadWrite, NetworkLayerProtocol protocol = AnyIPProtocol)
virtual void connectToHost(const QHostAddress & address, quint16 port, OpenMode openMode = ReadWrite)//连接至远程主机,这两个中一般用这个。
bool bind(const QHostAddress & address, quint16 port = 0, BindMode mode = DefaultForPlatform)
bool bind(quint16 port = 0, BindMode mode = DefaultForPlatform)
void setPauseMode(PauseModes pauseMode)
void setProxy(const QNetworkProxy & networkProxy)//为本socket设置个socket代理,即数据将先发送到代理服务器,再到另一端,保证安全。百度下……
virtual void setReadBufferSize(qint64 size)
virtual bool setSocketDescriptor(qintptr socketDescriptor, SocketState socketState = ConnectedState, OpenMode openMode = ReadWrite)
virtual void setSocketOption(QAbstractSocket::SocketOption option, const QVariant & value)
void abort()//停止,立即关闭socket连接
virtual void resume()
bool flush()
virtual void disconnectFromHost()//数据传输完成才关闭连接,
SocketError error() const
SocketState state() const
bool isValid() const
QHostAddress localAddress() const
quint16 localPort() const
QString peerName() const//远程主机名
quint16 peerPort() const
QHostAddress peerAddress() const//远程主机地址,IP
PauseModes pauseMode() const
QNetworkProxy proxy() const
qint64 readBufferSize() const
virtual qintptr socketDescriptor() const
virtual QVariant socketOption(QAbstractSocket::SocketOption option)
SocketType socketType() const
virtual bool waitForConnected(int msecs = 30000)
virtual bool waitForDisconnected(int msecs = 30000)
Reimplemented Public Functions
virtual bool atEnd() const
virtual qint64 bytesAvailable() const
virtual qint64 bytesToWrite() const
virtual bool canReadLine() const
virtual void close()
virtual bool isSequential() const
virtual bool waitForBytesWritten(int msecs = 30000)
virtual bool waitForReadyRead(int msecs = 30000)
void connected()//连接上时发出
void disconnected()
void error(QAbstractSocket::SocketError socketError)//出错
void hostFound()
void proxyAuthenticationRequired(const QNetworkProxy & proxy, QAuthenticator * authenticator)
void stateChanged(QAbstractSocket::SocketState socketState)//连接状态变化
Protected Functions
setLocalAddress(const QHostAddress &&address)
setLocalPort(quint16&port)
setPeerAddress(const QHostAddress &&address)
setPeerName(const QString &&name)
setPeerPort(quint16&port)
setSocketError(SocketError&socketError)
setSocketState(SocketState&state)
Reimplemented Protected Functions
virtual qint64
readData(char *&data,
qint64&maxSize)
virtual qint64
readLineData(char *&data,
qint64&maxlen)
virtual qint64
writeData(const char *&data,
qint64&size)
————————————————————————————————————————————————————————————
这么多函数,真是吓死人了。
> 本站内容系网友提交或本网编辑转载,其目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请及时与本网联系,我们将在第一时间删除内容!
Java套接字实现网络编程之基础篇(1)
17:18 chinaitlab 我要评论(4) API是一系列的类和接口,均位于包java.net和javax.net中在这篇文章中我们将介绍套接字(Socket)慨念,同时以实例说明如何使用Network API操纵套接字. 用Java开 ...
1.套接字 socket是最通用的网络通信应用程序的开发接口.linux的网络编程就是套接字编程. 套接字编程的头文件: #include &sys/types.h& #include &socket.h& #include &netinet/in.h& 2.套接字地址结构 1)套接字地址结构: struct sockad ...
在前面的几个部分里面,我们已经学会了怎么样从网络上读写信息了.前面的一些函数(read,write)是网络程序里面最基本的函数.也是最原始的通信函数.在这一章里面,我们一起来学习网络通信的高级函数.这一章我们学习另外几个读写函数. 6.1 recv和send recv和send函数提供了和read和write差不多的功能.不过它们提供 了第四个参数来控制读写 ...
本节以QTcpServer与QTcpSocket为主,联合其它知识(sql与json),编写TCP服务器与客户端,以让读者更好理解Qt的TCP部分各函数功能.程序结构参考自qtcn上的liudianwu的TCP调试工具,原程序链接:点击打开链接.由于是业余爱好者,不知软件公司里这种程序结构,欢迎指点. ---------------------------- ...
QTcpServer用函数 listen(const QHostAddress & address = QHostAddress::Any, quint16 port = 0) 监听某个端口,如果有新连接进来就发出newConnection()信号,连接过程中出错的话就发出acceptError(QAbstractSocket::SocketErro ...
本节涉及的类如下: QDnsLookup QDnsDomainNameRecord QDnsHostAddressRecord QDnsMailExchangeRecord QDnsServiceRecord QDnsTextRecord DNS 是域名系统 (Domain Name System) 的缩写. 域名即我们在浏览器中输入的网址字符串.它将送到提 ...
本节你将了解如何传输一个文件,以图片文件示例. 在以前socket的write函数只,我们都只是写入少量的文字,大小也许还不到一K,它的写入时间极短,接收时间也极短,很少需要考虑是否保证它完整地传输到另一端. 但文件不同,文件的传输需要保证它的每一部分都传送到另一端,另一端才能将它还原. 比如我们的浏览器从网络下载文件的时候,它在下载之前就获得了需要下载的文 ...
上节已将服务器部分源码放出,本节列出客户端源码及结果 客户端即一个简单的带ui的dialog工程.主要向服务器发送登陆及获取信息的json格式代码. dialog.h #ifndef DIALOG_H #define DIALOG_H #include &QDialog& #include &QTcpSocket& namespace ...君,已阅读到文档的结尾了呢~~
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
QT实验八网络编程实验(一)
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口Qt Socket编程 服务器端总返回 QIODevice::write: device not open_百度知道
Qt Socket编程 服务器端总返回 QIODevice::write: device not open
device not open不能发送消息了;}本来可以正常运行,电脑重启了一次之后便一直返回如下信息QIODevice,客户端在ubuntu下由服务器向客户端发送消息按键的处理程序如下void MainWtext();tcpSocket-&gt::;write(ui-&gt:on_send_clicked(){
this-&gt:lineEdit-&gt.toLatin1())windows7,Qt5
提问者采纳
。是你的服务器的端口没有打开。
提问者评价
谢谢!!确实是端口没代理号的样子,后来重新弄了端口映射就ok啦!
采纳率100%
其他类似问题
为您推荐:
socket的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁------解决方案--------------------如果你能把listen放到mythread里面就不会有这样的问题.
或者&把incomingConnection放到mythread里面,但是这个我不确定有效.
总之就是建立socket和接收消息都在一个线程里面就不会出错.
至于为什么,我也不太说得清楚.还就是qtcp没有必要多线程.
如果你想多线程,可以在收到消息之后在线程里面抛出信号...本人理解不是很到位.仅供参考下.------解决方案--------------------你在run中connect的信号和槽函数采用的是默认的AutoConnection,这样槽函数会在它所在的线程中执行,而你的_socket是在线程的run中初始化的,槽函数中无法直接调用。把连接方式改成DirectConnection试试吧。
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有基于Linux/Qt的智能家居系统设计
针对智能家居的特点及应用背景,设计了一种家庭多功能控制系统。该系统采用飞思卡尔公司ARM Cortex A8系列的i.MX51处理器作为MCU,在其上移植嵌入式Linux作为软
  针对智能家居的特点及应用背景,设计了一种家庭多功能控制系统。该系统采用飞思卡尔公司ARM Cortex A8系列的i.MX51处理器作为MCU,在其上移植嵌入式Linux作为软件开发平台,并利用Qt相关技术为基础设计友好的用户界面,实现了ARM板的各功能模块与服务器端的交互。系统同时具备数字可视对讲、信息收发、家电控制、安防报警、家庭娱乐等功能。本文引用地址:linux操作系统文章专题:linux操作系统详解(linux不再难懂)  1 系统的架构和功能  家庭智能控制系统主要由室内分机、单元门口机、小区围墙机、管理中心终端机、管理中心服务器以及附件组成。系统采用分布式网络结构,可以根据住户数量对系统的容量进行扩充。  (1)室内机是用户在室内进行操作的主要平台,其功能组成为:可视对讲、信息服务、家电控制、安防报警、家庭娱乐等。可视对讲模块主要实现双向可视通话、视频监控、留言/留影、开锁等功能;信息服务模块主要用来收发物业信息和小区广播,支持文本、图片形式,并实现与可视对讲模块的影音共享;家电控制模块包括对灯光、窗帘、空调、电梯等设施的无线控制,并预设了情境模式;安防报警模块支持对烟感、门磁、煤气泄漏检测等的自动报警,并可通过GPRS/3G技术将报警信息传送到用户手机上;家庭娱乐模块支持常见格式的音视频文件的播放(主要依靠硬件解码)以及对常见格式的图片的浏览(电子相框)。  (2)单元门口机的主要功能是完成与所在单元楼的任意住户以及管理中心机的可视通话,除了具备留言/留影功能外,还提供触摸屏校准、背光调节、密码设置等功能。  (3)围墙机的基本功能和单元门口机类似,但可视对讲、留言/留影功能是针对小区内所有住户的。  (4)中心机是整个系统的神经中枢,管理人员通过管理中心的控制设备管理各子系统的终端,其功能包括:可视对讲、视频监控、查看报警信息、排除设备故障、信息服务、系统设置、远程管理等。  2 系统的实现方案  2.1 Qt的信号/槽机制  Qt是一个跨平台的C++应用程序框架,完全面向对象、易于扩展且允许真正的组件编程。Qt的C++类库封装了适应不同操作系统的访问细节,这使得它能够快速地部署于各种桌面与嵌入式系统中[1]。  信号/槽机制是 Qt 的核心特性,这种机制真正实现了消息的封装,完全可以取代原始的回调和消息机制。信号和槽的连接通过connect()函数完成,connect()函数是QObject类中的静态函数,其函数原型如下:  Bool QObject::connect(const QObject* sender,  const char*signal,const QObject* receiver,const char* member)  其中,sender和receiver是指向QObject的指针,signal和slot是不带有参数的函数名。  2.2 基于XML格式的Socket多线程通信  Linux中的网络编程主要通过Socket接口实现,在Qt环境里,对Socket进行了封装,并建立了相应的QTcpSocket类来实现TCP客户端和服务器的通信。QTcpSocket继承了QIODevice,所以QTcpSocket可以使用QDataStream进行数据的读取和写入。  可扩展标记语言XML(eXtensible Markup Language)是一种用于数据交换和数据存储的多用途文本格式。对于XML格式的数据,Qt中的QtXml模块提供了DOM和SAX两种处理方式。本文采用的DOM方式把XML文档转换成一个可以遍历的树形结构,这样便可以随意访问其中的节点,因此要明显简洁得多。  室内机和中心机之间的通信采用多线程方式实现。多线程方式具有降低内存、提高程序响应速度等优点,特别适用于嵌入系统。系统中建立了三个主线程:(1)GUI线程:用于执行main()主函数,响应用户的界面操作;(2)tcpServer侦听线程:用于对指定端口进行监听;(3)tcpSocket传输线程:负责消息的接收和回复。下面以用户主动更新小区广播为例详细说明Socket通信的流程:(1)室内机首先启动一个线程,将用户的更新请求结构转化成标准的XML格式(如果是新设备第一次开机,要先手动进行IP的设置),(2)调用connectToHost()函数请求与中心机建立连接,处于监听状态的中心机接到请求后,就会分配一个Socket套接字来处理连接:首先根据解析出来的XML的Type节点判断请求类型,如果是纯文本则从数据库的Text表读取,如果是图片则从硬盘读取,然后调用QIODevice::write()函数发送;(3)室内机接到应答信号readyRead()后就开始进行信息的收取,根据消息的Type节点类型分别写入数据库和硬盘。Socket多线程通信流程如图1所示。  2.3 并行数据库设计  为了实现数据库的并行操作,使GUI界面与数据库相分离,从而让界面能更快地响应用户的一般操作,同样要用到Qt的多线程编程。在系统启动时,首先要建立一个全局对象m_query,以便于各个实体类与数据库类进行连接。这样,每当有数据库操作请求时便会实例化一个m_query来创建一个线程用于处理该请求。m_query对象中包含两个类:(1)QueryThread,用于为每个数据操作创建一个线程;(2)Worker,用于实现数据库的相关操作,如加载数据库驱动、进行数据查询/插入/删除等。  图2为数据库的查询操作流程。首先在实体类里创建两个connect连接,分别用于发送和接收查询结果,并生成SQL语句向QueryThread提交查询请求信号。QueryThread收到请求后为其创建一个线程,并交由Worker类进行具体数据库查询操作。Worker类得出查询结果后,先传递给QueryThread,再由其将查询结果返回到实体类。  关键代码如下:  connect( this,SIGNAL(seek(const QString& ) ),m_query,  SIGNAL(seek_execute(const QString& )) );  connect( m_query,SIGNAL(seek(const QList  & ) ),this,SLOT( slotResult( const QList& ) ) );  …  void text:: database() {  QString sql = &select * from Text order by date desc &;  emit seek_execute (sql);  }  2.4 音视频同步传输技术  i.MX51处理器包含了支持硬件视频编解码的VPU单元,并自带了完整的多媒体解决方案。因此,系统中采用其自带的多媒体软件包进行音视频流的采集和编解码[2]。
(责任编辑:admin)
------分隔线----------------------------
这个Bug涉及到Unix时刻戳的题目。...
上海冠环阀门制造有限公司专业生产(供应)销售QF电动内螺纹球阀系列产品,公司具有良好...
职位名称:软件开发岗( Java开发工程师-资产类产品架构设计与开发方向)岗位序列:所...
2个 Unix/Linux 命令技巧...
Tiger是一个完全由shell脚本编写的UNIX的免费、开源安全工具,适用于安全审计和入侵检...
2年5月日,Tiobe公司宣布新一期编程说话排行榜。新一期榜单前位没有太多的变革,只是O...}

我要回帖

更多关于 qt5 socket编程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信