基础教程14章-socket模块a bytes-like object is required, not 'str'

socket模块

套接字主要是两个程序之间的“信息通道”。

创建服务器套接字后,让它等待连接。这样它就在某个网络地址处(IP地址和一个端口号的组合)监听

一个套接字就是一个socket模块中的socket类的实例。

实例化需要3个参数,对于一个普通的套接字,不需要提供任何参数

  1. 地址族(默认是socket.AF_INET)

  2. 流(默认是socket.SOCK_STREAM)

  3. 使用的协议(默认是0)

套接字有两个方法:send和recv,用于传输数据

  1. 使用字符串参数调用send发送数据

  2. 用一个所需的(最大)字节数做参数调用recv来接收数据(通常用1024)

一个小型服务器:

import socket

s = socket.socket()

host = socket.gethostname()             # 得到当前主机名(如www.baidu.com)
port = 1234
s.bind((host, port))                    # 与客户端connect的地址相同,格式为(host,port)的元组
                                        # host是主机名,port是端口号
s.listen(5)                             # 监听(只有一个参数,即允许排队等待的连接数目,这些连接在禁用之前等待接收)
while True:
    c, addr = s.accept()                # 接收客户端的连接。等待直到客户端连接,然后返回一个格式为(client,address)的元组
    print('Got connection from', addr)
    c.send('Thank you for connecting')
    c.close()

一个小型客户机:

import socket
s = socket.socket()

host = socket.gethostname()
port = 1234

s.connect((host, port))        # 连接到服务器
print(s.recv(1024))

先运行服务器代码,进入等待状态,再运行客户端代码,出现如下报错:

PS D:pytest> python .jcjc14-1.py
Got connection from ('192.168.1.4', 56424)
Traceback (most recent call last):
  File ".jcjc14-1.py", line 13, in <module>
    c.send('Thank you for connecting')
TypeError: a bytes-like object is required, not 'str'

修改代码,在数据前加‘b’,强制转换

服务器代码修改如下:

import socket

s = socket.socket()

host = socket.gethostname()
port = 1234
s.bind((host, port))

s.listen(5)
while True:
    c, addr = s.accept()
    print('Got connection from', addr)
    c.send(b'Thank you for connecting')
    c.close()

重新运行,服务器端:

PS D:pytest> python .jcjc14-1.py
Got connection from ('192.168.1.4', 56484)
Got connection from ('192.168.1.4', 56488)

客户端:

PS C:UsersAdministrator> python D:pytestjcjc14-2.py
b'Thank you for connecting'
PS C:UsersAdministrator> python D:pytestjcjc14-2.py
b'Thank you for connecting'
原文地址:https://www.cnblogs.com/p36606jp/p/15113386.html