使用QTcpSocket在两台ubuntu之间实现通讯

news/2024/9/18 15:07:40/ 标签: 服务器, 运维

重点提取:

1.保证服务端和客户端端口号一致

2.保证服务端和客户端在同一网段(可以通过网线连接)

3保证客户端界面输入的ip是服务段的ip

实现步骤:

首先,构造服务端界面和客户端界面如下

服务端界面

客户端界面

其次具体代码

在.pro文件的QT += core gui下面加入

QT       += network

服务段代码

my_server.h
#ifndef MY_SERVER_H
#define MY_SERVER_H#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
#include <QString>
namespace Ui {
class My_server;
}class My_server : public QWidget
{Q_OBJECTpublic:explicit My_server(QWidget *parent = nullptr);~My_server();QTcpServer *tcpserver;QTcpSocket *tcpsocket;private slots:void on_connectbt_clicked();void newConnection_Slot();void readyRead_Slot();void on_disconnectbt_clicked();void on_sendbt_clicked();private:Ui::My_server *ui;
};#endif // MY_SERVER_H
my_server.cpp
#include "my_server.h"
#include "ui_my_server.h"My_server::My_server(QWidget *parent) :QWidget(parent),ui(new Ui::My_server)
{ui->setupUi(this);setWindowTitle("服务器");tcpserver=new QTcpServer(this);tcpsocket=new QTcpSocket(this);connect(tcpserver,SIGNAL(newConnection()),this,SLOT(newConnection_Slot()));
//    connect(ui->connect,SIGNAL(clicked(bool)),this,SLOT(on_connectbt_clicked()));
//    connect(ui->disconnect,SIGNAL(clicked(bool)),this,SLOT(on_disconnectbt_clicked()));
//    connect(ui->send,SIGNAL(clicked(bool)),this,SLOT(on_sendbt_clicked()));
}
void My_server::newConnection_Slot()
{//第三步:取出套接字tcpsocket=tcpserver->nextPendingConnection(); //获取已经连接的客户端的SOCKET套接字connect(tcpsocket,SIGNAL(readyRead()),this,SLOT(readyRead_Slot()));//若客户端有消息进来的话,会触发信号readyRead_Slot();//获取对方的IP和端口QString sIp = tcpsocket->peerAddress().toString();quint16 sPort = tcpsocket->peerPort();qDebug() << sIp << sPort;//connect(tcpsocket, SIGNAL(disconnected()), this, SLOT(slotServerDisConnection()));//断开连接的话会触发disconnected();
}
void My_server::readyRead_Slot()
{//第四步:读取套接字的内容//从socket中读出数据QString buf;buf=tcpsocket->readAll();ui->receivewd->appendPlainText(buf);/*或QByteArray baArray = tcpsocket->readAll();QString sMsg = baArray;ui->receivewd->appendPlainText(receivewd);*/
}void My_server::on_connectbt_clicked()//连接服务器
{//第二部步:listen------监听是否有新的连接进来tcpserver->listen(QHostAddress::Any,ui->portnum->text().toUInt());//监听端口号
}void My_server::on_disconnectbt_clicked()//关闭服务器
{tcpserver->close();
}void My_server::on_sendbt_clicked()//发送信息
{
//    toLatin1()
//    tcpsocket->write(ui->sendwd->text().toLatin1());
//    tcpsocket->write(ui->sendwd->text().toLocal8Bit(),ui->sendwd->text().length());tcpsocket->write(ui->sendwd->text().toLocal8Bit().data());
}My_server::~My_server()
{delete ui;
}

客户端代码

