【qt】基于tcp的客户端搭建

news2024/11/14 16:37:30

ui界面设计

我们给客户端提供服务器的ip地址,以及服务器的端口号
1.界面设计
在这里插入图片描述
2.修改对象名称

在这里插入图片描述

代码实现

断开按键的槽函数处理
在这里插入图片描述

转到槽,然后实现槽函数,直接关闭该窗口,就可以了


连接槽函数编写,首先要支持网络通信,在pro里面图示位置+network
在这里插入图片描述
加tcp头文件
在这里插入图片描述
在这里插入图片描述
在连接时需要connectToHost,我们可以在帮助里面查一下
在这里插入图片描述
我们需要调用connectToHost,所以我们需要定义一个QTcpSocket* socket,然后在构造函数中new一个QTcpSocket来调用connectToHost,做法如下:
在这里插入图片描述
在这里插入图片描述

客户端完整代码

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QTcpSocket>
#include<QString>
#include<QHostAddress>
#include<QMessageBox>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_closebutton_clicked();

    void on_connectbutton_clicked();

private:
    Ui::Widget *ui;
    QTcpSocket* socket;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    socket =new QTcpSocket;
}

Widget::~Widget()
{
    delete ui;
}


void Widget::on_closebutton_clicked()
{
    this->close();
}

void Widget::on_connectbutton_clicked()
{
    QString ip=ui->iplabel->text();
    QString port=ui->portlabel->text();

   socket->connectToHost(QHostAddress(ip),port.toShort());

   connect(socket,&QTcpSocket::connected,[this]()
   {

    QMessageBox::information(this,"连接提示","连接成功");


   });

   connect(socket,&QTcpSocket::disconnected,[this]()
   {

    QMessageBox::warning(this,"连接提示","连接异常");


   });


}

服务端代码

我直接给出了
main.cc

#include<iostream>
#include"tcpserver.hpp"
#include<memory>
#include<cstdio>
using namespace std;
int main(int argc,char*argv[])
{
  if(argc!=2)
  {
   cout<<"please:"<<"./server port[1024+]"<<endl;
  }
  uint16_t port=stoi(argv[1]);
  unique_ptr<tcpserver> ser(new tcpserver(port));
  ser->init();
  ser->run();
  return 0;
 


  
}

tcpserver.hpp

#pragma once 
#include<iostream>
#include<string>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include<unistd.h>
#include<cstring>
using namespace std;
uint16_t defaultport=8080;
string defaultip="0.0.0.0";
const int backlog=5;
class tcpserver
{
public:
tcpserver(uint16_t& port=defaultport,string& ip=defaultip)
:sockfd_(0)
,tcpip_(ip)
,tcpport_(port)
{

}
void init()
{
 sockfd_=socket(AF_INET,SOCK_STREAM,0);
 if(sockfd_<0)
 {cout<<"创建套接字失败"<<endl;}
 cout<<"创建套接字成功"<<endl;


 //绑定
 struct sockaddr_in client;
 client.sin_family=AF_INET;
 client.sin_port=htons(tcpport_);
 //char str[32];
 inet_aton(tcpip_.c_str(),&client.sin_addr);
 int len=sizeof(client);


 if(bind(sockfd_,(const sockaddr*)&client,len)<0)
 {
   cout<<"绑定失败"<<endl;
   exit(1);

 }
   cout<<"绑定成功"<<endl;



   int n=listen(sockfd_,backlog);
   if(n<0)
   {cout<<"监听失败"<<endl;}
   cout<<"监听成功"<<endl;

}

void run()
{
  while(true)
  {
  struct sockaddr_in local;

  
   socklen_t len=sizeof(local);

  int sockfd=accept(sockfd_,(sockaddr*)&local,&len);
  if(sockfd>0){
    cout<<"三次握手成功"<<endl;
  

  }
       char buffer[4096];

    
  while(1)
  {
  int n=read(sockfd,buffer,sizeof(buffer));
  if(n>0)
  {
   buffer[n]=0;
   cout<<"client say#"<<buffer<<endl;



   string message="server say#";
   message+=buffer;
   cout<<message<<endl;



  write(sockfd,message.c_str(),message.size());


   }


  }





  
  
  











  }



}



~tcpserver()
{





}
private:

string tcpip_;
int sockfd_;
uint16_t tcpport_;







};

