弟12章 网络编程

Qt 6.12 单服务器多客户端网络编程实战项目 Qt是一个跨平台的C++框架,它提供了一套完备的网络编程模块,允许开发者在应用程序中实现复杂的网络通信功能。Qt网络模块提供了对TCP/IP和UDP协议的高级封装,简化了网络编程的复杂性,允许开发者快速构建客户端和服务器应用。Qt 中的信号和槽机制是其事件处理的核心概念,它提供了一种松耦合的方式来进行对象间的通信。信号是在类的内部声明的一种特殊的函数,当事件发生时(如按钮点击或数据接收),它可以被发射。槽函数则类似于常规的成员函数,它们能够响应信号并进行操作。 阅读详情

网络协议概述 p164

ipv4:十进制点分制
ipv6:十六进制冒号分隔

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

TCP协议与UDP协议的区别 p165

tcp协议的三次握手:
在这里插入图片描述

udp协议:又称为用户数据包协议(User Datagram Protocol),它是面向无连接的协议,只要知道对方的ip地址和端口,就可以直接发送数据包,由于是面向无连接的,所以无法保证数据一定会到达接收方

tcp比喻成打电话,udp比喻成发短信

tcp和udp都是传输层的协议


什么是端口号?
区分计算机中的运行的应用程序的整数
端口号的取值范围是0到65535,一共65536个,其中80这个端口号分配给HTTP服务,21这个端口号分配给了FTP服务,1433是分给了SQL server数据库


TCP和UDP的区别

TCP协议UDP协议
连接方面面向连接的面向无连接
安全方面传输可靠不丢失,不丢失,按顺序到达无法保证不丢包
传输效率方面传输效率相对较低传输效率高
连接对象数量方面只能点对点 一对一支持一对一,一对多,多对多的交互通信

socket简介

描述ip地址和端口号

在这里插入图片描述


socket对象的常用方法

方法名称功能描述
bind((ip,port))绑定ip地址和端口
listen(N)开始TCP监听,N表示操作系统挂起的最大连接数量,取值范围1-5之间,一般设置为5
accept()被动接收TCP客户端连接,阻塞式,返回一个元组,分别是客户端socket和客户端地址
connect((ip,port))主动初始化TCP服务器连接
recv(size)接收TCP数据,返回值为字符串类型,size表示要接收的最大数据量
send(str)发送tcp数据,返回值是要发送的字节数量
sendall(str)完整发送tcp数据,将str中的数据发送到连接的套接字,返回之前尝试发送所有数据,若成功为None,失败抛出异常
recvfrom()接收udp数据,返回值是一个元组(data,address),data表示接收的数据,address表示发送数据的套接字地址
sendto(data,(ip,port))发送udp数据,返回值是发送的字节数
close()关闭套接字

TCP服务器端代码的编写 p166

TCP服务器端流程

1、使用socket类创建一个套接字对象
2、使用bind((ip,port))方法绑定ip地址和端口号
3、使用listen()方法开始TCP监听
4、使用accept()方法等待客户端的连接
5、使用recv() / send() 方法接收和发送数据
6、使用close() 关闭套接字

代码示例:

from socket import socket,AF_INET,SOCK_STREAM
# AF_INET用于internet之间的进程通信
# SOCK_STREAM表示TCP协议

# 1、创建socket模块
server_socket=socket(AF_INET,SOCK_STREAM)
# print(type(server_socket)) # <class 'socket.socket'>

# 2、绑定ip地址和端口
ip='127.0.0.1' # 表示连接本机
port=8888 # 不要和已有的指定端口冲突,比如sql服务的port是3306
server_socket.bind((ip,port)) # bind参数是一个元组

# 3、使用listen()开始监听
server_socket.listen(5)
print('服务器已启动(客户端连接成功后,服务器的代码才会向下执行)')

# 4、等待客户端的连接
client_socket,client_addr=server_socket.accept() # accept方法返回一个元组类型,通过系列解包赋值分别赋值给左边
print(type(client_socket))
print(type(client_addr))

# 5、接收来自客户端的数据
data=client_socket.recv(1024) # 返回值是一个字符串类型,最大值为1024
print('客户端发送过来的数据为:',data.decode('UTF-8'))

# 6、关闭socket
server_socket.close()

TCP客户端代码的编写 p167

TCP客户端流程