my_client.h
#ifndef MY_CLIENT_H
#define MY_CLIENT_H#include <QWidget>
#include <QTcpSocket>
namespace Ui {
class My_client;
}class My_client : public QWidget
{Q_OBJECTpublic:explicit My_client(QWidget *parent = nullptr);~My_client();QTcpSocket *tcpsocket;private slots:void on_openclient_clicked();void connected_SLOT();void readyRead_Slot();void on_closeclient_clicked();void on_sent_clicked();private:Ui::My_client *ui;
};#endif // MY_CLIENT_H
my_client.cpp
#include "my_client.h"
#include "ui_my_client.h"
#include "QString"
#include "stdio.h"
My_client::My_client(QWidget *parent) :QWidget(parent),ui(new Ui::My_client)
{ui->setupUi(this);setWindowTitle("客户端");tcpsocket=new QTcpSocket(this);
//    connect(ui->open,SIGNAL(clicked(bool)),this,SLOT(on_openclient_clicked()));
//    connect(ui->close,SIGNAL(clicked(bool)),this,SLOT(on_closeclient_clicked()));
//    connect(ui->send,SIGNAL(clicked(bool)),this,SLOT(on_sent_clicked()));}
void My_client::connected_SLOT()
{QObject::connect(tcpsocket, &QTcpSocket::readyRead, this, &My_client::readyRead_Slot);
//    connect(tcpsocket,SIGNAL(readyRead()),this,SLOT(readyRead_Slot()));//将信号连接到槽,书写比较明确
}
void My_client::readyRead_Slot()//定义接收信号的槽
{QString buf;buf=tcpsocket->readAll();ui->receivewd->appendPlainText(buf);//接收由tcp发送过来的信息
//    ui->receivewd->appendPlainText(buf.toUtf8());//接收由tcp发送过来的信息
}void My_client::on_openclient_clicked()
{//第一步:创建套接字,与服务端的IP地址和端口号连接.//注:这里的端口号和上面服务端绑定的那个端口号是一样的,别搞错了.//连接服务端tcpsocket->connectToHost(ui->ipnum->text(),ui->portnum->text().toInt());//转为无符号,连接服务器端口connect(tcpsocket,SIGNAL(connected()),this,SLOT(connected_SLOT()));printf("打开客户端 ");/*//成功连接返回true,错误返回falseif(m_tsTcpSocket->waitForConnected()){qDebug() << "connect success";}*/
}void My_client::on_closeclient_clicked()
{tcpsocket->close();printf("关闭客户端 ");
}void My_client::on_sent_clicked()
{tcpsocket->write(ui->sendwd->text().toLocal8Bit().data(),ui->sendwd->text().length());//丽丽//tcpsocket->write(ui->sendwd->text().toLocal8Bit().data());//网上//tcpsocket->write(ui->sendwd->toPlainText().toLatin1());//xie宏伟/*QString str;int iSize = tcpsocket->write(str.toUtf8().data());//返回字节的大小//等待write写完再写下一次的writeif(!tcpsocket->waitForBytesWritten(50000)){return;}if(iSize ==-1) //判断发送是否成功{qDebug() << "write error";return;}
}
My_client::~My_client()
{delete ui;
}

两台ubuntu接上网线后网段设置

服务端

客户端

保证ip前三位一致,第四位稍作修改即可,就可以进行通讯啦。

结语

使用一台电脑操控另一台电脑的程序很有趣呢,请大家不妨试试看哈哈。


http://www.ppmy.cn/news/1520248.html

相关文章

Linux 命令行快捷键

Linux 命令行快捷键_linux删除一个单词-CSDN博客 涉及在linux命令行下进行快速移动光标、命令编辑、编辑后执行历史命令、Bang(!)命令、控制命令等。让basher更有效率。 常用 Ctrl左右键:在单词之间跳转 Ctrla: 跳到本行的行首 Ctrle: 跳到页尾 Ctrlu&#xff1a;删除当前光标…

SpringWeb 重定向

现在前端后分离&#xff1a;如何确认是跳转到前端页面还是后端的方法呢&#xff1f;RedirectView&#xff1a;重定向如何区分重定向的是前端页面还是后端的一个controller呢 先看下&#xff1a;SpringBoot系列教程web篇之重定向-阿里云开发者社区 ## 根据浏览器中返回的状态码…

数据结构串的模式匹配算法--BF暴力匹配

BF&#xff08;Brute-Force&#xff0c;暴力匹配&#xff09;算法是一种简单的字符串匹配算法&#xff0c;其基本思想是将目标串S逐个字符与模式串P进行比对&#xff0c;直到找到匹配或遍历完S为止。下面是一个使用C语言实现的BF算法示例&#xff1a; #include <stdio.h>…

用友U8 CRM exportdictionary.php SQL注入漏洞复现

0x01 产品简介 用友U8 CRM客户关系管理系统是一款专业的企业级CRM软件,旨在帮助企业高效管理客户关系、提升销售业绩和提供优质的客户服务。 0x02 漏洞概述 用友 U8 CRM客户关系管理系统 exportdictionary.php 文件存在SQL注入漏洞,未经身份验证的攻击者通过漏洞执行任意S…

全志Linux磁盘操作基础命令

磁盘操作 fdisk命令 fidsk是一个用来创建和维护磁盘设备分区的一个实用工具。 [ubuntubook:~]$ fdisk -l //列出当前系统所有的磁盘设备 [ubuntubook:~]$ fdisk /dev/sdc //操作设备节点为 /dev/sdc的一个设备。p : 显示所有的分区。d: 删除分区。n: 创建一个新的分区。t : …

使用QT开发一些特殊相机的思路:个人经验

前言&#xff1a; 去年使用QT开发过Dalsa线扫相机的应用程序&#xff0c;去获取数据&#xff0c;显示图片&#xff0c;实时分析等&#xff0c;测试demo的链接如下&#xff1a; Dalsa线扫相机-二次开发-QT-C 可用Demo&#xff08;一&#xff09;_dalsa开发-CSDN博客 前段时间&am…

基于Java+SpringBoot+Vue+MySQL的在线装修管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于SpringBootVue的在线装修管理系统【附源码文档】、前后…

解决Springboot项目Maven下载依赖速度慢的问题

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

数学建模笔记

1.三级表的制作 打开word找到插入并点击表格 随机生成一个表格&#xff0c;然后去修改表格样式&#xff0c;把格式应用于选到标题行&#xff0c;然后点击格式&#xff0c;选到边框和底纹&#xff0c;把宽度改为1.5磅&#xff0c;然后点击上下俩个田字&#xff0c;预览图会出现…

RabbitMQ中间件监控指标解读

监控易是一款全面的IT监控软件&#xff0c;能够实时监控各种IT资源和应用&#xff0c;确保系统的稳定运行。在RabbitMQ中间件的监控方面&#xff0c;监控易提供了详尽的监测指标&#xff0c;帮助用户深入了解RabbitMQ集群的运行状态和性能表现。 一、集群监控&#xff08;sdds…

飞思相机存储卡格式化数据如何恢复?提供全面指南

在数字摄影时代&#xff0c;‌飞思相机以其卓越的成像质量和专业的性能&#xff0c;‌赢得了众多摄影师的青睐。‌然而&#xff0c;‌即使是专业的设备也难免遭遇数据丢失的困境&#xff0c;‌尤其是当存储卡不幸被格式化时。‌面对这一突如其来的灾难&#xff0c;‌许多摄影师…

thinkphp8 定时任务 addArgument

在ThinkPHP8中&#xff0c;我们可以使用addArgument方法来添加命令行参数。这个方法允许我们定义命令行参数&#xff0c;并且可以指定参数的模式&#xff08;例如&#xff1a;是否必须&#xff0c;是否可选&#xff09;。 以下是一个简单的例子&#xff0c;演示如何在ThinkPHP…

SAP2 - 系统管理课程 System Administration Course

资料来源 -- SAP System Administration SAP System Administration SAP Systems Administrators are responsible for maintaining the ongoing reliability, performance, management, and support of SAP application environments supporting education, research, admini…

9月1日起,这些知识产权新规正式实施

9月1日起&#xff0c;一批知识产权新规将正式实施&#xff01;一起来看&#xff0c;哪些与你相关&#xff1f; 9月1日起&#xff01;《高价值发明专利培育工作指南》《专利申请预审规范》地方标准实施 日前&#xff0c;贵阳市市场监督管理局批准发布《高价值发明专利培育工作指…

Apache + Tomcat + ajp 协议配置

前端 web 服务器使用 apache 的好处就不在赘述&#xff0c;这里重点讲一下如何使用 ajp 协议和 http 协议与后端 tomcat 服务器通信的区别。 apache作为代理服务器可以使用 http 协议与后端 tomcat 服务器进行通信&#xff0c;也可以使用 ajp 协议与 tomcat 通信。两者的主要区…

linux --- CentOS 7 环境下编译安装OpenCV For Java

linux环境下编译安装OpenCV For Java(CentOS 7) 1、基础环境安装 在这里插入代码片# 安装 SCL 源 yum install -y centos-release-scl # 安装 gcc8 g++8 yum install -y devtoolset-8-gcc*#设置环境变量 echo source /opt/rh/devtoolset-8/enable >> /etc/profile#使环…

产品概述Tektronix泰克TCP0030A电流探头TCP0030原装二手

产品概述 Tekronix TCP0030 AC/DC 电流探头是一款高性能且易于使用的探头&#xff0c;它通过可选测量范围增强了带宽&#xff0c;同时还提供了低电流测量能力和精度。Tektronix TCP0030 探头专为具有 TekVPI 探头接口的示波器而设计。 Tektronix TCP0030 AC/DC 电流探头的功能…

哲学家进餐问题

哲学家进餐问题&#xff08;The Dining Philosophers Problem&#xff09;是计算机科学中的经典同步问题&#xff0c;由荷兰计算机科学家埃德斯赫伯戴克斯特拉&#xff08;Edsger Dijkstra&#xff09;提出。该问题用来说明如何避免死锁&#xff08;deadlock&#xff09;和资源…

[学术论文] KBS期刊介绍及投稿流程学习笔记

该专栏主要是论文投稿的记录笔记&#xff0c;希望对初学者有所帮助&#xff0c;也希望大家论文都能命中。这篇文章主要介绍人工智能一区期刊Knowledge-Based Systems的投稿笔记&#xff0c;希望您喜欢&#xff01; 文章目录 一.期刊介绍二.投稿地址及模板1.投稿地址2.LaTex下载…

c++命令模式

一.概念 命令模式&#xff08;Command Pattern&#xff09;是一种行为设计模式&#xff0c;它将请求封装为对象&#xff0c;从而使您可以使用不同的请求、队列或日志请求&#xff0c;以及支持可撤销操作。命令模式的主要组成部分包括&#xff1a; 命令接口&#xff08;Comman…