makefile

server:main.cc
	g++ -o server main.cc 
.PHONY:clean
clean:
	rm -rf server 

效果演示

tcp客户端

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2042301.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C# 解析html

C#解析html库 网上查找有如下几个库 SGMLReader (好久不更新了)html-agility-pack(活跃)AngleSharp(活跃)CsQuery(好久不更新) 选择AngleSharp 原因:能向写js一样获取元素 安装AngleSharp 1.2.0-beta.431 using AngleSharp.Html.Parser;namespace HtmlParse01;class Progr…

示波法电子血压原理

血压是指血液在血管内流动时作用于单位面积血管壁的侧压力&#xff0c;它是推动血液在血管内流动的动力。在不同血管内被分别称为动脉血压、毛细血管压和静脉血压&#xff0c;通常所说的血压是指体循环的动脉血压。 血压正常范围值&#xff1a;收缩压130mmHg&#xff0c;舒张压…

【Python学习-UI界面】PyQt5 小部件9-QMenuBar,QMenuQAction 菜单栏

样式如下: 在pyqt5中直接添加就行&#xff0c;子项只能输入英文&#xff0c;输入中文的方式待研究 一个水平的 QMenuBar 位于QMainWindow对象的标题栏下方&#xff0c;用于显示QMenu对象。 QMenu 类提供了一个可以添加到菜单栏的小部件。它还用于创建上下文菜单和弹出菜单。…

基于YOLOv10深度学习的草莓成熟度检测与识别系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、人工智能

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

SpringCloud完整教程

一下内容为本人在听黑马程序员的课程时整理的 微服务技术栈 ⎛⎝≥⏝⏝≤⎛⎝ ⎛⎝≥⏝⏝≤⎛⎝ ⎛⎝≥⏝⏝≤⎛⎝ ⎛⎝≥⏝⏝≤⎛⎝ 1、微服务框架 1.1、认识微服务 1.1.1、服务架构演变 **单体架构&#xff1a;**将业务的所有功能集中在一个项目中开发&#xff0c;打包成…

TypeScript 编译选项

编译TS 编译 .ts 文件&#xff1a; tsc app.ts执行命令tsc app.ts 可以把 单个文件 app.ts编译成 app.js。 这个命令需要每次编译时手动执行。 自动编译文件 tsc app.ts -w // 或者 tsc app.ts --watch通常 -w 或 --watch 指令用于启动 TypeScript 编译器的监视模式。 编译…

梅丽尔·斯特里普表演艺术家中心对外开放并恢复线下活动 体现了她的“卓越”

梅丽尔斯特里普表演艺术家中心对外开放并恢复线下活动 体现了她的“卓越” 2024-08-14 20:38 发布于&#xff1a;河北省 该中心将为美国演员工会和美国电视广播艺人协会的艺术家提供资源和机会&#xff0c;而且全部免费 同时命名的还有汤姆汉克斯和丽塔威尔逊放映室、妮可…

工业WiFi网关在工业领域的具体应用-天拓四方

工业WIFI网关在工业领域的应用已经变得极为广泛&#xff0c;它不仅是连接工业设备、传感器与云平台之间的桥梁&#xff0c;更是推动工业智能化和自动化的重要动力。下面将进一步详细介绍工业WiFi网关在工业领域的一些具体应用。 工业自动化生产&#xff1a; 在工业自动化生产…

算法力扣刷题记录 八十一【343. 整数拆分】

前言 动态规划第8篇。记录 八十一【343. 整数拆分】 一、题目阅读 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。返回 最大乘积 。 示例 1: 输入: n 2 输出: 1 解释: 2 1 1, 1 …

货代企业转型海外仓,会面临哪些难点?

