4. 网络编程之TCP编程

news2025/1/11 14:04:36

1. 《计算机网络编程》

我们接触网络编程,肯定是要对网络编程的一些专业术语及基本理论知识是要有所认知的。python网络编程无非是在这些基础理论知识之上给我们提供了一些方便实用的网络库来供我们使用尽管做了非常底层的封装,并且给我们暴露了上层的应用接口,但是读者注意,尽管是这样,我们仍然需要学习基础的网络知识,才更有助于我们的发展。实际上,这些基础知识掌握到头了,无论是python,c++,c#亦或是java等,在正式工作中,我们基本都是使用内置的网络库或第三方网络库去编写程序。有关于网络编程的基础知识,此处将不会过多的讲解。如果有兴趣,可自行参考书籍《计算机网络(第7版)谢希仁版》,这本书基本是所有高校的计算机专业必学的一门课程。这里给出网盘下载地址,根据需要,自行下载即可。
下载地址:
链接:https://pan.baidu.com/s/1GPPdr3RyxhlQJPCQIzbO0Q
提取码:eyef

2. ip地址和端口号

(1) ip地址
整个互联网就是一个单一的、抽象的网路。IP地址就是给互联网上的每一台主机(或路由器)的每一个接口分配一个在全世界范围内是唯一的32位的标识符
(2) 端口号
两台计算机之间的进程进行相互通信,不仅需要对方的IP地址(为了找到计算机),还需要知道对方的端口号(为了找到对方计算机中的具体的应用进程)
(3) 解释
这和我们寄信的过程是类似的。当我们要给某人写信时,就必须在信封上注明收件人的通信地址(这相当于是IP地址)并且还要注明收件人的姓名(因为同一个住所里可能有好多人,这相当于是端口号)。互联网上的计算机通信采用的是C/S架构(客户-服务器)模式。客户端在发起通信请求时,必须先知道对方服务器的IP地址和端口号

3. socket编程

socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。socket是网络编程的一个抽象概念。通常我们用一个Socket表示“打开了一个网络链接”,而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可。
根据RFC 793定义:端口号拼接到IP地址就构成了套接口(socket)。因此,套接字的表示方式是 点分十进制的IP地址后面写上端口号,中间用冒号或逗号隔开。例如,若IP地址为192.168.1.232,端口是8888,那么得到的套接字就是(192.168.1.232:8888)。
总之,我们有:
   套接字 socket = (IP地址 : 端口号)

4. TCP协议的特点

TCP是TCP/IP体系中非常复杂的一个协议。下面介绍一下基本特点。
(1) TCP是面向连接的运输层协议
  这就是说,应用程序在使用TCP协议之前,必须首先建立TCP连接。在传送完数据之后,必须释放已经建立的TCP连接。也就是说,应用进程之间的通信好像是在"打电话":通话前要先拨号建立连接,通话结束后要挂机释放连接。
(2) 每一条TCP连接只能有两个端点
  每一条TCP连接只能是点对点的(一对一)
(3) TCP提供可靠交付的服务
  通过TCP连接传送的数据,无差错、不丢失、不重复,并且按序到达
(4) TCP提供全双工通信
  TCP允许通信双方的应用进程在任何时候都能发送数据。TCP连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。在发送时,应用程序在把数据传送给TCP的缓存后,就可以做自己的事,而TCP在合适的时候把数据发送出去。在接收时,TCP 把收到的数据放入缓存,上层的应用进程在合适的时候读取缓存中的数据。
(5) 面向字节流
  TCP中的“流”(stream)指的是流入到进程或从进程流出的字节序列。
“面向字节流”.的含义是:虽然应用程序和TCP的交互是一次一个数据块〈大小个等),但TCP把应用程序交下来的数据仅仅看成是一连串的无结构的字节流TCP 并不知道所传达的字节流的含义TCP 不保证接收方应用程序所收到的数据块和发送方应用程序所发出的数据块具有对应大小的关系(例如,发送方应用程序交给发送方的TCP共10个数掂坎,但接收方的TCP可能只用了4个数据块就把收到的字节流交付上层的应用程序)。但按收方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样。当然,接收方的应用程序必须有能力识别收到的字节流,把它还原成有意义的应用层数据。(实际上在正式的项目开发中,客户端和服务端之间的数据交互一定会基于自定义的通信协议,这涉及到拆包组包等)

5. TCP编程之客户端

5.1 客户端程序

# 导入socket模块
import socket

# 创建socket对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # SOCK_STREAM代指TCP协议

# 设置端口号
port = 8888

# 连接服务器, 这里连接本地8888端口开启的服务器
s.connect(('127.0.0.1', port))

# 接收小于 1024 字节的数据
while True:
    msg = s.recv(1024)
    print (msg.decode('utf-8'))

# 关闭套接字
s.close()

