Python3套接字模块:解码str

时间:2017-02-26 10:59:21

标签: python python-3.x sockets networking

我制作了一个简单的Python应用程序,允许人们通过CLI相互通信。我对套接字模块比较新,但我的代码没有问题。除了一个。当我运行我的两个脚本(chatclient.py和chatserver.py)时,它们运行正常。服务器启动,客户端将询问用户的名称和消息。但是,点击“输入”发送消息后,我收到:

android:testOnly="@bool/test_only"

我尝试过使用.encode(' utf-8)/ .decode(' utf-8'),但仍然是同样的错误。代码将在下面(围绕“'错误的代码”进行多次评论。

class Base<ApplicationController
  private

  def permited_params
    params.require(:object_name).permit(:name, :description)
  end
end

class Post<Base
  private

  def permited_params
    params.require(:post).permit(:name, :description, :owner)
  end
end

^^^客户

TypeError: decoding str not supported

^^^服务器

1 个答案:

答案 0 :(得分:1)

如果将2个或更多值传递给str,它会尝试解码,但在您的情况下,第一个参数已经是字符串对象(因为input函数的返回值是字符串);导致错误。

>>> str('a')
'a'
>>> str('a', 'utf-8')   # trying to decode (the 2nd arg. is encoding)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: decoding str is not supported
>>> str(b'a', 'utf-8')
'a'

除此之外,您需要将bytes对象作为第一个参数传递给socket.sendto。编码字符串以获取字节对象:

>>> 'a'.encode()  # You can omit encoding arg.; `utf-8` is default in Python 3.x
b'a'
>>> 'a'.encode('utf-8')
b'a'

替换以下客户端代码:

s.sendto(str(name, message), (host,port)).decode('utf-8')

使用:

s.sendto('{}: {}'.format(name, message).encode('utf-8'), (host,port))
data, addr = s.recvfrom(1024).decode('utf-8')

以上行也是错误的。 socket.recvfrom(..)返回(消息,地址)的元组。 tuple没有decode方法。您只需要解码message

data, addr = s.recvfrom(1024)
data = data.decode('utf-8')

服务器

import socket
import time

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('127.0.0.1', 5000))

print("The server has now started on ", time.ctime())

clients = []
while True:
    data, addr = s.recvfrom(1024)
    text = data.decode('utf-8')
    if "Quit" in text:
        break

    if addr not in clients:
        clients.append(addr)

    print(time.ctime(), "-", addr, ":", text)
    for client in clients:
        s.sendto(data, client)

s.close()