鱼C论坛

 找回密码
 立即注册
查看: 2182|回复: 11

[已解决]Python的Socket报出异常的问题

[复制链接]
发表于 2021-8-7 00:36:33 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 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)就会报错。

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

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

  2. ip_port = ('127.0.0.1', 42093)
  3. sk = socket.socket()
  4. sk.bind(ip_port)
  5. sk.listen(20)

  6. while True:
  7.     conn, addr = sk.accept()
  8.     while True:
  9.         try:
  10.             message = conn.recv(1024)
  11.         except:
  12.             break
  13.         else:
  14.             # 接收信息
  15.             text = message.decode(encoding='utf-8')
  16.             if text == "Break":  # 客户端发来退出请求
  17.                 conn.send("Thanks".encode()) # 机器也要礼貌一点[doge]
  18.                 break

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

  23. conn.close()
复制代码

  1. import socket

  2. class Network:
  3.     def __init__(self):
  4.         # Socket
  5.         self.client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  6.         self.client.connect(('dsx2jkr.nat.ipyingshe.com', 37630))
  7.         
  8.     def receive(self, info):
  9.         while True:
  10.             self.client.send(info.encode()) # 发送信息

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

  14.             return text

  15. net = Network()
  16. ret = net.receive("homepage")
  17. net.close()
  18. net = Network()
  19. net.receive("Break")
  20. net.close()
复制代码
最佳答案
2021-8-7 00:36:34
本帖最后由 nahongyan1997 于 2021-8-9 09:35 编辑

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

  2. ip_port = ('', 42093)
  3. sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  4. sk.bind(ip_port)
  5. sk.listen(20)

  6. while True:
  7.     conn, addr = sk.accept()
  8.     data = b""
  9.     while True:
  10.         message = conn.recv(1024)
  11.         data += message

  12.         if len(message) < 1024:
  13.             break


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

  19.     msg = "【此处省略1000字的字符串】"
  20.     #发送信息
  21.     conn.send(bytes(msg, "utf8"))
  22.     conn.close()
复制代码

发送端代码:
  1. import socket

  2. class Network:
  3.     def __init__(self):
  4.         # Socket
  5.         self.client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  6.         self.client.connect(('127.0.0.1', 42093))
  7.         
  8.     def receive(self, info):
  9.         self.client.send(info.encode()) # 发送信息

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

  15.             if len(message) < 1024:
  16.                 break

  17.         print(data.decode())

  18. net = Network()
  19. ret = net.receive("homepage")
  20. net.receive("Break")
复制代码


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

最佳答案

查看完整内容

socket 模块不是你这样玩的,你用我给你改好的代码就行了,吧connect连接的地址改成你的域名和端口就好了。 接收端代码: 发送端代码: 顺便宣传我的网站: puddingcat.top:9999 ,是用 pyqt5 + flask +python爬虫 + mysql + html5 + css3 + js 制作的。 来注册个账号你就是老用户了,想学习加qq 547840062,我如果有空的话就能教你。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-8-7 00:36:34 | 显示全部楼层    本楼为最佳答案   
本帖最后由 nahongyan1997 于 2021-8-9 09:35 编辑

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

  2. ip_port = ('', 42093)
  3. sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  4. sk.bind(ip_port)
  5. sk.listen(20)

  6. while True:
  7.     conn, addr = sk.accept()
  8.     data = b""
  9.     while True:
  10.         message = conn.recv(1024)
  11.         data += message

  12.         if len(message) < 1024:
  13.             break


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

  19.     msg = "【此处省略1000字的字符串】"
  20.     #发送信息
  21.     conn.send(bytes(msg, "utf8"))
  22.     conn.close()
复制代码

发送端代码:
  1. import socket

  2. class Network:
  3.     def __init__(self):
  4.         # Socket
  5.         self.client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  6.         self.client.connect(('127.0.0.1', 42093))
  7.         
  8.     def receive(self, info):
  9.         self.client.send(info.encode()) # 发送信息

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

  15.             if len(message) < 1024:
  16.                 break

  17.         print(data.decode())

  18. net = Network()
  19. ret = net.receive("homepage")
  20. net.receive("Break")
复制代码


顺便宣传我的网站: puddingcat.top:9999 ,是用 pyqt5 + flask +python爬虫 + mysql + html5 + css3 + js 制作的。
来注册个账号你就是老用户了,想学习加qq 547840062,我如果有空的话就能教你。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-8-7 07:27:27 From FishC Mobile | 显示全部楼层
你设定的空间不就是1024吗,超出肯定不行啊
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-8-7 07:27:58 | 显示全部楼层
我百度翻译了你的报错:
“utf-8”编解码器无法解码位置510-511的字节:数据意外结束
我感觉把 text = message.decode(encoding='utf-8') 去掉或改成 gbk 试试
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-8-7 07:29:12 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

我试试
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-8-7 09:03:36 | 显示全部楼层
wp231957 发表于 2021-8-7 07:27
你设定的空间不就是1024吗,超出肯定不行啊

之前指定的是5012,也不行
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-8-7 09:08:24 | 显示全部楼层

没用的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-8-7 09:09:37 | 显示全部楼层

啊在,盲区了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

百度上的基本没用,是不是send有什么坑?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-8-7 11:53:01 | 显示全部楼层
是不是内网穿透的原因,他是不是数据量超出了自动分段,你分段发送试试
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-8-10 10:16:11 | 显示全部楼层
Robot_Steve 发表于 2021-8-7 09:16
百度上的基本没用,是不是send有什么坑?

百度上没有的东西找我就对了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-16 03:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表