好,上述一个简单的tcp客户端就写完了,我们需要验证,该如何验证?
为此,我们借助一个网络调试助手NetAssist(可自行下载)。在此处,我们使用NetAssist来开启一个基于本机的8888端口的服务器,当我们运行程序后,如果不出意外,就会建立连接,然后我们在NetAssist中向我们的客户端程序发送数据,客户端这边应该是能收到服务器发来的数据的。

5.2 验证步骤
[a]. 首先开启服务器
在这里插入图片描述
[b]. 运行客户端程序
然后在服务端中向客户端发送数据,进行观察。

在这里插入图片描述
运行程序后,发现客户端和服务器确实建立了连接。并且服务端发送的数据,在客户端也是同样接收到了。

6. TCP编程之服务端

6.1 服务端程序

# 导入相关模块
import socket, threading, time

# 创建socket对象
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定端口
serversocket.bind(('127.0.0.1', 9999))

# 监听端口, 并设置最大连接数
serversocket.listen(5)

def tcplink(sock, addr):
    print('Accept new connection from %s:%s...' % addr)
    sock.send(b'Welcome.')     # 响应客户端
    while True:
        data = sock.recv(1024)
        time.sleep(1)
        if not data or data.decode('utf-8') == 'exit':
            break
        sock.send(('Hello, %s!' % data.decode('utf-8')).encode('utf-8')) # 响应客户端
    sock.close()
    print('Connection from %s:%s closed.' % addr)

# 每个连接都必须创建新的线程来处理这条对话, 否则单线程在处理连接的过程中, 无法接受其他客户端的连接.
# 关于线程, 可以参考后续文章.
while True:
    # 接收来自客户端的连接, clicketsocket是后续与客户端通信的套接字
    clientsocket, addr = serversocket.accept()
    t = threading.Thread(target=tcplink, args=(clientsocket, addr))
    t.start()

6.2 验证步骤
同样,我们使用NetAssist来开启两个客户端,使其分别连接我们的服务端程序,然后进行交互。
[a]. 首先运行服务端程序
在这里插入图片描述
[b]. 启动客户端
运行2个NetAssist,然后进行连接。
在这里插入图片描述

7. 写在最后

tcp 协议相对比较复杂,但是内置库以及第三方库为我们进行了深度封装,使得我们使用几句代码就可以创建一个客户端或服务器,以上代码是最简单的示例程序。在正式的项目开发中,远要复杂的很多,比如由于tcp是基于流的,所以我们在接收数据时要进行协议划分来完成基于tcp的拆包组包等;另外,网络编程中几乎是要伴随着多线程来进行开发的。关于多线程编程,参考后续文章。

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

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

相关文章

java IO流之缓冲流详解

缓冲流概述 缓冲流也称为高效流或者高级流。之前我们学习的字节流、字符流可以成为基本流。 作用:缓冲流自带缓冲区、可以提高基本字节流、字符流读写数据的性能。 分类: BufferedInputStream -->字节缓冲输入流 BufferedOutputStream–>字节缓冲输…

ch1_1计算机系统概论

1. 内容安排 1.1 概论 1.2 计算机系统的硬件结构 存储器,I/O 输入与输出;系统总线;CPU 1.3 第三篇 CPU 中央处理器中,所包含的内容: ALU, CUCPU 内部互连寄存器 1.4 CU CU : control uni…

最新虚幻5引擎(UE5)游戏性能的影响详解

Unreal Engine 5 是由 Unreal Engine 公司开发的一款游戏引擎。5 代表引擎的主要版本号。它专为创建多人在线游戏、手机游戏、高端游戏和虚幻应用程序而设计。从图中可以看出,随着场景复杂度的增加,UE5的内存占用会逐渐增加。当然,这并不意味…

Redis简介、数据类型和命令

1 Redis 简介Redis 是一个高性能的 key/value 数据库。它是完全开源免费的,并且遵守 BSD 协议。1.1 Redis 特点不仅支持 key/value 类型的数据,也支持 list,hash,set,zset 等等数据结构。支持持久化,可以把内存数据保存到磁盘上,重…

高并发异步多线程处理例子

用户请求流程 问题点 tomcat 线程资源占满,由于tomcat线程资源有限,每个请求都会经由tomcat线程处理,阻塞至web层处理完才能回收再利用。web层分发至后端服务可能会扩大几倍甚至数百倍的,譬如用户发起请求1w/s,到后端…

JavaEE10-Spring Boot配置文件

目录 1.配置文件作用 2.配置文件的格式 为配置文件安装提示插件 2.1. .properties(旧版,默认的) 2.1.1.基本语法 PS:配置文件中使用"#"来添加注释信息,2种添加方式: 2.1.2.缺点分析 2.2. .yml&#…

阿里“云开发“小程序(uniCloud)

