python 3.6 socket tcp连接报错:TypeError: a bytes-like object is required, not 'str'

python核心编程中关于socket tcp通信代码:

客户端:

# !/usr/bin/env python

from socket import *

HOST = '*******'
PORT = 21567
BUFSIZE = 1024
ADDR = (HOST, PORT)

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

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

tcpCliSock.close()

服务器:

# !/usr/bin/env python

from socket import *
from time import ctime

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

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

while True:
    print("waiting for connection...")
    tcpCliSock, addr = tcpSerSock.accept()
    print("...connected from: ", addr)

    while True:
        data = tcpCliSock.recv(BUFSIZE)
        if not data:
            break
        print(type(data))
        tcpCliSock.send("[%s] %s" %(ctime(), data))

    tcpCliSock.close()

tcpSerSock.close()

在python 3.6 环境运行报错:

Traceback (most recent call last):
  File ".\tsTclnt3.py", line 17, in <module>
    tcpCliSock.send(data)
TypeError: a bytes-like object is required, not 'str'

于是更改客户端代码如下:

192142_eMBq_3720135.png--->tcpCliSock.send(data.encode())

运行报错:

192742_0pxZ_3720135.png

打印data数据类型是<class 'bytes'>,于是很好奇为什么会报这个错误。网上查资料看到这段话:

In python 3, bytes strings and unicodestrings are now two different types. Since sockets are not aware of string encodings, they are using raw bytes strings, that have a slightly differentinterface from unicode strings.

So, now, whenever you have a unicode stringthat you need to use as a byte string, you need toencode() it. And whenyou have a byte string, you need to decode it to use it as a regular(python 2.x) string.

Unicode strings are quotes enclosedstrings. Bytes strings are b”” enclosed strings

When you use client_socket.send(data),replace it by client_socket.send(data.encode()). When you get datausing data = client_socket.recv(512), replace it by data =client_socket.recv(512).decode()

遂修改代码如下:

193409_kq77_3720135.png--->193422_Tpj7_3720135.png

这才调通。

最后上一遍终极代码:

服务端:

# !/usr/bin/env python

from socket import *
from time import ctime

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

tcpSerSock = socket(AF_INET, SOCK_STREAM) #创建套接字
tcpSerSock.bind(ADDR)                     #套接字和地址进行绑定
tcpSerSock.listen(5)                      #监听(设置最大监听数)

while True:
    print("waiting for connection...")
    tcpCliSock, addr = tcpSerSock.accept()
    print("...connected from: ", addr)

    while True:
        data = tcpCliSock.recv(BUFSIZE).decode()
        if not data:
            break
        tcpCliSock.send(("[%s] %s" %(ctime(), data)).encode())

    tcpCliSock.close()

tcpSerSock.close()

客户端:

# !/usr/bin/env python

from socket import *

HOST = '*********'
PORT = 21567
BUFSIZE = 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())
    data = tcpCliSock.recv(BUFSIZE)
    if not data:
        break
    print(data.decode())

tcpCliSock.close()

 

转载于:https://my.oschina.net/u/3720135/blog/1572116

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值