【问题标题】:Get a response fro server从服务器获取响应
【发布时间】:2019-08-23 08:38:40
【问题描述】:

我正在尝试制作一个server-client 程序,其中server 将收听client's 消息并根据消息做出响应。我从clientusernamecontentserver 发送一条消息接受它并打印一条消息发送到client 直到这里一切都很好。但是在发送消息时server会抛出错误:

 `TypeError: byte indices must be integers or slices, not str`

看起来这条线是问题所在,但我不确定....

`clientsocket.send(msg['header'] + msg['data'])`

这是一个完整的服务器代码。请让我知道,如果client 代码也是必要的,请告诉我。

import socket
import time
import pickle
import select

HEADERSIZE = 10
IP = "127.0.0.1"
PORT = 1234


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((IP, PORT))
s.listen()
sockets_list = [s]
clients = {}

# Handles message receiving
def receive_message(clientsocket):
    try:
        message_header = clientsocket.recv(HEADERSIZE)
        if not len(message_header):
            return False

        message_length = int(message_header.decode('utf-8').strip())
        return {'header': message_header, 'data': clientsocket.recv(message_length)}

    except:
        return False


while True:
    read_sockets, _, exception_socket = select.select(sockets_list, [], sockets_list)
    for notified_socket in read_sockets:
        if notified_socket == s:
            clientsocket, address = s.accept()
            user = receive_message(clientsocket)
            if user is False:
                continue

            sockets_list.append(clientsocket)
            clients[clientsocket] = user

            print(f"Connection from {address[0]}:{address[1]} has been estabilished! User:{user['data'].decode('utf-8')}")


        else:
            message = receive_message(notified_socket)

            if message is False:
                print(f"Close connection from {clients[notified_socket]['data'].decode('utf-8')}")
                sockets_list.remove(notified_socket)
                del clients[notified_socket]
                continue

            user = clients[notified_socket]
            #message_decoded = message['data'].decode('utf-8')
            print(f'Received message from {user["data"].decode("utf-8")}: {message["data"].decode("utf-8")}')

            for clientsocket in clients:
                if clientsocket == notified_socket:
                    if message["data"].decode("utf-8") == "y":
                        #d = {1: "Hey", 2: "there"}

                        msg = pickle.dumps("th.jpeg")
                        print(msg)

                        msg = bytes(f'{len(msg):<{HEADERSIZE}}', "utf-8") + msg
                        clientsocket.send(msg['header'] + msg['data'])

                    else:
                        d = {1: "Hey", 2: "there"}
                        msg = pickle.dumps(d)
                        print(msg)
                        # msg = bytes(f'{len(msg):<{HEADERSIZE}}', "utf-8") + msg
                        clientsocket.send(msg['header'] + msg['data'])

    for notified_socket in exception_socket:
        sockets_list.remove(notified_socket)
        del clients[notified_socket]

这里是一个完整的错误代码:

Connection from 127.0.0.1:48480 has been estabilished! User:j
Received message from j: y
b'\x80\x03X\x07\x00\x00\x00th.jpegq\x00.'
Traceback (most recent call last):
  File "server.py", line 69, in <module>
    clientsocket.send(msg['header'] + msg['data'])
TypeError: byte indices must be integers or slices, not str

如您所见,它在发送消息行之前一直有效

【问题讨论】:

    标签: python python-3.x sockets connection


    【解决方案1】:

    msg = pickle.dumps("th.jpeg") 会将字符串"th.jpeg" 编码为字节对象。 msg = bytes(f'{len(msg):&lt;{HEADERSIZE}}', "utf-8") + msg 只是将该字节对象添加到另一个字节对象。

    所以msg 是一个简单的字节对象,而不是任何类型的服务器数据包或类似的。因此无法使用msg['header'] 或任何其他字符串订阅msg

    您的代码看起来有点奇怪,但不妨试试这一行:

    clientsocket.send(msg)
    

    由于您已经将msg 转换为字节对象,因此可以直接将其发送到客户端。您只需在客户端中正确解码即可。

    【讨论】:

    • 谢谢!这次出现了客户端的代码解码错误,不过我觉得可以处理,谢谢!
    猜你喜欢
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多