1、使用socket类创建一个套接字对象
2、使用connect((host,port))设置连接的主机ip和主机设置的端口
3、使用 recv() / send() 方法接收/发送数据
4、使用close()关闭套接字

本电脑上已经有一个project在运行服务器端代码。
此时需要新建一个项目代表另一台电脑,去跑客户端代码。


右上角 FIle ,然后 new project

在这里插入图片描述

然后设置新project的路径

在这里插入图片描述

然后选择新窗口打开,从而运行了两个Pycharm
在这里插入图片描述

代码示例:

import socket

# 1、创建socket对象
client_socket=socket.socket() # 服务器端要加参数,客户端不需要

# 2、通过ip和port连接服务器
ip='127.0.0.1'
port=8888
client_socket.connect((ip,port))
print('客户端和服务器端的连接建立成功')

# 3、发送数据
client_socket.send('welcome to Python world'.encode('UTF-8'))
# client_socket.send('welcome to Python world') 不能直接发送发送字符串 TypeError: a bytes-like object is required, not 'str'
# 4、关闭
client_socket.close()
print('发送成功')

主机和客户端的通信流程

在这里插入图片描述

tcp多次通信服务器端代码 p168

import socket # 这么写的话就要写socket模块名 from...import不需要写模块名

# 1、创建socket对象
server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

# 2、绑定主机ip和port
server_socket.bind(('127.0.0.1',8888))

# 3、开始监听 最大监听数量设置为5
server_socket.listen(5)

# 4、开始等待客户端的tcp连接
client_socket,cliet_addr=server_socket.accept()

# 5、接收数据
info=client_socket.recv(1024).decode('UTF-8') # 服务器端接收数据时要从client端socket去接
while info!='bye':
    if info:
        print('接收到的数据为:',info)
    # 准备回复的数据
    data=input('请输入要回复的数据:')
    client_socket.send(data.encode('UTF-8')) # 发数据也是从client端去发
    if data=='bye':
        break

    info = client_socket.recv(1024).decode('UTF-8')

# 关闭两个socket对象
client_socket.close()
server_socket.close()

TCP多次通信客户端代码 p169

import socket

# 1、创建socket对象
client_socket=socket.socket() # 客户端这边不需要加参数:AF_INET,SOCK_STREAM这些参数,只有服务器端要加

# 2、连接主机的ip和port
ip='127.0.0.1'
port=8888
client_socket.connect((ip,port)) # 注意参数是个元组
print('与服务器端建立连接')

# 3、客户端先发送数据
info=''
while info!='bye':
    send_data=input('请输入客户端要发送的数据:')
    client_socket.send(send_data.encode('UTF-8'))

    if send_data=='bye':
        print('客户端发起结束')
        break

    info=client_socket.recv(1024).decode('UTF-8')
    print('收到服务器的响应数据:',info)

client_socket.close()

UDP的一次双向通信 p170

udp协议是面向无连接的,只要知道对方的ip和端口号就可以发送数据包,但是不保证数据包能一定送达

udp通信模型

在这里插入图片描述

udp接收方代码

# udp接收方的代码
import socket

# 1、创建socket对象
recv_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

# 2、绑定ip地址和端口
recv_socket.bind(('127.0.0.1',8888))

# 3、接收来自发送方的数据
recv_data,addr=recv_socket.recvfrom(1024) # 注意返回对象是一个元组,系列解包赋值
print('-'*66)
print('接收到的数据为:',recv_data.decode('UTF-8'))
print('接收数据来自:',addr) # 接收数据来自: ('127.0.0.1', 59661)
print('-'*66)

# 4、准备回复对方的数据
data=input('请输入要回复的数据:')

# 5、回复
recv_socket.sendto(data.encode('UTF-8'),addr)

# 6、关闭
recv_socket.close()

udp发送方的代码

# UDP发送方的代码
import socket
'''
AF_INET 表示网络间通信

SOCK_STREAM 表示TCP
SOCK_DGRAM  表示UDP
'''

# 1、创建socket对象
send_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

# 2、准备发送数据
data=input('请输入要发送的数据:')

# 3、指定接收方的ip和port
ip_port=('127.0.0.1',8888)

# 4、发送数据
send_socket.sendto(data.encode('UTF-8'),ip_port)

