我正在尝试创建一个客户端 - 服务器模型,对python网络编程不熟悉我遇到了一个错误,其中包含以下内容: -
tcpCliSoc.send('[%s]%s'%(bytes(ctime(),'utf_8'),data))TypeError:需要类似字节的对象,而不是'str'
这是服务器和客户端实现
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 :(得分: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 :(得分: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)
答案 2 :(得分: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()
享受!!!
达门德拉