弟12章 网络编程

news/2024/2/23 16:23:19/文章来源:https://blog.csdn.net/engineer0/article/details/135576747

文章目录

    • 网络协议概述 p164
    • TCP协议与UDP协议的区别 p165
    • TCP服务器端代码的编写 p166
      • TCP服务器端流程
    • TCP客户端代码的编写 p167
      • TCP客户端流程
      • 主机和客户端的通信流程
    • tcp多次通信服务器端代码 p168
    • TCP多次通信客户端代码 p169
    • UDP的一次双向通信 p170
      • udp通信模型
      • udp接收方代码
      • udp发送方的代码
    • 模拟客服咨询小程序 p171
      • 客服代码
      • 客户代码
    • 本章总结及习题 p172
    • windows系统查看端口号对应的进程pid

网络协议概述 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':breakinfo = 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('客户端发起结束')breakinfo=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 socketrecv_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为addrrecv_socket.close()

客户代码

# 客户咨询者
import socketsend_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('客户端发起结束')breakrecv_data,addr=send_socket.recvfrom(1024)print('客户端接收数据:',recv_data.decode('UTF-8'))print('服务器端地址:',addr)send_socket.close()

本章总结及习题 p172

网上聊天软件一般是udp

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

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

看这个

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

生活的再思考,写在开篇

近几年的就业行情很特别&#xff0c;特别是对中年人&#xff0c;早先网络上主流的声音是动不动总包百万&#xff0c;手握几个 Offer &#xff0c;纠结应该去哪里。现在的主流声音变成了&#xff0c;被毕业优化掉后几个月都没找到合适的工作&#xff0c;焦虑迷茫无所适从&#x…

第5章案例课:部署Tomcat及其负载均衡

这个实验需要3台虚拟机 192.168.9.40 9.31 9.32 去FTP 下载软件包 192.168.9.40 和 192.168.9.31 都要这里面的配置[rootnode1 ~]# mount /dev/cdrom /mnt/ //挂载[rootnode1 ~]# rpm -ivh /mnt/Packages/ftp-0.17-67.el7.x86_64.rpm //下载 FTP 软件包[roo…

发送HTTP POST请求并处理响应

发送HTTP POST请求并处理响应是Web开发中的常见任务。在Go语言中&#xff0c;可以使用net/http包来发送HTTP POST请求并处理响应。 以下是一个示例代码&#xff0c;演示了如何发送HTTP POST请求并处理响应&#xff1a; go复制代码 package main import ( "b…

模拟开关灯

1&#xff0e;  实验任务 如图所示&#xff0c;监视开关K1&#xff08;接在P3.0端口上&#xff09;&#xff0c;用发光二极管L1&#xff08;接在单片机P1.0端口上&#xff09;显示开关状态&#xff0c;如果开关合上&#xff0c;L1亮&#xff0c;开关打开&#xff0c;L1熄灭。…

51单片机_电子时钟电子万年历电子闹钟

实物演示效果&#xff1a; https://www.bilibili.com/video/BV1RN4y1Q7dK/?vd_source6ff7cd03af95cd504b60511ef9373a1d 二、液晶对比度的调节 液晶的内容要清晰显示&#xff0c;就要调节电位器来调节液晶的对比度&#xff0c;这个电位器位于液 晶的下面&#xff0c;可以用…

网络服务之DHCP

目录 一、DHCP是什么&#xff1f; 1、DHCP就是动态主机配置协议 2、DHCP的作用&#xff1a; 3、DHCP是应用层协议 二、DHCP的优点 三、DHCP的分配过程 1、自动分配&#xff1a;分配到一个ip地址后永久使用 2、手动配置&#xff1a;由DHCP服务器管理员专门指定ip地址&am…

NFS(Network File System 网络文件服务)

一&#xff0c;nfs 简介 1&#xff0c;nfs 性质 NFS&#xff08;Network File System 网络文件服务&#xff09; 文件系统&#xff08;软件&#xff09;文件的权限 NFS 是一种基于 TCP/IP 传输的网络文件系统协议 通过使用 NFS 协议&#xff0c;客户机可以像访问本地目录一样…

.Net 8.0 Web API Controllers 添加到 windows 服务

