迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Python >

Python 错误 OSError: [WinError 10038] an Operation Was Attempted on Something That Is Not a Socket

作者:迹忆客 最近更新:2023/05/30 浏览次数:

通过这篇文章,我们将了解什么是服务器和客户端,以及如何使用套接字模块在服务器和客户端的帮助下创建应用程序。 我们还将学习如何在使用 Python 制作这些类型的应用程序时避免错误。


借助 Python 中的 socket 模块无错误创建应用程序

在互联网上,节点可以是服务器也可以是客户端; 当然,它也可以是一个客户端到客户端的网络,你拥有所有的节点并且正在相互交谈。 它是一个点对点网络。

我们在互联网上有服务器监听客户端,他们正在等待客户端发送请求。

例如,当您访问 百度 服务器 baidu.com 并向 百度 服务器发送请求时,百度 服务器将向您发送一些响应,即页面或页面未找到消息。

让我们从创建两个 Python 文件开始,demo.pyclient.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()

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

Python 中错误 NameError: Name 'xrange' Is Not Defined

发布时间:2023/05/30 浏览次数:74 分类:Python

我们将了解在 Python3 中调用 xrange 函数时出现错误的原因,并了解如何解决此问题。 我们还将了解 range 和 xrange 之间的区别,并了解如何在不同的 Python 版本中使用 range 函数。

Python 错误 Valueerror: Expected 2d Array, Got 1d Array Instead

发布时间:2023/05/30 浏览次数:103 分类:Python

当我们在 numpy 中传递一维数组而不是二维数组时,会发生错误 ValueError: Expected 2D array, got 1D array instead 。如您所知,每种编程语言都会遇到很多错误,有些是在运行时,有些是在编译时。 Pyth

Python 中错误 ValueError: Invalid Literal for Float()

发布时间:2023/05/17 浏览次数:55 分类:Python

Python 中 ValueError: invalid literal for float()。 float() 函数无法将字符串类型转换为浮点数。 相反,它会抛出一个 ValueError,它可能会因您的 Python 版本而异。

Python 错误 TypeError: Unhashable Type: List

发布时间:2023/05/17 浏览次数:112 分类:Python

本文将讨论 TypeError: unhashable type: 'list' 以及如何在 Python 中修复它。因为 Python 字典只接受可散列数据类型作为它们的键,而列表是不可散列的。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便