OSError: [Errno 57] 套接字未连接

New*_*101 2 python sockets json

我试图使用该socket模块了解 python 上的网络,但我认为问题是我并不真正了解服务器或客户端的实际功能。

我正在尝试做的事情:

  • 首先使用 JSON 将字典转换为字符串,将字典从客户端发送到服务器
  • 让服务器向客户端发回消息以确认它们已连接

服务器程序

import socket
import json

HOST = '192.168.X.X'
PORT = 50034


with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen(1)
    conn, addr = s.accept()

    with conn:
        while True:
            data = conn.recv(1024)
            new_data = data.decode()
            new_data = json.loads(data)
            print(new_data["Name"],"has connected from",addr)
            message = ("Hello %s welcome to the chat server" % new_data["Name"]).encode()
            s.sendall(message)
            if not data:
                conn.sendall(data)
Run Code Online (Sandbox Code Playgroud)

客户端程序

import socket
import json

HOST = '192.168.X.X'
PORT = 50034

my_dict = {"Name":"Bob"}
jsn = json.dumps(my_dict)
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST,PORT))
    s.sendall((jsn).encode())
    data = s.recv(1024)
    print(data)
Run Code Online (Sandbox Code Playgroud)

但我收到错误:

OSError: [Errno 57] 套接字未连接

为什么?

jnr*_*bsn 6

在您的服务器代码中,您需要更改...

s.sendall(message)
Run Code Online (Sandbox Code Playgroud)

... 到 ...

conn.sendall(message)
Run Code Online (Sandbox Code Playgroud)

这是因为当你做...

conn, addr = s.accept()
Run Code Online (Sandbox Code Playgroud)

...conn该连接的套接字实例。这就是您应该用于在该连接上发送和接收数据的对象。在调用接受连接之前,您没有实际连接到任何东西的套接字。accept()