网络与并发(二)

Python-网络与并发

第二章 Socket

本地的进程间通信(IPC)有很多种方式,例如

  • 队列
  • 同步(互斥锁、条件变量等)

以上通信方式都是在一台机器上不同进程之间的通信方式,那么问题来了

网络中进程之间如何通信?

网络中进程之间如何通信

首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!

在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的。

其实TCP/IP协议族已经帮我们解决了这个问题,网络层的“ip地址”可以唯一标识网络中的主机,而传输层的“协议+端口”可以唯一标识主机中的应用程序(进程)。

这样利用 ip地址,协议,端口就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交互

socket(简称 套接字) 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页、QQ 聊天、收发 email 等等

1. Socket编程

那我们如何实现尼?

在 Python 中 使用socket 模块的函数 socket 就可以完成:

socket.socket(AddressFamily, Type)

说明:

套接字最初是为同一主机上的应用程序所创建,使得主机上运行的一个程序(又名一个进程)与另一个运行的程序进行通信。这就是所谓的进程间通信(Inter Process Communication,IPC)

有两种类型的套接字:基于文件的和面向网络的。

'''
函数 socket.socket 创建一个 socket,返回该 socket 的描述符,该函数带有两个参数:

- Address Family:可以选择 AF_INET(用于 Internet 进程间通信) 或者 AF_UNIX(用于同一台机器进程间通信),实际工作中常用AF_INET
- Type:套接字类型,可以是 SOCK_STREAM(流式套接字,主要用于 TCP 协议)或者 SOCK_DGRAM(数据报套接字,主要用于 UDP 协议)
'''

那我们来创建一个基于tcp socket的套接字

import socket

# 获得socket对象 AF_INET表示基于网络的套接字
# SOCK_STREAM表示的是TCP协议
socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

print ('Socket Created')

创建一个udp socket(udp套接字)

import socket

# 获得socket对象 AF_INET表示基于网络的套接字
# SOCK_DGRAM表示的是UDP协议
socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

print ('Socket Created')

以上就是基于socket模块实现创建最简单的对象模式,那我们来基于socket实现TCP/UDP的实现

UDP客户端

# -*- coding: UTF-8 -*-
# 文件名:client.py

# 导入 socket 模块
from socket import *

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

# 准备接收方地址
server_host_post = ('127.0.0.1', 8080)

# 发送数据时,python3需要将字符串转成byte
# encode(‘utf-8’)# 用utf-8对数据进行编码,获得bytes类型对象
client_data = input("请输入:").encode('utf8')

# 将拿到转为bytes类型data数据对象,通过socket中的sendto方法,将数据发送到ip+协议+端口对应的地址
client_socket.sendto(client_data, server_host_post)

# 如果发送成功我们就提示一句发送成功
print('发送成功')

# 关闭客户端
client_socket.close()

我们看到运行结果是输入我们想要的内容是能运行成功的,但是我们内容去了那里了,这里我们就需要详细的了解协议的性质,是无连接的,既不能保证数据的完整性,也不能保证数据发送,所以就无法产生稳定的数据传输,但是也是可以接收到消息的哦,这里就需要我们的服务器,任何客户端,需要使用服务,必须得链接到其他的服务器一段,进行交互响应,才能完成动态的信息交互。

posted @   潦草的人生  阅读(12)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示