我制作了一个简单的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
^^^服务器
答案 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()