网络协议概述,ip协议,TCP协议,udp协议,二者区别,python中用socket类实现网络通信程序的编写(服务器套接字实现TCP编程,UDP编程)
创始人
2024-09-25 14:48:57
0

七层协议

在这里插入图片描述
① ip协议
在这里插入图片描述

②TCP协议

TCP协议面向连接的,可靠的协议,有三次握手来保证可靠性
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
③ udp协议
不一定可以保证数据发过去,像发短信一样,对方不一定在线,号码也不一定对
在这里插入图片描述
TCP,UDP之间存在一些区别

在这里插入图片描述

端口号是什么?

在这里插入图片描述


在python中如何实现网络通信程序的编写?

用socket类:用来描述IP地址和端口号

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

TCP编程

包括

  • ①TCP服务器端编程
  • ②客户端编程
    启动时先启动服务器端,开始等待监听,再启动客户端,需要注意在python文件创建时候两个文件需要写在不同的项目里

在这里插入图片描述

①TCP服务器端编程(接受数据)

在这里插入图片描述

服务器套接字(Server Socket) 是计算机网络编程中的一个重要概念,它是用于网络通信的一种抽象数据结构,主要用于在服务器端监听和接受来自客户端的连接请求

服务器套接字的工作机制通常涉及以下几个步骤:

  • 创建套接字:服务器程序首先创建一个套接字对象,并指定其类型(如TCP或UDP)和协议族(如IPv4或IPv6)。
  • 绑定地址和端口:将套接字绑定到服务器的IP地址和端口号上,以便监听来自该地址和端口的连接请求。
  • 监听连接:调用监听函数(如listen()),使套接字进入监听状态,等待客户端的连接请求。
  • 接受连接:当接收到客户端的连接请求时,服务器套接字通过接受函数(如accept())接受连接,并创建一个新的套接字来与客户端进行通信。
  • 数据交换:通过新创建的连接套接字,服务器与客户端进行数据的发送和接收。

例如:在Python中,使用socket库可以很方便地编写服务器端代码。以下是一个简单的TCP服务器示例,该服务器监听来自客户端的连接,接收客户端发送的消息,并将接收到的消息回发给客户端。

#首先,你需要导入Python的socket库 import socket      def start_server(host='127.0.0.1', port=8888):   	#使用socket.socket()函数创建一个socket对象。 	#对于TCP连接,通常使用AF_INET(IPv4)和SOCK_STREAM(流式socket,即TCP)。     server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)       #使用bind()方法将socket绑定到特定的IP地址和端口上。     #在大多数情况下,服务器会监听所有可用的网络接口(使用''或0.0.0.0作为IP地址),并选择一个未被占用的端口。     server_socket.bind((host, port))       #使用listen()方法让服务器监听连接。这个方法指定了服务器可以同时处理的最大连接数(即“backlog”队列的大小)。     server_socket.listen(5)          print(f"服务器启动,监听 {host}:{port}")        #服务器通过无限循环不断接受客户端的连接。   #accept()方法会阻塞,直到一个连接到达。它返回一个元组,包含一个新的socket对象(用于与客户端通信)和客户端的地址。*斜体样式*     while True:           client_socket, addr = server_socket.accept()           print(f"连接地址: {addr}")              try:               while True:               #这行代码尝试从client_socket(一个已经建立的TCP连接)接收最多1024字节的数据。             #.recv(1024)方法返回接收到的原始字节数据,然后通过.decode()方法将其解码为字符串,以便可以打印和进一步处理。                 data = client_socket.recv(1024).decode('utf-8')                   if not data:                       break                   print(f"收到: {data}")                   #在将数据打印到控制台之后,这行代码将相同的数据(但这次作为字节数据,通过data.encode()转换)发送回客户端。                 #注意,这在实际应用中可能不是一个好主意,因为它会创建无限的数据回环(除非客户端在发送新数据之前关闭连接或发送某种特定的结束信号)。                 client_socket.sendall(data.encode('utf-8'))           finally:          #无论try块中的代码是否成功执行或是否发生异常,finally块中的代码都会执行。         #这确保了client_socket最终会被关闭,释放了与之关联的资源。              client_socket.close()      if __name__ == "__main__":       start_server() 

实际上,在大多数情况下,您不需要(也不应该)在客户端连接处理循环中显式关闭 server_socket。server_socket 是用来监听来自客户端的连接请求的,只要服务器还在运行并希望接受新的连接,它就应该保持打开状态。
关闭服务器通过调用 server_socket.close() 来实现,但这应该是不再需要接受任何新的连接时进行的。

①TCP客户端编程

在这里插入图片描述

# client.py   import socket      # 创建 socket 对象   client_socket = socket.socket()      # 获取本地主机名   host = '127.0.0.1'     port =8888    # 连接服务,.connect里边是元组,指定要连接的服务器ip和端口   client_socket.connect((host, port))      # 发送数据   message = '你好,服务器!'   client_socket.send(message.encode('utf-8'))      # 接收小于 1024 字节的数据   #data = client_socket.recv(1024).decode('utf-8')      print('来自服务器的数据:', data)      # 关闭连接   client_socket.close() 

UDP编程

面向无连接,这意味着在发送数据之前不需要建立连接。服务器和客户端都可以随时发送数据到对方,但是它们必须知道对方的IP地址和端口号。