# 5、接收来自接收方的数据
recv_data,addr=send_socket.recvfrom(1024) # 注意recvfrom返回的是一个元组,使用解包赋值
print('-'*66)
print('接收到的数据为:',recv_data.decode('UTF=8'))
print('接收数据的地址为:',addr)
print('-'*66)

# 6、关闭socket对象
send_socket.close()

模拟客服咨询小程序 p171

模拟udp编程

客服代码

# 客服人员
import socket

recv_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

recv_socket.bind(('127.0.0.1',8888)) # 注意入参是一个元组

while True:
    recv_data,addr=recv_socket.recvfrom(1024) #返回值是一个元组类型,系列解包赋值
    recv_string=recv_data.decode('UTF-8')
    print('客户说:',recv_string)
    print('客户地址:',addr)

    if recv_string=='bye':
        print('服务器端即将推出')
        break

    # 服务器端回复客户端数据
    data=input('回复什么给客户端:')
    recv_socket.sendto(data.encode('UTF-8'),addr) # 注意udp发送数据接口为sendto,参数2为addr


recv_socket.close()

客户代码

# 客户咨询者
import socket

send_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # udp协议收发数据都要加参数 tcp协议收发数据只有服务器端代码要加参数

while True:
    data=input('客户说:')
    send_socket.sendto(data.encode('UTF-8'),('127.0.0.1',8888))

    if data=='bye':
        print('客户端发起结束')
        break

    recv_data,addr=send_socket.recvfrom(1024)
    print('客户端接收数据:',recv_data.decode('UTF-8'))
    print('服务器端地址:',addr)

send_socket.close()

本章总结及习题 p172

网上聊天软件一般是udp

QQ采用的通信协议以UDP为主,辅以TCP协议。

windows系统查看端口号对应的进程pid

看这个

西门子200SMART自定义库开发实战:从PID到露点算法的工业应用 本文详细介绍了西门子200SMART自定义库开发实战,涵盖从PID控制到露点算法的工业应用。通过代码封装技巧、多语言支持和性能优化等高级开发方法,帮助工程师提升PLC编程效率。文章特别强调了自创库在实际项目中的优势,如恒温恒湿控制系统的成功案例,展示了自定义库在工业自动化中的强大应用价值。 阅读详情

相关推荐

STM32平台下FreeModbus TCP协议栈集成指南

深入讲解在STM32平台如何移植和配置freemodbus协议栈,实现TCP通信功能。结合嵌入式开发细节,帮助开发者快速掌握freemodbus的应用与调试技巧。

weixin_36001279的博客 1142

【13章网络编程】鲜为人知的网络编程

【13章网络编程:概述、计算机网络、IP和端口号、网络协议、TCP\IP协议,TCP网络编程,三次握手与四次握手、UDP网络编程,URL编程】

小鳴人的博客 2316

【β-Boltzmann探索策略】

𝜀是一个介于0和1之间的参数,用于控制探索和利用的比例。当𝜀较大时,智能体更倾向于探索;当𝜀较小时,智能体更倾向于利用已知信息。

m0_59385870的博客 1083

《TCP/IP网络编程》<select><epoll>第12章,第17章答案

复用技术是指:在物理资源有限的情况下,通过软件手段让多个任务共享使用同一资源,从而提高资源利用率的技术。举例:电视台的频道复用、CPU 的时间片调度、网络通信中的 I/O 复用,都是典型的复用技术。I/O复用 是其中一种,用于网络编程中。它允许一个进程同时“监视”多个 I/O 对象(如 socket),只在它们有“读写准备就绪”时再处理,这样可以避免线程/进程大量创建,提升并发能力。多进程并发服务器的缺点有哪些?如何在I/O复用服务器端中弥补?

2401_86994729的博客 1576

车载以太网:PHY(物理层)介绍

本文以TJA1101芯片为实例介绍了车载以太网PHY(物理层)组成。

kevin1499的博客 6229

Moviepy自动化剪辑视频中的广告

本教程展示了如何使用 Python 中的 MoviePy 库,通过检测和剪辑广告段落来实现视频内容的清洁播放。通过广告检测算法和 MoviePy 剪辑功能的结合,可以自动化处理视频,极大提升编辑效率。在学习和应用中,理解广告检测的原理及其实现方法尤为重要,以便针对不同类型的视频进行调整。此外,MoviePy 的灵活性使其适用于多种视频编辑场景,适合自动化内容制作与优化。

