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服务器端 和 客户端的更多相关文章

  1. TCP服务器端和客户端程序设计【转】

    本文转载自:http://blog.csdn.net/yueguanghaidao/article/details/7035248# 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.实验目的 ...

  2. C#编程 socket编程之tcp服务器端和客户端

    基于Tcp协议的Socket通讯类似于B/S架构,面向连接,但不同的是服务器端可以向客户端主动推送消息. 使用Tcp协议通讯需要具备以下几个条件: (1).建立一个套接字(Socket) (2).绑定 ...

  3. Node学习笔记:建立TCP服务器和客户端之间的通信

    结构: socket是应用层和传输层的桥梁.(传输层之上的协议所涉及的数据都是在本机处理的,并没进入网络中) 涉及数据: socket所涉及的数据是报文,是明文. 作用: 建立长久链接,供网络上的两个 ...

  4. socket编程 ------ 建立 TCP 服务器和客户端流程(阻塞方式)

    服务器端: 服务器端先创建一个socket,然后把这个socket绑定到端口上,接着让它向tcp/ip协议栈请求一个监听服务并创建一个accept队列来接受客户端请求. void creat_tcpS ...

  5. QTcpSocket 及 TCP粘包分析

    ----我的生活,我的点点滴滴!! 这两天用Qt简单的实现一个tcp多线程client,在此记录下知识. 一.长连接与短连接 1.长连接 Client方与Server方先建立通讯连接,连接建立后不断开 ...

  6. python 网络编程(三)---TCP 服务器端客户端实现

    客户端 客户端主要有4个步骤: 1)创建一个socket以连接服务器. socket = socket.socket(family, type),family参数代表地址家族,可为AF_INET(包括 ...

  7. java 通过TCP\UDP 协议实现多人聊天,点对点,文件传送-----分服务器端和客户端

    java 通过TCP\UDP 协议实现多人聊天,点对点,文件传送-----分服务器端和客户端 启动界面如下图: 首先启动服务器: 客户端登陆,登陆成功后为: 默认发送是全部用户,是多人发送. 当在边列 ...

  8. python小练习---TCP服务器端

    针对于上一篇分享python小练习---TCP客户端 http://www.cnblogs.com/zhaijiahui/p/6926197.html我继续按书中内容,向下进行这里需要强调一个事py3 ...

  9. 图说使用socket建立TCP连接

    在网络应用如火如荼的今天,熟悉TCP/IP网络编程,那是最好不过.如果你并不非常熟悉,不妨花几分钟读一读. 为了帮助快速理解,先上个图,典型的使用socket建立和使用TCP/UDP连接过程为(截图来 ...

随机推荐

  1. poj3096

    C++的标准模版库的应用 Surprising Strings Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6625   ...

  2. C++ 基础知识回顾(I/O)

    [1] I/O基础 大多数计算机语言的输入输出的实现都是以语言本身为基础的,但是C/C++没有这样做.C语言最初把I/O留给了编译器实现人员.这样做的一个原因是可以提供足够的自由度,使之最适合目标机器 ...

  3. 关于angularjs的select下拉列表存在空白的解决办法

    angularjs 的select的option是通过循环造成的,循环的方式可能有ng-option或者</option  ng-repeat></option>option中 ...

  4. PSSH 批量管理服务器

    pssh命令是一个python编写可以在多台服务器上执行命令的工具,同时支持拷贝文件,是同类工具中很出色的,类似pdsh,个人认为相对pdsh更为简便,使用必须在各个服务器上配置好密钥认证访问. 1. ...

  5. eclipse content assist 出现错误

    解决方法是,在Window->preference->java->editor>Content Assist->advanced ,将 time out 由50 ms 改 ...

  6. Shiro 页面权限标签

    http://www.cnblogs.com/jifeng/p/4500410.html  不整理了,直接看人家写好的

  7. Map.Entry<K,V>分析

    一.好处 你是否已经对每次从Map中取得关键字然后再取得相应的值感觉厌倦? Set keys = map.keySet( ); if(keys != null) { Iterator iterator ...

  8. Oracle 11g Enhancements in AWR Baselines

    Enhancements in AWR Baselines A baseline is any set of snapshots taken over a period of time. The sn ...

  9. ABAP重点各种接口技术

    转自 http://www.cnblogs.com/penley/archive/2008/11/12/1332140.html 下面总结一下ABAP中的各种接口技术,因为学习时间不是很长,肯定还不全 ...

  10. 第一次java小考心得体会

    本周四Java第一次上课,测试了一个ATM程序,从两点半开始到五点半结束. 整整三个小时,结果怎么说呢,大概可以用惨不忍睹来形容吧. 因为之前有一个测试样卷,以为考试内容不会变的我,只是把学生信息管理 ...