我正在尝试让服务器在接收GETALL作为输入时返回这个work,但是除了直接给定的字符串之外的任何东西都不起作用。我怀疑是编码,但它似乎不是破解它的那个。有什么建议吗?
最初的编码是ASCII和UTF-8的变体,但为了简单起见,我将其全部改为UTF-8。
import logging
import socket
import constCS
from context import lab_logging
lab_logging.setup(stream_level=logging.INFO) # init loging channels for the lab
class Server:
_logger = logging.getLogger("vs2lab.lab1.clientserver.Server")
_serving = True
thisdict = {
"Ivan" : "0123",
"Kiro" : "4567"
}
def GETALL():
return thisdict
def __init__(self):
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.bind((constCS.HOST, constCS.PORT))
self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # prevents errors due to "addresses in use"
self.sock.settimeout(3) # time out in order not to block forever
self._logger.info("Server bound to socket " + str(self.sock))
def serve(self):
self.sock.listen(1)
while self._serving: # as long as _serving (checked after connections or socket timeouts)
try:
(connection, address) = self.sock.accept() # returns new socket and address of client
while True: # forever
data = connection.recv(1024) # receive data from client
if not data:
break # stop if client stopped
if data == "GETALL":
connection.send(str(thisdict) + "".encode('utf-8')) # return sent data plus an ""
connection.close() # close the connection
except socket.timeout:
pass # ignore timeouts
self.sock.close()
self._logger.info("Server down.")
class Client:
logger = logging.getLogger("vs2lab.a1_layers.clientserver.Client")
def __init__(self):
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.connect((constCS.HOST, constCS.PORT))
self.logger.info("Client connected to socket " + str(self.sock))
def call(self, msg_in="GETALL"):
self.sock.send(msg_in.encode('utf-8')) # send encoded string as data
data = self.sock.recv(1024) # receive the response
msg_out = data.decode('utf-8')
print(msg_out) # print the result
self.sock.close() # close the connection
self.logger.info("Client down.")
return msg_out
def close(self):
self.sock.close()发布于 2019-10-14 21:47:52
你的问题在这里(很明显):
connection.send(str(thisdict) + "".encode('utf-8'))
这是类型的一个例外:
TypeError: can only concatenate str (not "bytes") to str
您看不到这个异常,因为您正在捕获它并执行pass。
您需要的是将""连接起来,然后进行编码,如下所示:
connection.send((str(thisdict) + "").encode('utf-8'))
https://stackoverflow.com/questions/58377414
复制相似问题