2015-05-27 3 views
0

Я создал два сценария, которые устанавливают клиентский сокет и серверный сокет в localhost.Получение ошибки кодирования с использованием сокетов в Python

Сервер сокета

import socket 
from time import ctime 

HOST = '' 
PORT = 21567 
BUFSIZ = 1024 
ADDR = (HOST,PORT) 

tcpsersoc = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 
tcpsersoc.bind(ADDR) 
tcpsersoc.listen(5) 

while True: 
    print('waiting for connection .... ') 
    print(ADDR) 
    tcpClisoc,addr = tcpsersoc.accept() 
    print('......connected from', addr) 

    while True: 
     data = tcpClisoc.recv(BUFSIZ) 
     if not data: 
      break 
     tcpClisoc.send('[%s]%s'%(bytes(ctime(),'UTF-8'),data)) 

    tcpClisoc.close() 

tcpsersoc.close() 

Client гнездо

from socket import * 

HOST= '127.0.0.1' 
PORT = 21567 
BUFSIZ = 1024 
ADDR = (HOST,PORT) 

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

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

tcpCliSock.close() 

я все еще получаю ошибку ниже, несмотря на преобразование данных в объект байт. Я использую питон 3.x

это ошибка, поднятого сокет сервера

waiting for connection .... 
('', 21567) 
......connected from ('127.0.0.1', 52859) 
Traceback (most recent call last): 
    File "<pyshell#9>", line 1, in <module> 
    import exampletcpserver 
    File "C:/Python34\exampletcpserver.py", line 23, in <module> 
    tcpClisoc.send('[%s]%s'%(bytes(ctime(),'UTF-8'),data)) 
TypeError: 'str' does not support the buffer interface 

Пожалуйста, дайте мне знать, где я буду неправильно.

ответ

1

Вы пытаетесь отправить строку, но сокеты требуют отправки байтов. Используйте

tcpClisoc.send(('[%s]%s' % (ctime(), data.decode("UTF-8"))).encode("UTF-8")) 

Python 3.5 будет поддерживать альтернативный

tcpClisoc.send(b'[%s]%s' % (bytes(ctime(), 'UTF-8'), data)) 
+0

разве что именно то, что байты (CTIME(), 'UTF-8') делает? – Kannaj

+1

№ 'bytes (ctime(), 'utf-8')' кодирует это байтам. Вставив это в операцию форматирования по строке ('"% s "% (..)'), вы снова сделаете из нее строку. – Phillip

+0

ahhh :) спасибо. похоже, сейчас работает. Кажется, я получаю ответ от сервера. это приведенный ниже вывод, когда я печатаю «hi» ** [b 'Thu May 28 00:50:54 2015'] b'hi '** Я также использую декодирование неправильно? – Kannaj