2015-06-17 4 views
0

Я пытаюсь использовать пакет python socket для реализации эхо-сервера. Но на нем постоянно возникает ошибка: TypeError: unsupported operand type(s) for %: 'bytes' and 'bytes', есть ли ошибки в моем коде?Python3: socket: TypeError: неподдерживаемый тип операндов для%: 'bytes' и 'bytes'

здесь ошибка:

Exception in thread Thread-1: 
Traceback (most recent call last): 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/threading.py", line 921, in _bootstrap_inner 
     self.run() 
    File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/threading.py", line 869, in run 
     self._target(*self._args, **self._kwargs) 
    File "do_tcp_server.py", line 25, in tcplink 
     sock.send(b'Hello, %s!' % data) 
TypeError: unsupported operand type(s) for %: 'bytes' and 'bytes' 

Вот мой код:

server.py:

#!/usr/bin/env python3 
# coding: utf-8 

"A simple server" 

import socket 
import threading 
import time 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

s.bind(("127.0.0.1", 9999)) 

s.listen(5) 
print("Lsitening...") 

def tcplink(sock, addr): 
    print('Accept new connection from %s:%s...' % addr) 
    sock.send(b'Welcome!') 
    while True: 
     data = sock.recv(1024) 
     time.sleep(1) 
     if not data or data.decode('utf-8') == 'exit': 
      break 
     sock.send(b'Hello, %s!' % data) 
    sock.close() 
    print('Connection from %s:%s closed.' % addr) 

while True: 
    sock, addr = s.accept() 
    # create a thread to handle it 
    t = threading.Thread(target=tcplink, args=(sock, addr)) 
    t.start() 

client.py:

#!/usr/bin/env python3 
# coding: utf-8 

import socket 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
# establish connection: 
s.connect(('127.0.0.1', 9999)) 
# receive Welcome data: 
print(s.recv(1024).decode('utf-8')) 
for data in [b'Michael', b'Tracy', b'Sarah']: 
    # send data 
    s.send(data) 
    print(s.recv(1024).decode('utf-8')) 
s.send(b'exit') 
s.close() 

ответ

0

Нормальная строка форматирования не может использоваться для bytes. Я думаю, что путь к этому - вы должны сначала сгенерировать строку, форматировать ее, а затем преобразовать ее в байты с соответствующей кодировкой. Таким образом, следующие изменения должны работать

изменения

sock.send(b'Hello %s!' % data) 

в

reply = 'Hello %s!' % data) 
sock.send(bytes(reply, 'utf-8')) 

В основном это происходит из-за разницы между строкой и байтов в Python3. [Best way to convert string to bytes in Python 3? имеет более подробную информацию об этом.

Это должно сработать.

+0

да, это работает, спасибо. – qiwihui

+0

Но у меня все еще есть вопрос об этом, так как я отправляю байты в client.py, почему он не работает? – qiwihui

+0

Ну, вы прямо генерируете объект байтов, когда говорите b'Tracy, если вы пытаетесь сделать что-то вроде b'trac% '%' y ', вы все равно столкнетесь с проблемой. – gabhijit

0

Ответ @gaabhijit Гав является good.I только предположить, что код в вопрос здесь (enter link description here) В противном случае, когда приходит python_3.5, b'%s' может быть правильным().

+0

Да, и кажется, что python3.4 не пройдет. – qiwihui

Смежные вопросы