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

时间:2019-03-02 15:58:56

标签: python sockets

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

“ 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 个答案:

答案 0 :(得分:0)

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