lmndasb 2023-06-09 18:01 采纳率: 75%
浏览 20
已结题

报错: descriptor 'sendto' requires a '_socket.socket' object but received a 'bytes' 这怎么解决啊!


from threading import Thread
from socket import *
import os
#获取电脑ip
computername=gethostname()
global 本机ip
本机ip=gethostbyname(computername)
print(computername)
print(本机ip)
服务端ip='100.71.2.02'
端口号=6760

while True:
    ip=本机ip
    socket.sendto(ip.encode(),(服务端ip,端口号))
    break
def receive():
    msg=socket.recv(1024)
    print('服务端信息:',msg.decode())

def send():
    info=input("请输入:")
    socket.sendto(info.encode(),(服务端ip,端口号))
s=socket(AF_INET,SOCK_DGRAM)
s.bind((服务端ip,端口号))
t1=Thread(target=receive)
t2=Thread(target=send)
t1.start()
t2.start()
  • 写回答

1条回答 默认 最新

  • 辞轩. 2023-06-11 11:56
    关注

    这个错误很可能是因为你未正确实例化 Socket 对象或未将其赋值给变量 s。在你的代码中,你正在向未实例化的 Socket 对象 socket 上调用 sendto() 方法,因此 Python 抛出了上述错误。

    为了解决这个问题,你应该改为使用 s.sendto() 而不是 socket.sendto()。即在调用 sendto() 方法时,使用你已经实例化的 Socket 对象 s,而不是调用未定义的 socket 对象。相应地,需要将 s 作为 receive()send() 函数的参数来确保这些函数也正确地使用了相同的连接对象。

    以下是修改后的代码:

    from threading import Thread
    from socket import *
    import os
    
    # 获取电脑ip
    computername = gethostname()
    global 本机ip
    本机ip = gethostbyname(computername)
    print(computername)
    print(本机ip)
    
    服务端ip = '100.71.2.02'
    端口号 = 6760
    
    s = socket(AF_INET, SOCK_DGRAM)
    s.bind((本机ip, 端口号))
    
    while True:
        ip = 本机ip
        s.sendto(ip.encode(), (服务端ip, 端口号))
        break
    
    def receive(s):
        msg = s.recv(1024)
        print('服务端信息:', msg.decode())
    
    def send(s):
        info = input("请输入:")
        s.sendto(info.encode(), (服务端ip, 端口号))
    
    t1 = Thread(target=receive, args=(s,))
    t2 = Thread(target=send, args=(s,))
    t1.start()
    t2.start()
    

    此外,你需要注意在 receive() 和 send() 函数中传入了参数 s,以确保这些函数使用了正确的 Socket 对象。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 6月26日
  • 已采纳回答 6月18日
  • 创建了问题 6月9日