当前位置: 首页 > 知识库问答 >
问题:

如何在 Python 中同步套接字消息

蒋曾笑
2023-03-14

所以我写了这个服务器脚本,它应该接收一个用户名,然后继续其他一些代码。但是我收到了这个错误:

"OSError:[WinError 10057]不允许发送或接收数据的请求,因为套接字未连接,并且(当使用sendto调用在数据报套接字上发送时)未提供地址"

我的理论是服务器和客户端没有同步,所以服务器认为它没有收到消息。如何改进我的代码,以便服务器实际接收消息?(我试过尝试块)

我的代码:

import socket

port = int(input("Server port: "))

try:
    socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    socket.bind(("localhost",port))
    socket.listen(1)
except Exception:
    print("error while starting server")
    input()
    exit()

def receive(con,buffer):
    return str(con.recv(buffer).decode())

while True:
    con,ip = socket.accept()
    print(str(ip) + " Connected!")

    username = receive(socket,1024) # <-- error

    #other code

socket.close()

客户代码:

import socket

ip = input("Server IP: ")
port = int(input("Server port: "))

socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
try:
    socket.connect((ip,port))
except Exception:
    print("Error while connectine to the server!")
    input()
    exit()

def send(s,msg):
    s.send(bytes(msg,"utf-8"))

username = input("Username: ")

send(socket,username)

# other code

socket.close()

共有1个答案

巴英韶
2023-03-14

您不应该使用类似于任何库名称的变量名。在本例中,您使用了变量socket来存储服务器套接字对象。因此,您的代码是模棱两可的,因为您使用了同名的库。

下面是工作代码。

import socket

port = int(input("Server port: "))

try:
    SERVER = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    SERVER.bind(("localhost",port))
    SERVER.listen(1)
except Exception:
    print("error while starting server")
    input()
    exit()

def receive(con,buffer):
    return str(con.recv(buffer).decode())

while True:
    con,ip = SERVER.accept()
    print(str(ip) + " Connected!")

    username = receive(con,1024) # <-- error

    #other code
socket.close()
 类似资料:
  • 我一直在开发一个简单的python套接字聊天室,客户端和服务器可以在其中相互发送消息。我遇到的问题是服务器和客户端一次只能发送一条消息。我希望它能像任何其他聊天室一样工作,在那里我可以在发送消息时收到消息,任何帮助都会有很大帮助

  • 我在询问之前搜索了这个问题,但我找不到类似的东西。我开发了一个客户端/服务器解决方案来发送/接收HL7消息。我使用套接字将客户端连接到服务器,从这个连接中,我只能使用OutputSteam对象发送1条HL7消息。我如何在同一个套接字连接中发送多个HL7?我尝试了不同的方法,但它们不能正常工作。 以下是我的客户端代码: 从服务器端 如何在同一套接字连接中发送更多HL7消息?

  • 问题内容: 我正在尝试为python中的类编写单元测试。该类在 init 上打开一个tcp套接字。我试图对此进行模拟,以便可以断言使用正确的值调用了连接,但是显然在单元测试中实际上并未发生。我已经厌倦了MagicMock,补丁程序等,但是还没有找到解决方案。 到目前为止我的班级看起来像 问题答案: 如果您只想断言被正确调用,这很简单 如果必须先导入模块才能访问,则需要稍微调整补丁:

  • 我有一个数组类型的。我必须在python中通过流/TCP套接字发送它。然后我必须在接收端接收相同的阵列。

  • 我有这个遗留的伪代码: 我的问题是关于嵌套块。 据我了解,在这种情况下提到的块是多余的,就好像两个线程同时调用 那么一次只有一个线程可以访问私有字段。因此,代码可以简化为 有可能进一步消除racy读取到 所以我的问题是,这种重构在同步和JMM方面是否正确,如果正确(或者不正确)-是否有基于JCStress的测试证明了这一点?