Mr数据杨 3406

第12章、网络编程

第12章、网络编程 12.1、Socket 12.1.1、Socket构造方法 public Socket(InetAddress address,int port):创建一个流套接字并将其连接到指定 IP 地址的指定端口号。 public Socket(String host,int port):创建一个流套接字并将其连接到指定主机上的指定端口号。 12.1.2、Socket常用方法 public InputStream getInputStream():返回此套接字的输入流,可以用于接收消息

LinYuan 233

OpenClaw简介--windows系统安装OpenClaw

在windows安装OpenClaw实现代替人工操作。步骤流程详细,图文并茂。

直到世界的尽头 5348

第12章 C#网络编程综合实验指导

第12章 C#网络编程综合实验指导 本章通过综合性实验指导读者掌握C#网络编程核心技术。12.1节重点讲解动态图形与网络数据可视化的实现方法,包括双缓冲技术消除闪烁、跨线程数据同步等关键问题。以实时网络延迟波形图绘制器为例,详细演示了从窗体设计、数据结构初始化到绘图逻辑实现的完整流程,涵盖GDI+绘图、定时器数据模拟和界面交互等核心知识点。通过实验案例,读者能够理解网络数据可视化应用的开发模式,并掌握Windows Forms下高性能动态绘制的优化技巧。

小宝哥Code的专栏 430

GPT-5.5 是真好用!SCI论文润色与学术写作能力上全面提升,全流程指令已整理好!

输出规范:先输出完整的摘要正文,不添加额外说明,以Markdown表格形式提供中文自检说明,表格包含两列,列标题为“检查项”和“说明”,逐项说明是否已覆盖背景、研究问题、方法、结果及贡献,并简要评价摘要结构与表达是否符合要求,除上述内容外不输出其他信息。:你是一位(学术写作专家/期刊审稿人/论文评审专家),精通学术写作规范、逻辑结构、语法准确性及学术表达方式,你的任务是帮助提升论文的质量,包括语言润色、语法检查、逻辑优化和降低重复率。语言需简洁、正式、具有概括性,不展开具体论述,仅提供结构与要点说明。

智能AI让学术科研更容易 289

提高RFID检测距离以及检测速度的方法总结

摘要:提高RFID检测距离需优化阅读器功率、标签灵敏度、天线设计及频段选择,同时减少环境干扰;提升检测速度则需改进防碰撞算法、增强并行处理能力、精简数据传输。实际应用需平衡两者关系,如物流仓储采用UHF频段、高增益天线和动态Q算法实现远距离高速读取,ETC系统则通过微波频段和高速调制实现超远距离快速识别。不同场景需针对性优化硬件配置和系统参数。

start_up_go的博客 290

Python学习 第12章-网络编程

注:本文中的内容及示例均出自@Python_子木的视频。示例12-3多次通信服务器端的代码。示例12-4多次通信客户端的代码。示例12-1服务器端代码编写。示例12-2客户端的代码编写。示例12-5UDP的发送方。示例12-6UDP的接收方。示例12-8客户咨询者。示例12-7客服人员。

efan1982的专栏 506

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

12 java网络编程

网络编程章节,主要是把IO流的知识使用在网络上,用于网络传输。 网络传输其实也是一种IO流的方式。

qq_34106499的博客 415

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Go 语言从入门到进阶 | 第 12 章:网络编程

《Go语言网络编程》摘要:本章深入讲解Go语言的网络编程核心机制,重点介绍net包提供的TCP/UDP接口体系,包括Conn、Listener和PacketConn三大核心接口。内容涵盖网络连接建立(Dial/Listen)、TCP/UDP编程实践、HTTP服务器构建及客户端请求处理,并详细解析Go 1.22+的路由增强特性。通过学习可掌握网络地址处理(net/url)、文本协议(net/textproto)等辅助包的使用,以及HTTP中间件设计模式。文章结合Go 1.26.2源码分析底层实现,适合已完成基

weixin_43674738的博客 891

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Python之路【第12章】:Python网络编程

Python网络编程 C/S架构 osi七层 socket层 socket是什么 套接字发展史及分类 套接字工作流程 基于TCP的套接字 基于UDP的套接字 粘包现象 什么是粘包 解决粘包的方法 认证客户端的链接合法性 socketserver模块实现并发 ...

aijiaolao2823的博客 197

