Python 错误 OSError: [WinError 10038] an Operation Was Attempted on Something That Is Not a Socket
通过这篇文章,我们将了解什么是服务器和客户端,以及如何使用套接字模块在服务器和客户端的帮助下创建应用程序。 我们还将学习如何在使用 Python 制作这些类型的应用程序时避免错误。
借助 Python 中的 socket 模块无错误创建应用程序
在互联网上,节点可以是服务器也可以是客户端; 当然,它也可以是一个客户端到客户端的网络,你拥有所有的节点并且正在相互交谈。 它是一个点对点网络。
我们在互联网上有服务器监听客户端,他们正在等待客户端发送请求。
例如,当您访问 百度 服务器 baidu.com 并向 百度 服务器发送请求时,百度 服务器将向您发送一些响应,即页面或页面未找到消息。
让我们从创建两个 Python 文件开始,demo.py 和 client.py。 我们要将消息从服务器发送到客户端。
服务器和客户端可以来自不同的位置或网络外部。
我们将创建服务器,然后我们将传递一条消息并查看此客户端如何从服务器接收消息。 为简单起见,我们在本地主机上执行此操作,但您也可以在不同的系统上执行此操作。
我们需要做的第一件事是导入套接字并创建一个实例。 我们将调用套接字类,然后指定套接字系列。
套接字系列将是 AF_INET,套接字公式将是 SOCK_STREAM。
在下一步中,我们需要使用 bind()
方法将套接字绑定到端口上的主机名。 现在,我们必须使用 listen()
方法监听连接; 最大连接数为 5。
import socket
SKT=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
SKT.bind((socket.gethostname(),6060))
SKT.listen(5)
为了找到与客户端的连接,我们从服务器发送一条消息,以便客户端接收该消息。
为此,我们将使用 True 的 while 循环。 在这个循环中,我们将使用 connect()
方法创建另一个套接字作为客户端套接字; 它将在 client.py 文件中使用。
我们正在使用返回两个值的 accept()
方法; 这就是为什么我们声明了两个变量来存储传入套接字和传入连接的地址。 现在,我们将打印一条消息,显示已从指定地址建立连接。
while True:
Client_Socket,Adress=SKT.accept()
print(f'Connection has been established from {Adress}')
现在我们需要以字节为单位发送消息。 编码将是 utf-8,发送到与套接字连接的每个客户端。
Client_Socket.send(bytes("Welcome to the server!!!","utf-8"))
Client_Socket.close()
我们的套接字已准备好监听连接。 现在我们将在 client.py 文件中工作并使用相同的代码,除了 connect()
方法。
在 connect()
方法中,我们将使用相同的主机名、本地主机和端口。
现在,我们将接收来自服务器的消息。 我们将使用 recv()
方法并将其传递给 2048 字节。
我们将打印出此消息以验证消息是否已收到。
import socket
SKT=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
SKT.connect((socket.gethostname(),6060))
MSG=SKT.recv(2048)
print(f"Message has been received {MSG}")
现在,应用程序已经完成,所以我们将首先运行服务器,即 demo.py 文件; 它正在运行,但什么也没发生。 如果我们转到 client.py 并在交互式窗口中运行该文件,当这些文件同时运行时,我们可以在控制台中看到响应。
Python 错误 OSError: [WinError 10038] An operation was attempted on something that is not a socket
创建此应用程序时出现错误的一些常见原因。 一个原因可能是您忘记运行一个文件,两个文件,或者您在任何地方都犯了错误。
让我们看一个用户经常遇到此错误的示例。
import socket
SKT=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
SKT.bind((socket.gethostname(),6060))
SKT.listen(5)
while True:
Client_Socket,Adress=SKT.accept()
while True:
print(f'Connection has been established from {Adress}')
Client_Socket.send(bytes("Welcome to the server!!!","utf-8"))
Client_Socket.close()
输出:
OSError: [WinError 10038] An operation was attempted on something that is not a socket
这是因为我们正在运行一个嵌套的 while 循环,并且两者都是 True。 当执行外部 while 循环时,我们接受来自客户端的传入连接。
问题发生在执行内部 while 循环时。
由于内部 while 循环第一次为 True,因此该循环完美执行,但在第二次迭代中,while 循环需要接受传入连接。 accept() 方法从外循环调用,永远不会被调用; 这就是它发现套接字不再存在的原因。
出现问题的另一个原因是当您从终端运行这两个文件时。 如果您使用 VS 代码,请在(交互式窗口中的当前文件)中单独运行这两个文件。
完整的 demo.py 文件代码:
import socket
SKT=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
SKT.bind((socket.gethostname(),6060))
SKT.listen(5)
while True:
Client_Socket,Adress=SKT.accept()
print(f'Connection has been established from {Adress}')
Client_Socket.send(bytes("Welcome to the server!!!","utf-8"))
Client_Socket.close()
相关文章
Python pandas.pivot_table() 函数
发布时间:2024/04/24 浏览次数:82 分类:Python
-
Python Pandas pivot_table()函数通过对数据进行汇总,避免了数据的重复。
在 Python 中将 Pandas 系列的日期时间转换为字符串
发布时间:2024/04/24 浏览次数:894 分类:Python
-
了解如何在 Python 中将 Pandas 系列日期时间转换为字符串
在 Python Pandas 中使用 str.split 将字符串拆分为两个列表列
发布时间:2024/04/24 浏览次数:1124 分类:Python
-
本教程介绍如何使用 pandas str.split() 函数将字符串拆分为两个列表列。
在 Pandas 中将 Timedelta 转换为 Int
发布时间:2024/04/23 浏览次数:231 分类:Python
-
可以使用 Pandas 中的 dt 属性将 timedelta 转换为整数。
Python 中的 Pandas 插入方法
发布时间:2024/04/23 浏览次数:112 分类:Python
-
本教程介绍了如何在 Pandas DataFrame 中使用 insert 方法在 DataFrame 中插入一列。
使用 Python 将 Pandas DataFrame 保存为 HTML
发布时间:2024/04/21 浏览次数:106 分类:Python
-
本教程演示如何将 Pandas DataFrame 转换为 Python 中的 HTML 表格。
如何将 Python 字典转换为 Pandas DataFrame
发布时间:2024/04/20 浏览次数:73 分类:Python
-
本教程演示如何将 python 字典转换为 Pandas DataFrame,例如使用 Pandas DataFrame 构造函数或 from_dict 方法。
如何在 Pandas 中将 DataFrame 列转换为日期时间
发布时间:2024/04/20 浏览次数:101 分类:Python
-
本文介绍如何将 Pandas DataFrame 列转换为 Python 日期时间。