当前位置: 首页 > article >正文

计算机网络-Python通信

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.kler.cn/a/403901.html

相关文章:

  • 05_Spring JdbcTemplate
  • 【数据结构】【线性表】【练习】删除链表倒数第n个结点
  • C/C++精品项目之图床共享云存储(8):将项目最后变成多线程
  • 极客时间《Redis核心技术与实战》开篇词 知识点总结
  • 用Python爬虫“偷窥”1688商品详情:一场数据的奇妙冒险
  • cesium for unity的使用
  • 什么是Git,有什么特点
  • 51c自动驾驶~合集30
  • 【AI日记】24.11.19 GraphRAG
  • Python爬虫项目 | 二、每日天气预报
  • git上传文件到远程仓库
  • 【东莞石碣】戴尔R740服务器维修raid硬盘问题
  • KubeSphere 最佳实战:K8s 构建高可用、高性能 Redis 集群实战指南
  • Jenkins的环境部署
  • Linux常用命令之wc命令详解
  • PointNet++项目分析
  • JAVA篇之类和对象
  • 使用 LSTM(长短期记忆网络) 模型对时间序列数据(航空旅客人数数据集)进行预测
  • vue2.0新建项目
  • 无人机侦察打击方案(3)
  • 亚马逊云服务器(AWS):功能、优势与使用指南
  • 【YOLOv8】安卓端部署-1-项目介绍
  • 【C++】数据上传的方式。持久化的方式。通过 JSON,序列化与反序列化。
  • Vue2 Class Component 使用指南:提升组件开发的可维护性
  • 嵌入式linux中QT信号与槽基本操作与实现
  • CSS一些练习过程