根据数据统计&#xff0c;跨境电商出口B2C物流市场规模已经达到3825亿元&#xff0c;其中海外仓物流以2102亿的规模以及55%的市场份额成为主流。从细分领域看&#xff0c;其中FBA物流、第三方仓、自建仓的市场规模分别达到1156亿、736亿、210亿。 在跨境物流行业中&#xff0c…

uniapp粘贴板地址识别 address-parse插件的使用

1&#xff1a; 插件安装 主要是依靠 address-parse 这个插件&#xff1a; 官网 收货地址自动识别 支持pc、h5、微信小程序 - DCloud 插件市场 // 首先需要引入插件 npm install address-parse --save 2&#xff1a;html部分 <view class""><view class&quo…

QT、C++简单界面设计

#include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {---------------------窗口设置----------------------this->setWindowTitle("南城贤子摄影工作室");//设置窗口标题this->setWindowIcon(QIcon("d:\\Pictures\\C…

并发编程 | 线程池的手动创建

手动创建线程的弊端 在前面我们讲了手动创建线程的使用方式&#xff1a;当一个任务过来&#xff0c;创建一个线程&#xff0c;线程执行完了任务马上又销毁&#xff0c;然后下一次任务过来又重新创建线程&#xff0c;执行完任务再销毁&#xff0c;周而复始。 那么会导致这样一…

【数据结构】-----红黑树

目录 前言 一、what is it&#xff1f; 二、How achieve it&#xff1f; Ⅰ、结点类 Ⅱ、实现 插入 情况一&#xff1a;叔叔存在且为红色 情况二&#xff1a;叔叔不存在或者叔叔为黑色 旋转 验证 ①验证中序遍历 ②验证是否满足红黑树的性质 Ⅲ、完整实现代码 三、A…

【课程总结】day22:Qwen模型的体验

前言 在上一章【课程总结】day21&#xff08;下&#xff09;&#xff1a;大模型的三大架构及T5体验中&#xff0c;我们体验了Encoder-Decoder架构的T5模型。本章内容&#xff0c;我们将以Decoder-Only架构的Qwen模型入手&#xff0c;了解Qwen模型结构、聊天模板的概念以及通过…

类型注解-type hint

目录 一、基本介绍 1、为什么需要类型注解 2、类型注解作用和说明 二、变量的类型注解 1、基本语法 2、基本数据类型注解 3、实例对象类型注解 4、容器类型注解 5、容器详细类型注解 6、在注释中使用注解 三、函数(方法)的类型注解 1、基本语法 2、代码演示 四、…

WebService基础学习

一、XML回顾 二、HTTP协议回顾 三、复习准备 四、关于Web Service的几个问题 五、Web Service中的几个重要术语 六、开发webservice 七、WebService面试题

python面向对象三大特征之---封装,私有属性和私有方法,property功能; 继承,重写,object类;多态;类的深拷贝和浅拷贝

1.面向对象三大特征 封装 1.类属性的创建&#xff1a; 2.属性的访问&#xff1a; 私有属性和方法在类外访问的方法也有&#xff1a;不推荐 对象名._类名__私有方法() 对象名._类名__私有属性3.property功能 在Python中&#xff0c;property 是一个内置的功能&#xff0c;它…

jar包在linux无法直接获取resources文件夹下的文件

windows下&#xff0c;通过hutool的FileUtil.file()就可以获取到文件&#xff0c;通过MailUtil.send()将邮件带附件的方式成功&#xff0c;携带附件发邮件。 linux下部署&#xff0c;截图中的FileUtil.file()是拿不到文件的&#xff0c;报IOException while sending message&a…

「团结引擎1.2.0」正式上线!功能全面升级

「团结引擎 1.2.0」来啦&#xff0c;继上次大版本更新又过了三个月&#xff0c;这段时间我们的研发团队一直在收集用户反馈&#xff0c;更新引擎功能。 本次技术更新的内容&#xff0c;涵盖了微信小游戏、团结引擎车机版、OpenHarmony、Audio、Virtual Geometry、Open Euler/A…