【问题标题】:Socket Programming - a bytes-like object is required, not 'str' [duplicate]套接字编程 - 需要一个类似字节的对象,而不是'str' [重复]
【发布时间】:2019-12-23 19:30:54
【问题描述】:

我一直在阅读Python - Network Programming 并尝试了代码。

查看不带括号的 print 语句,此代码适用于 Python 2。

由于我使用的是Python3,所以我对其进行了修改。

这是更新后的代码。

server.py

#!/usr/bin/python           # This is server.py file

import socket               # Import socket module

s = socket.socket()         # Create a socket object
host = socket.gethostname() # Get local machine name
port = 12345                # Reserve a port for your service.
s.bind((host, port))        # Bind to the port

s.listen(5)                 # Now wait for client connection.
while True:
   c, addr = s.accept()     # Establish connection with client.
   print('Got connection from', addr)
   c.send('Thank you for connecting')
   c.close()                # Close the connection

client.py

#!/usr/bin/python           # This is client.py file

import socket               # Import socket module

s = socket.socket()         # Create a socket object
host = socket.gethostname() # Get local machine name
port = 12345                # Reserve a port for your service.

s.connect((host, port))
print(s.recv(1024))
s.close()                     # Close the socket when done

然后我按照教程中的说明运行这两个代码。

以下将在后台启动服务器。 $ python server.py &

一旦服务器启动,运行客户端如下:$ python client.py

这将产生以下结果 -

从 ('127.0.0.1', 48437) 获得连接谢谢您的连接

但是,我得到的输出略有不同。 最初我跑了python server.py。没啥事儿。 一旦我执行python client.py,我就会收到以下错误。

user@linux:~$ python server.py 
Got connection from ('127.0.0.1', 59546)
Traceback (most recent call last):
  File "server.py", line 16, in <module>
    c.send('Thank you for connecting')
TypeError: a bytes-like object is required, not 'str'
user@linux:~$ 

user@linux:~$ python client.py 
b''
user@linux:~$ 

代码有什么问题以及如何解决?

【问题讨论】:

  • 你需要对你的信息进行编码,'Thank you for connecting'.encode() 也是如此,在client.py 中更改为recv(1024).decode()
  • 谢谢。有用!但是为什么需要对消息进行编码/解码呢?
  • @d-coder,我不知道通过网络传输时需要对消息进行编码/解码。顺便说一句,谢谢在这里找到答案。 quora.com/Why-is-encoding-needed?share=1
  • 您下面的教程是为 Python 2 编写的(打开的页面显示 Python 2.4 [原文如此!])。你真的很想找到这十年的介绍。不再很难找到好的 Python 3 介绍材料。也许还可以参见nedbatchelder.com/text/unipain.html,以获得对这种特殊差异的基础的易于理解的解释。
  • @Sabrina :现在您知道为什么在通过网络发送消息时需要对消息进行编码。拍拍自己的背!干得好.. :)

标签: python sockets


【解决方案1】:

就这样

c.send(b'感谢连接')

【讨论】:

  • 这是来自客户端。怎么去掉邮件前面的buser@linux:~$ python client.py b'Thank you for connecting' user@linux:~$
  • b 指定一个字节字符串,其中字符串中的每个字符都是一个字节。如果只传输 ASCII 字符串,则无需关心编码和解码。您可以使用msg = received_msg.decode('ascii') 将其转换回str 类型。
【解决方案2】:

您可以尝试用以下方式对消息进行编码,而不是像字符串一样发送它:

...
msg = 'Thank you for connecting'
c.send(str.encode(msg))
...

在客户端,您可以使用

将其解码回来
s.recv(1024).decode('utf-8')

【讨论】:

  • 服务器端代码有效,但客户端代码无效。你能在客户端分享完整的代码吗?
  • 您的代码的基本问题是,当您打开与套接字的连接时,它的预期数据为字节流并改为获取字符串..所以您可以使用类似 b'your message' 然后发送它..它将解决问题...如果您愿意,我可以帮助您提供代码。
猜你喜欢
  • 2021-10-28
  • 2017-01-01
  • 2020-07-16
  • 1970-01-01
  • 1970-01-01
  • 2016-01-05
  • 1970-01-01
相关资源
最近更新 更多