我正在尝试创建的是一组服务器和客户端脚本;服务器脚本提示用户输入原始输入,将该输入存储在字典中,并使用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 套接字 API:
socket.accept((
接受连接。套接字必须绑定到地址并侦听连接。 返回值是一对(conn,地址(,其中conn是新套接字 可用于发送和接收连接上数据的对象和地址 是绑定到连接另一端的套接字的地址。
页面末尾提供了示例。
另请参阅 Python 套接字编程指南