首页 > 解决方案 > 如何在 Python 中同步套接字消息

问题描述

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

“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()

标签: pythonsockets

解决方案


您不应该使用类似于任何库名称的变量名称。在您的情况下,您已使用该变量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()

推荐阅读