首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可以发送字符串,但不能发送其他字符串

可以发送字符串,但不能发送其他字符串
EN

Stack Overflow用户
提问于 2019-10-14 21:00:05
回答 1查看 46关注 0票数 0

我正在尝试让服务器在接收GETALL作为输入时返回这个work,但是除了直接给定的字符串之外的任何东西都不起作用。我怀疑是编码,但它似乎不是破解它的那个。有什么建议吗?

最初的编码是ASCII和UTF-8的变体,但为了简单起见,我将其全部改为UTF-8。

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

发布于 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'))

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58377414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档