在这里插入图片描述
UDP 服务器接收

import socket      def udp_server(host='127.0.0.1', port=12345):       with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:           s.bind((host, port))           print(f"UDP server listening on {host}:{port}")              while True:               data, addr = s.recvfrom(1024)  # 缓冲区大小               print(f"Received {data.decode('utf-8')} from {addr}")                  # 处理数据(这里只是简单地将数据转换为大写)               response = data.decode('utf-8').upper().encode('utf-8')                  # 发送响应回客户端               s.sendto(response, addr)      if __name__ == "__main__":       udp_server() 

UDP 客户端

import socket      def udp_client(server_host='127.0.0.1', server_port=12345):       with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:           while True:               message = input("Enter message (or 'quit' to exit): ")               if message.lower() == 'quit':                   break                  # 发送消息到服务器               s.sendto(message.encode('utf-8'), (server_host, server_port))                  # 接收服务器的响应               data, server = s.recvfrom(1024)               print(f"Received from server: {data.decode('utf-8')}")      if __name__ == "__main__":       udp_client() 

由于UDP是无连接的,因此服务器和客户端之间的通信是独立的,没有建立或断开连接的明确过程。此外,UDP不保证数据包的顺序、完整性或可靠性,因此在需要这些特性的应用中,可能需要使用TCP或其他协议。

总结

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

相关内容

热门资讯

安卓系统为什么不封闭,揭秘安卓... 你有没有想过,为什么安卓系统那么开放,却不像苹果iOS那样封闭呢?这背后可是有着不少有趣的故事和原因...
安卓系统更新包多大,解析不同版... 你有没有发现,每次安卓系统更新,手机里都会多出那么几个G的文件?这可真是让人好奇,安卓系统更新包究竟...
安卓手机安装双系统吗,安卓手机... 你有没有想过,你的安卓手机是不是也能像电脑一样,装上两个系统,一个用来工作,一个用来娱乐?没错,这就...
oppo会升级安卓系统,畅享最... 你知道吗?最近有个大消息在手机圈里炸开了锅,那就是OPPO要升级安卓系统啦!这可不是什么小打小闹的更...
安卓系统上安装windows,... 你有没有想过,在安卓手机上安装Windows系统?听起来是不是有点不可思议?但你知道吗,这竟然是可能...
安卓系统怎么进运行框,安卓系统... 你有没有想过,你的安卓手机里有一个超级实用的功能,那就是运行框!它就像是一个小助手,帮你快速找到正在...
安卓系统电视无图像设置,安卓电... 你家的安卓系统电视突然没图像了?别急,让我来给你支个招,让你轻松解决这个问题!一、检查电源和连接线首...
安卓机建议升级系统吗,提升性能 你有没有发现,你的安卓手机最近有点儿慢吞吞的?是不是在犹豫要不要升级系统呢?别急,让我来给你好好分析...
升级不了安卓系统升级,探寻升级... 你有没有遇到过这种情况?手机里的安卓系统突然告诉你,它需要升级,但你左等右等,就是升不上去。这可真是...
备用安卓系统手机推荐,盘点热门... 你有没有想过,如果你的手机突然罢工了,你会怎么办?别担心,今天我就要给你安利几款备用安卓系统手机,让...
旧安卓系统ipad无法更新系统... 你有没有遇到过这种情况?你的旧安卓系统iPad突然告诉你,它无法更新系统了!是不是瞬间感觉心里有点小...
运行安卓6系统命令大全,全面掌... 你有没有想过,你的安卓手机里隐藏着无数强大的功能,只等着你去发现和探索呢?今天,就让我带你走进安卓6...
安卓系统简笔画教程下载,轻松绘... 你有没有想过,用简单的线条就能把复杂的安卓系统画出来?没错,就是那种一看就懂,一画就上手的感觉!今天...
华为如何鸿蒙转安卓系统,轻松实... 你知道吗?最近华为的大动作可是让整个科技圈都沸腾了!他们竟然把鸿蒙系统转到了安卓系统上,这可真是让人...
安卓10系统的问题,安卓10系... 你有没有发现,自从你的手机升级到安卓10系统后,好像有点不对劲呢?别急,让我来给你细细道来,看看安卓...
安卓系统苹果搞笑视频,苹果搞笑... 你知道吗?在互联网的世界里,搞笑视频可是个永恒的热门话题。尤其是那些结合了安卓系统和苹果手机的搞笑片...
卡片机改造安卓系统,探索改造之... 你有没有想过,那些曾经陪伴我们记录美好时光的卡片机,现在竟然也能焕发第二春呢?没错,就是那些小巧便携...
装安卓系统倒车出不来,智能科技... 你有没有遇到过这样的事情:手机装了个安卓系统,结果倒车的时候出不来啦?这可不是闹着玩的,简直让人抓狂...
定制安卓系统哪家好点儿,哪家服... 你有没有想过,手机系统就像是个人的衣服,每个人都需要找到最适合自己的那一款?今天,咱们就来聊聊定制安...
台电用回安卓系统吗,开启智能新... 最近有个话题在科技圈里炒得挺热的,那就是台电是不是要用回安卓系统了?你有没有想过,这个小小的决定背后...