Python的秘密基地--[章节12] Python 网络编程

Python 提供了强大的网络编程能力,从构建简单的客户端与服务器通信,到开发复杂的分布式系统,均能轻松实现。本章将带你深入了解 Python 的网络编程,包括使用标准库构建网络应用、处理 HTTP 请求,以及开发基于异步的高效网络服务。是一个功能强大的第三方 HTTP 库,支持发送各种类型的 HTTP 请求。模块,可以高效处理大规模的异步 I/O 操作。模块支持安全的 HTTPS 通信。模块是底层网络编程的核心。

Hellc007的博客 1303

第12天 面向网络编程

第12天 面向网络编程 今日内容介绍  网络编程概述  UDP  TCP 第1章 网络编程概述 1.1 网络协议 通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,这就好比在道路中行驶的汽车一定要遵守交通规则一样。在计算机网络中,这些连接和通信的规则被称为网络通信协议,它对数据的传输格式、传输速率、传输步骤等做了统一规定,通...

龙七 206

【c++ primer 笔记】第12章 动态内存

🎉作者简介:👓博主在读机器人研究生,目前研一。对计算机后端感兴趣,喜欢c++,go,python,目前熟悉c++,go语言,数据库,网络编程,了解分布式等相关内容📃个人主页:🔎支持👍就是给予我最大的支持!🎁💛本文摘要💛。

小呆鸟blog 642

视频教程-《Linux系统编程、网络编程》第10章 网络编程-物联网技术

《Linux系统编程、网络编程》第10章 网络编程 2008年毕业于沈阳航...

weixin_26987495的博客 194

第15章 网络编程

基础知识 TCP/IP协议 缩写 全称 协议类型 IP Internet Protocol 网络协议 TCP Transmission Control Protocal 传输控制协议 IP地址 含义:网络中,通信实体(可以是主机、打印机、路由器端口等)的唯一标识 格式:32bit的整数,用圆点隔成4个8位的二进制数,转换成十进制数在0~255之间 端口 含义:应用程序与外界交流的出入口。不同程序,端口不同 格式:16位的整数,0~65535,分成三类 范围 端口类型 用途

Ailsa2019的博客 1119

第13章 网络编程

1 /***************** 2 ***第13章 网络编程 3 *******知识点: 4 **************1.基本概念 5 ******************1.1 网络OSI模型 6 ******************1.2 IP地址 7 ******************1.3 端口地址 8 *****...

FAN15378785757的博客 273

Python中12道常见网络编程面试题

今天在找Python网络编程的题目,发现了一篇不错的网络编程的推文,分享给大家,总共罗列出最常见的12道编程题 。大家可以先看看题目,看看自己是否都能答个大概 。1.简述 OSI 七层协...

程序IT圈 353

12. 网络编程

Golang 提供了强大的网络编程支持,通过标准库net和net/http等包,可以轻松实现 TCP、UDP、HTTP 和 WebSocket 编程。无论是简单的 HTTP 客户端请求还是复杂的 WebSocket 全双工通信,Golang 都有完善的库和工具来帮助开发者实现高效可靠的网络应用。

qq_28791753的博客 6011

【JavaSE 知识框架】12 网络编程

【 网络编程】{网络编程概述}{网络通信要素概述} {通信要素1:IP和端口号}{通信要素2:网络协议} {TCP网络编程}{UDP网络编程}{URL编程}

woailuo8214的博客 697

2021-12-23 十六、网络编程

网络编程1. 网络编程概述2. 网络通信要素概述2.1 IP和端口号 1. 网络编程概述 Java是Internet 上的语言,它从语言级上提供了对网络应用程序的支持,程序员能够很容易开发常见的网络应用程序。 Java提供的网络类库,可以实现无痛的网络连接,联网的底层细节被隐藏在Java 的本机安装系统里,由JVM 进行控制。并且Java 实现了一个跨平台的网络库,程序员面对的是一个统一的网络编程环境。 网络编程的目的:直接或间接地通过网络协议与其它计算机实现数据交换,进行通讯。 网络编程中有两个主要的

weixin_43901488的博客 767

12、(Go语言)网络编程

GO语言网络编程

行走的皮卡丘 834
上一篇: 第11章 2 文件和io操作 +
下一篇: 第13章 1 进程和线程
你板子冒烟了
博客等级 码龄8年 1278粉丝 582原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值