博主ps: 网上资料少的可怜,哎,腾讯云涨价了,论服务器,我肯定选的阿里,再着你们对比下uniCloud的报价就知道了,如果有钱就另当别论了。 所以这片博文,博主试过之后,先抛出…

Git速成指南

文章目录版本管理工具概念版本管理工具介绍版本管理发展简史SVN(SubVersion)GitGit工作流程图Git安装基本配置为常用指令配置别名(可选)解决GitBash乱码问题Git常用命令获取本地仓库基础操作指令查看修改的状态(status)添加工作区…

[翻译]PostgreSQL中的WAL压缩以及版本15中的改进

[翻译]PostgreSQL中的WAL压缩以及版本15中的改进从以开始就一直在尝试对WAL进行不同级别的压缩。自2016年以来内置功能(wal_compression)就一直存在,几乎所有备份工具都会在传递到备机前对WAL进行压缩。但现在是时候再看看内置的wal_compress…

呦~,这不 SVG 映射反爬么,这你都会?厉害厉害 | 案例 25

在正式学习本篇博客前,先要了解一下什么是 SVG(Scalable Vector Graphics),它是一种矢量图形格式,可以用来在网页上创建可伸缩的图形。 使用 SVG 技术实现反爬虫的方法有以下几种: 验证码:使用…

imx6ull Linux使用设备树配置LED

我们基于寄存器的方式已经编写了LED驱动,实现点亮/熄灭LED,但是你有没有发现一个问题,就是假设LED修改了一个GPIO,那么需要对应的修改寄存器代码,非常繁琐,而且随着改板次数增加,那么会带来一个…

从零开始的数模(五)插值与拟合

目录 一、概念 二、 插值 2.1方法 2.2MATLAB实现 例题1 ​编辑例题2 2.3python实现 2.3.1例题一的python解法 2.3.2二维网格节点插值 例题四 三、拟合篇: 3.1MATLAB实现 3.2python实现 一、概念 二、 插值 2.1方法 2.2MATLAB实现 在MATLAB中提供了一些…

带滤波器的PID控制仿真-2(M语言)

被控对象为三阶传递函数:低通滤波器为:采样时间为1ms,噪声信号加在对象的输出端。分三种情况进行:M1 时,为未加噪声信号;M2时,为加噪声信号未加滤波;M3时,为加噪声信号加滤波。阶跃响应结果如图1&#xff5…

【论文精读】KD-MVS

今天读的是发表在ECCV2022上的自监督MVS文章,作者来自于旷视科技和清华大学。 文章链接:arxiv 代码链接:https://github.com/megvii-research/KD-MVS 目录Abstract1. Introduction2. Related work3. Methodology3.1 Self-supervised Teacher …

51单片机七人多数表决器仿真设计( proteus仿真+程序+报告+讲解视频)

51单片机七人多数表决器仿真设计( proteus仿真程序报告讲解视频) 仿真图proteus 7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0033 51单片机七人多数表决器仿真设计视频讲解1.主要功能:2.仿真3.…

Java:Mybatis的使用

一、Mybatis的概述 MyBatis 是一款优秀的持久层框架,用于简化 JDBC 开发。 MyBatis中文官网:https://mybatis.org/mybatis-3/zh/getting-started.html 二、Mybatis快速入门 1、创建user表,添加数据 create database mybatis; use mybati…

英语语法大全

文章目录一、主语1、名词、代词和动词做主语2、主语从句做主语,谓语动词用单数3、主语从句练习二、谓语动词1、谓语动词种类2、主谓一致三、宾语1、单宾语2、双宾语3、复合宾语4、宾语从句四、定语1、定语从句2、定语从句的翻译五、状语1、分词做状语2、独立主格结构…

42.Isaac教程--超像素

超像素 ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html 超像素是一组外观相似的相连像素。 超像素分割将图像分成数百个不重叠的超像素(而不是数千或数百万个单独的像素)。通过使用超像素,您可以在更有意义的区…

ESP-C3入门2. Clion+IDF 开发环境搭建

ESP-C3入门2. ClionIDF 开发环境搭建一、准备工作二、Clion配置过程1. 使用idf.py命令创建一个范例工程2. 使用Clion打开项目,修改CMakeLists.txt3. 设置交叉编译工具链4. 设置CMake5. 对cmake一些路径进行修改。三、编译及烧录1. 编译2. 烧录3. 查看输出一、准备工…

审核中台业务数据进审升级之路

本文字数:3850字预计阅读时间:15 分钟目录1.背景1.1. 相关名词介绍1.2. 审核中台介绍1.3. 业务痛点介绍2. 规范化改造2.1 规范通讯协议2.2 规范处理流程3. 自动化改造3.1 业务接入检测器3.2 数据自动化流转3.3 源码示例4. 总结1.背景1.1 相关名词介绍1.1…