2016-03-03 4 views
0

Я пытаюсь сделать модель клиент-сервер, являющийся новым для питона сетевого программирования я застрял на ошибку, которая гласит следующее: -TypeError: а байт-подобный объект необходим, а не «ул»

tcpCliSoc.send ('[% s]% s' % (байт (CTime(), 'UTF_8'), данные))
TypeError: а байт-подобный объект необходим, а не 'ул'

Реализация сервера и клиента

Внедрение TCP-сервера

from socket import * 
from time import ctime 

HOST = '' 
PORT = 21572 
ADDR = (HOST, PORT) 
BUFFSIZE = 1024 

tcpSerSoc = socket(AF_INET, SOCK_STREAM) 

tcpSerSoc.bind(ADDR) 
tcpSerSoc.listen(5) 

while True: 
    print("waiting for connection......") 
    tcpCliSoc, addr = tcpSerSoc.accept() 
    print("connected from", addr) 

    while True: 
     data = tcpCliSoc.recv(BUFFSIZE) 
     if not data: 
      break 
     tcpCliSoc.send('[%s] %s' % (bytes(ctime(), 'utf_8'), data)) 
    tcpCliSoc.close() 
tcpSerSoc.close() 

TCP-реализация клиента

from socket import * 

__author__ = 'Lamer' 

HOST = 'localhost' 
PORT = 21572 
ADDR = (HOST, PORT) 
BUFFSIZE = 1024 

tcpCliSoc = socket(AF_INET, SOCK_STREAM) 
tcpCliSoc.connect(ADDR) 

while True: 
    data = input('>') 
    if not data: 
     break 
    tcpCliSoc.send(data.encode()) 
    data = tcpCliSoc.recv(BUFFSIZE) 
    if not data: 
     break 
    print(data.decode(encoding='utf-8')) 

tcpCliSoc.close() 
+0

Как и в сторону, вы должны использовать 'sock.sendall()' 'над sock.send()' :) – Goodies

ответ

5

Строка интерполяции создает строку, а не байт объекта:

>>> '%s foo' % b'bar' 
"b'bar' foo" 

(Обратите внимание, что результат имеет тип str - - И у него есть 'b' и некоторые цитаты, вставленные в него, которые вам, вероятно, не нужны).

Вы, вероятно, хотите интерполировать байт с байтами:

>>> b'%s foo' % b'bar' 
b'bar foo' 

Или в вашем коде:

tcpCliSoc.send(b'[%s] %s' % (bytes(ctime(), 'utf_8'), data)) 
1

В строке

tcpCliSoc.send('[%s] %s' % (bytes(ctime(), 'utf_8'), data)) 

параметр '[%s] %s' % (bytes(ctime(), 'utf_8'), data) является строка, а не массив байтов. Несмотря на то, что вы используете объект байта для второго заполнителя строки, общая форматированная строка «[blah] blah» представляет собой строку. Вы должны быть в состоянии исправить это довольно легко что-то вроде:

message_str = '[%s] %s' % (bytes(ctime(), 'utf_8'), data) 
message_bytes = message_str.encode(utf-8) 
tcpCliSoc.send(message_bytes) 
1

Я использую Python 3.5.1 и столкнулся вопрос с отправкой и получением данных. Я решил ошибку «TypeError: строковый аргумент без кодировки», добавив кодировку на сервер и клиент.

# Server Code: 
while True: 
    data = c.recv(1024) 
    if not data: 
     break; 
    print("from connected user:"+ str(data)) 
    data = str(data).upper() 
    print("Sending :"+ str(data)) 
    byte_message = data.encode() 
    c.send(byte_message) 
c.close() 
# Client Code: 
while(message != 'q'): 
    fmessage = message.encode() 
    s.send(fmessage) 
    data = s.recv(1024) 
    print("Recieved from server :" + str(data)) 
    message = input() 
s.close() 

Наслаждайтесь !!!

Dharmendra

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