鱼C论坛

 找回密码
 立即注册
查看: 1924|回复: 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)就会报错。

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

注:我进行了内网穿透,将自己的电脑变成了服务器
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()) # 机器也要礼貌一点[doge]
                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()
最佳答案
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()) # 机器也要礼貌一点[doge]

    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,我如果有空的话就能教你。

最佳答案

查看完整内容

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

使用道具 举报

发表于 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()) # 机器也要礼貌一点[doge]

    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,我如果有空的话就能教你。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-7 07:27:27 From FishC Mobile | 显示全部楼层
你设定的空间不就是1024吗,超出肯定不行啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

发表于 2021-8-7 07:29:12 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

我试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

之前指定的是5012,也不行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

没用的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

啊在,盲区了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

百度上的基本没用,是不是send有什么坑?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-7 11:53:01 | 显示全部楼层
是不是内网穿透的原因,他是不是数据量超出了自动分段,你分段发送试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

百度上没有的东西找我就对了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-28 08:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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