I have this code
def run(self):
while True:
c, a = self.sock.accept()
print(c)
name = c.recv(1024)
people = ""
self.name_list.append(str(name, 'utf-8'))
num_g = len(self.name_list)
c.send(bytes(str(num_g), 'utf-8'))
print((str(num_g)))
data = str(c.recv(1024), 'utf-8')
print(data)
if str(data) == "ok":
for name in self.name_list:
print(name)
c.send(bytes(name, 'utf-8'))
print(len(self.name_list))
print(strftime("%Y-%m-%d %H:%M:%S", gmtime())+" "+str(name, 'utf-8')+ " is connected")
and i get this error
File "./server.py", line 51, in run
print(strftime("%Y-%m-%d %H:%M:%S", gmtime())+" "+str(name, 'utf-8')+ " is connected")
TypeError: decoding str is not supported
i don't understand why i get this error. when i receive the bytes from connection,
name = c.recv(1024)
the name is in bytes, that's why i tried to make it string when i print that line
You've already converted that name to a str
.
The line
self.name_list.append(str(name, 'utf-8'))
converts the name to a string and saves it a list.
Then
for name in self.name_list:
loops over those names, and at the end of the for
loop the value of name
is the final converted name in self.name_list
.
So when you do
strftime("%Y-%m-%d %H:%M:%S", gmtime())+" "+str(name, 'utf-8')+ " is connected")
It's using that name, not the raw one returned by name = c.recv(1024)
The simple solution is to use a different variable name in that for
loop which processes self.name_list
.