示例源码下载&#xff1a;https://download.csdn.net/download/hefeng_aspnet/88747022 创建 Windows 服务的方法之一是从工作线程服务模板开始。 但是&#xff0c;如果您希望能够让它托管 API 控制器&#xff08;也许是为了查看它正在运行的进程的状态&#xff09;&#xff0…

微软推出付费版Copilot

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 微软已经超越苹果&#xff0c;成了全球市值最高的公司&#xff0c;其他公司都因为AI大裁员&#xff0c;而微软正好相反&#xff0c;当然这个原因很简单&#xff1a;就是微软强制把AI全面接入到系统里来了。而Copilot…

在线的货币兑换平台源码下载

在线的货币兑换平台&#xff0c;可帮助全球各地的个人和企业将货币从一种货币兑换为另一种货币。该货币兑换平台是 Codecanyon 中最先进的脚本。 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/88728084

Android签名打包报错:Lint found fatal errors while assembling a release target.

1. Android签名打包报错&#xff1a;Lint found fatal errors while assembling a release target. 1.1. 问题 Android项目打debug 包的时候没问题&#xff0c;但是在打release迭代测试版本时候无法打包。Lint found fatal errors while assembling a release target. 1.2. …

【centos7系统】Redis-6.2.2版本集群搭建

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 前redis最新版本已经是6.2.4&#xff0c;在集群搭建上和redis3.x、redis4.x区别很大。redis5以后&#xff0c;就不需要安装ruby了…

软件测试|pycharm关联GitHub的详细步骤

简介 GitHub 是全球最大的开源代码托管平台之一&#xff0c;而 PyCharm 是一款强大的 Python 集成开发环境。将两者结合使用&#xff0c;可以提高团队协作和代码管理的效率。本文将详细介绍如何在 PyCharm 中管理 GitHub 账号&#xff0c;包括如何设置 GitHub 账号、创建新仓库…

Python基础知识:整理15 列表的sort方法

1 sorted() 方法 之前我们学习过 sorted() 方法&#xff0c;可以对列表、元组、集合及字典进行排序 # 1.列表 ls [1, 10, 8, 4, 5] ls_new sorted(ls, reverseTrue) print(ls_new) …

JVM:双亲委派机制类加载器

JVM&#xff1a;双亲委派机制 1. 例子2. 类加载器总结3. 类加载过程4. 双亲委派模型的执行流程&#xff1a;5. 双亲委派模型的好处 1. 例子 Java运行时环境有一个java.lang包&#xff0c;里面有一个ClassLoader类 我们自定义一个String类在java.lang包下&#xff0c;下面的…

如何安装“MySQL在虚拟机ubuntu”win10系统?

1、 更新列表 sudo apt-get update 2、 安装MySQL服务器 sudo apt-get install mysql-server 3、 安装MySQL客户端 sudo apt-get install mysql-client 4、 配置MySQL sudo mysql_secure_installation 5、 测试MySQL systemctl status mysql.service MySQL数据库基本…

QT 绘图与重绘事件

代码实现仪表盘 .cpp #include "widget.h" #include "ui_widget.h"#include <QPainter> #include <QPen> #include <QBrush>#include <QDebug> Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->…

ROS第 2 课 ROS 系统安装和环境搭建

文章目录 方法一&#xff1a;一键安装&#xff08;推荐&#xff09;方法二&#xff1a;逐步安装&#xff08;常规安装方式&#xff09;1.版本选择2.检查 Ubuntu 的软件和更新源3.设置 ROS 的下载源3.1 设置国内下载源3.2 设置公匙3.3 更新软件包 4. 安装 ROS5. 设置环境变量6. …

连接超时的问题

连接超时的问题 通用第三方工具连接超时 connect timeout 方案一&#xff1a; /etc/ssh/sshd_config node1上操作&#xff0c;图是错的 方案二&#xff1a; windows上Hosts文件域名解析有问题 比如&#xff1a; 192.168.xx.100 node1 192.168.xx.161 node1 两个都解析成node…

数学的雨伞下:理解世界的乐趣

这本书没有一个公式&#xff0c;却讲透了数学的本质&#xff01; 《数学的雨伞下&#xff1a;理解世界的乐趣》。一本足以刷新观念的好书&#xff0c;从超市到对数再到相对论&#xff0c;娓娓道来。对于思维空间也给出了一个更容易理解的角度。 作者&#xff1a;米卡埃尔•洛奈…