套接字编程-需要一个类似字节的对象,而不是'str'

时间:2019-08-18 06:22:27

标签: python sockets

我一直在阅读有关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:~$ 

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

2 个答案:

答案 0 :(得分:2)

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

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

在客户端,您可以使用

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

答案 1 :(得分:2)

就是这样

c.send(b'谢谢您的连接')