通过 python 套接字发送 json.dumps()

sending json.dumps() via python sockets

我要创建的是一组服务器和客户端脚本;服务器脚本提示用户进行原始输入,将该输入存储在字典中并使用 json.dumps() 函数将其转换为 json。然后将转换后的字典存储在 jasonFile 变量中,然后将其发送给客户端。 json 字典可以用,但我正在努力解决网络方面的问题。

这是我的服务器代码:

def Main():
host = '0.0.0.0'
port = 5000
s.bind((host, port))
s.listen(5)

print "Server Started"


while True:
    addr = s.accept()
    print "Client Connected from IP: " + str(addr)
    serverMessage = "Connection Established: Would you like to download the Json dictionary?"
    s.send(serverMessage)
    clientReply = s.recv(1024)
    if clientReply in ['Y', 'y', 'Yes', 'yes', 'YES']:
        s.send(jasonFile)
        s.close()
    else:
        print "Connection from " + addr + " closed!"
        s.send("Connection Error!")
        s.close()

这是我的客户端代码:

def Main():
    host = raw_input("Please enter the server IP you wish to connect to: ")
    port = 5000

    #define client to use socket module to connect via IPV4 and TCP only
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect((host, port))

    serverMessage = client.recv(1024)
    print serverMessage

    clientReply = raw_input("Type 'Yes' To download dictionary")
    if clientReply in ['Y', 'Yes', 'y', 'yes', 'YES']:
            client.send(clientReply)
            jasonRecv = client.recv(1024)
            print jasonRecv
    else:
            client.close()
            print "Disconnected from server!"

我还没有将 json 数据转换回客户端上的字符串,因为当客户端尝试连接时服务器向我抛出一个错误。

我从 IDLE 得到的错误信息是:

Server Started
Client Connected from IP: (<socket._socketobject object at 0x000000000401E048>, ('127.0.0.1', 34375))

Traceback (most recent call last): File "D:/Server.py", line 105, in <module>
Main()

File "D:/Server.py", line 94, in Main
s.send(serverMessage)

error: [Errno 10057] A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied

我以为我在 addr 变量中定义了发送数据的地址,但显然不是?

尝试:

conn, addr = s.accept()
...
conn.send(serverMessage)

即将 s. 调用替换为 conn.,代表从客户端接受的套接字连接。

来自Python socket API

socket.accept()

Accept a connection. The socket must be bound to an address and listening for connections. The return value is a pair (conn, address) where conn is a new socket object usable to send and receive data on the connection, and address is the address bound to the socket on the other end of the connection.

页面末尾提供了示例。

另见 Python Socket Programming Howto