对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)
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)//连接状态变化
void | setLocalAddress(const QHostAddress & address) |
void | setLocalPort(quint16 port) |
void | setPeerAddress(const QHostAddress & address) |
void | setPeerName(const QString & name) |
void | setPeerPort(quint16 port) |
void | setSocketError(SocketError socketError) |
void | setSocketState(SocketState state) |
virtual qint64 | readData(char * data, qint64 maxSize) |
virtual qint64 | readLineData(char * data, qint64 maxlen) |
virtual qint64 | writeData(const char * data, qint64 size) |
这么多函数,真是吓死人了。