计算机网络-Python通信

devtools/2024/11/23 2:20:51/

1、socket

套接字(Socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。最早是应用于unix系统的一种通信模式,unix系统下的所有操作均是面向文件,Socket的通信模式也是基于文件操作,客户端和服务端均对一个文件完成“打开-读/写-关闭”操作,通过此文件传输信息完成通信。

Socket(套接字)可以看成是两个网络应用程序进行通信时,各自通信连接中的端点。它是网络环境中进程间通信进程间通信的API(应用程序编程接口),也是可以被命名和寻址的通信端点,使用中的每一个套接字都有其类型和一个与之相连进程。通信时其中一个网络应用程序将要传输的一段信息写入它所在主机的 Socket中,该 Socket通过网络接口卡网络接口卡(NIC)与相连的传输介质将这段信息送到另外一台主机的 Socket中,使对方能够接收到这段信息。

Socket是IP地址和端口组合,提供向应用层进程传送数据包的机制。

Socket是面向客户/服务器模型而设计的。通信的一方扮演客户机的角色,另一方扮演服务器的角色。服务器在运行中一直监听套接字指定的传输层端口,并等待着客户机的连接请求。当服务器端收到客户机发来的连接请求以后,服务器会接受客户机的连接请求,双方建立连接后,就可进行数据的传递。

2、服务类型

根据套接字的不同类型,TCP/IP协议将套接字调用分为面向连接服务和无连接服务。

面向连接服务(TCP)的主要特点如下:

(1)数据传输过程必须经过建立连接、维护连接和释放连接3个阶段 ;

(2)在传输过程中,各分组不需要携带目的主机的地址 ;

(3)可靠性好,但由于协议复杂,通信效率不高 。

面向无连接服务(UDP)的主要特点如下:

(1)不需要连接的各个阶段 ;

(2)每个分组都携带完整的目的主机地址,在系统中独立传送 ;

(3)由于没有顺序控制,所以接收方的分组可能出现乱序、重复和丢失现象;

(4)通信效率高,但可靠性不能确保。

3、代码实现

3.1 TCP

1)客户端

import socket
Tcp_Client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

#其中 socket.AF_INET 指名TCP/IP协议 ,socket.SOCK_STREAM表明面向连接的TCP
 #连接服务器
Server_IP = ("x.x.x.x",8888)  #x.x.x.x服务器的IP地址,8888为服务器监听的端口号
Tcp_Client.connect(Server_IP)  #连接指定的服务器及端口号
 
#连接成功、接收服务端信息
data_Server = Tcp_Client.recv(1024) #接收服务端的字节数为1024
print(data_Server.decode()) #将接收的二进制数据转换为字符串

2)服务器端

import socket
 # 创建TCP服务器端
Tcp_Server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Tcp_Server.bind(("0.0.0.0",8888))  #将服务器IP(服务器本机IP,如为0.0.0.0表示服务器的所有接口)和端口与套接字绑定,8888为服务器监听端口号
Tcp_Server.listen(5)   #设置该进程socket最多处理5个客户端连接请求
 
#等待客户端连接
Tcp_Client,info = Tcp_Server.accept() #阻塞程序运行,直到收到客户端连接

#向客户端发送消息
Tcp_Client.send("成功连接服务器!".encode()) #将发送的数据进行UTF-8编码

3)通信

服务器端:

调用Tcp_Client.send(),发送消息;Tcp_Client.recv(1024),接收消息。

客户端:

调用Tcp_Client.recv(1024)接收消息;Tcp_Client.send(),发送消息。

通信结束:

关闭Tcp_Client .close();Tcp_Server.close()

3.2 UDP

1)发送数据

    # 创建套接字
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    # 绑定
    s.bind(("", 7892))

    # 获取发送的数据
    send_content = input("输入发送的内容:")
    # 获取对方 ip
    send_ip = input("目标 ip:")
    # 获取对方端口
    send_port = int(input("目标端口:"))
    # 发送数据
    s.sendto(send_content.encode("utf-8"), (send_ip, send_port))

2)接收数据

     # 创建套接字
     s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

     s.bind(("", 7892))

     recv_content, client_info = s.recvfrom(1024)
     print(">>>%s(%s):%s" % (client_info[0], client_info[1], recv_content.decode("utf-8")))


http://www.ppmy.cn/devtools/136175.html

相关文章

贴代码框架PasteForm特性介绍之image

简介 PasteForm是贴代码推出的 “新一代CRUD” ,基于ABPvNext,目的是通过对Dto的特性的标注,从而实现管理端的统一UI,借助于配套的PasteBuilder代码生成器,你可以快速的为自己的项目构建后台管理端!目前管…

Elasticsearch开启认证及kibana密码登陆

Elasticsearch不允许root用户运行,使用root用户为其创建一个用户es,为用户es配置密码,并切换到es用户。 adduser elastic passwd elastic su elasticElasticsearch(简称ES)是一个基于Lucene的搜索服务器。它提供了一个分布式、多用户能力的全文搜索引擎,基于RESTful web…

Easyexcel(4-模板文件)

相关文章链接 Easyexcel(1-注解使用)Easyexcel(2-文件读取)Easyexcel(3-文件导出)Easyexcel(4-模板文件) 文件导出 获取 resources 目录下的文件,使用 withTemplate 获…

香港服务器安装Debian12操作系统有python环境嘛

香港服务器安装Debian 12操作系统后,通常会包含Python环境。 Debian作为一个广泛使用的Linux发行版,其操作系统版本通常会预装一些常用的软件和库,Python作为一种流行的编程语言,自然也被包括在内。 具体来说,Debian …

LeetCode —— 字母异位词分组

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs ["eat", "tea", "tan", "ate", "nat", &q…

day20 第六章 二叉树part07

第一题:235. 二叉搜索树的最近公共祖先 解题思路 利用二叉搜索树的特性: 二叉搜索树的特点是左子树的所有节点值都小于根节点值,右子树的所有节点值都大于根节点值。基于这个特性,我们可以通过比较根节点与要查找的两个节点 p 和…

48v72v-100v转12v 10A大功率转换电源方案CSM3100SK

如今市场上电机的应用极为广泛,众多电机所需供电量较大。当电机的输入端为多节电池串联或由不同材质的电池供电时,需要将此电压稳定至 12V 或其他特定电压来为电机供电。而且,在电机堵转或急停急启时,瞬间电流会变得非常大。倘若所…

Javaweb梳理16——HTMLCSS使用

Javaweb梳理16——HTML&CSS使用 16 快速入门16.1 基础标签16.2 图片、音频、视频标签16.3 超链接标签16.4 列表标签16.5 表格标签16.6 布局标签16.7 表单标签16.8 type取值 16 快速入门 1.新建文本文件&#xff0c;后缀名改为 .html/.htm 2.编写 HTML结构标签 3.在<bod…