Robot_Steve 发表于 2021-8-7 00:36:33

Python的Socket报出异常的问题

本帖最后由 Robot_Steve 于 2022-5-2 10:02 编辑

用Python的Socket库,结果报出了这个异常:
UnicodeDecodeError: 'utf-8' codec can't decode bytes in position 510-511: unexpected end of data

我用send的时候报出的。
我发现这个东西很令人迷惑。在传入send的字符串较少的情况下不会报错。一旦超过阀值(好像是异常里的510)就会报错。

不知道怎么解决,望各位大佬可以帮个忙

注:我进行了内网穿透,将自己的电脑变成了服务器
import socket

ip_port = ('127.0.0.1', 42093)
sk = socket.socket()
sk.bind(ip_port)
sk.listen(20)

while True:
    conn, addr = sk.accept()
    while True:
      try:
            message = conn.recv(1024)
      except:
            break
      else:
            # 接收信息
            text = message.decode(encoding='utf-8')
            if text == "Break":# 客户端发来退出请求
                conn.send("Thanks".encode()) # 机器也要礼貌一点
                break

            msg = 【此处省略1000字的字符串】
            
            #发送信息
            conn.send(bytes(msg, "utf8"))

conn.close()

import socket

class Network:
    def __init__(self):
      # Socket
      self.client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
      self.client.connect(('dsx2jkr.nat.ipyingshe.com', 37630))
      
    def receive(self, info):
      while True:
            self.client.send(info.encode()) # 发送信息

            """ 接收返回的信息 """
            message_data = self.client.recv(1024)
            text = str(message_data, "utf8")

            return text

net = Network()
ret = net.receive("homepage")
net.close()
net = Network()
net.receive("Break")
net.close()

nahongyan1997 发表于 2021-8-7 00:36:34

本帖最后由 nahongyan1997 于 2021-8-9 09:35 编辑

socket 模块不是你这样玩的,你用我给你改好的代码就行了,吧connect连接的地址改成你的域名和端口就好了。
接收端代码:
import socket

ip_port = ('', 42093)
sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sk.bind(ip_port)
sk.listen(20)

while True:
    conn, addr = sk.accept()
    data = b""
    while True:
      message = conn.recv(1024)
      data += message

      if len(message) < 1024:
            break


    # 接收信息
    text = message.decode(encoding='utf-8')
    print(text)
    if text == "Break":# 客户端发来退出请求
      conn.send("Thanks".encode()) # 机器也要礼貌一点

    msg = "【此处省略1000字的字符串】"
    #发送信息
    conn.send(bytes(msg, "utf8"))
    conn.close()

发送端代码:
import socket

class Network:
    def __init__(self):
      # Socket
      self.client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
      self.client.connect(('127.0.0.1', 42093))
      
    def receive(self, info):
      self.client.send(info.encode()) # 发送信息

      """ 接收返回的信息 """
      data = b""
      while True:
            message = self.client.recv(1024)
            data += message

            if len(message) < 1024:
                break

      print(data.decode())

net = Network()
ret = net.receive("homepage")
net.receive("Break")


顺便宣传我的网站: puddingcat.top:9999 ,是用 pyqt5 + flask +python爬虫 + mysql + html5 + css3 + js 制作的。
来注册个账号你就是老用户了,想学习加qq 547840062,我如果有空的话就能教你。

wp231957 发表于 2021-8-7 07:27:27

你设定的空间不就是1024吗,超出肯定不行啊

大马强 发表于 2021-8-7 07:27:58

我百度翻译了你的报错:
“utf-8”编解码器无法解码位置510-511的字节:数据意外结束
我感觉把 text = message.decode(encoding='utf-8') 去掉或改成 gbk 试试

大马强 发表于 2021-8-7 07:29:12

试试这个

Robot_Steve 发表于 2021-8-7 09:01:56

大马强 发表于 2021-8-7 07:27
我百度翻译了你的报错:
“utf-8”编解码器无法解码位置510-511的字节:数据意外结束
我感觉把 text = me ...

我试试

Robot_Steve 发表于 2021-8-7 09:03:36

wp231957 发表于 2021-8-7 07:27
你设定的空间不就是1024吗,超出肯定不行啊

之前指定的是5012,也不行{:10_277:}

Robot_Steve 发表于 2021-8-7 09:08:24

大马强 发表于 2021-8-7 07:29
试试这个

没用的

大马强 发表于 2021-8-7 09:09:37

Robot_Steve 发表于 2021-8-7 09:08
没用的

啊在,盲区了{:10_266:}

Robot_Steve 发表于 2021-8-7 09:16:57

大马强 发表于 2021-8-7 07:27
我百度翻译了你的报错:
“utf-8”编解码器无法解码位置510-511的字节:数据意外结束
我感觉把 text = me ...

百度上的基本没用,是不是send有什么坑?

名字只有七个字 发表于 2021-8-7 11:53:01

是不是内网穿透的原因,他是不是数据量超出了自动分段,你分段发送试试

nahongyan1997 发表于 2021-8-10 10:16:11

Robot_Steve 发表于 2021-8-7 09:16
百度上的基本没用,是不是send有什么坑?

百度上没有的东西找我就对了
页: [1]
查看完整版本: Python的Socket报出异常的问题