当前位置: 首页 > 知识库问答 >
问题:

Python 3套接字,无法接收数据(编码,解码)

濮阳振
2023-03-14

我有一个游戏,我正在用一些网络来制作多人游戏。我创建了一个自定义模块(在任何方面都不是最好的),将两个值(XY)从-1048576转换为1048576,一个值从0到60(健康),转换为6个字符。所以我可以用6个字节发送所有的信息。

但是这在Python 2中工作,在Python 3中,我发现我不能发送带有字符的“str”,所以我在发送之前使用了“. encode()”,在我的任何函数中使用“. decode()”。但这似乎行不通。

我真的不确定该怎么办。有什么帮助吗?

模块:

#IMPORT MODULES
from sys import version_info

#------------------------------------------------------------------------------

#FUNTIONS
#Binary String to Characters
def BinToMsg(text):
    if version_info[0] <= 2: return "".join(chr(int(text[i:i+8], 2)) for i in range(0, len(text), 8))
    else:
        data = "".join(chr(int(text[i:i+8], 2)) for i in range(0, len(text), 8))
        return data.encode()

#Characters to Binary String
def MsgToBin(text):
    if version_info[0] <= 2: return "".join('{:08b}'.format(ord(c)) for c in text)
    else:
        text = text.decode()
        return "".join('{:08b}'.format(ord(c)) for c in text)

#Corrects 0's values in Binary Strings
def fixDigit(text, digits):
    lenth = digits - len(text)
    for loop in range(lenth): text = "0" + text
    return text

#Data to Characters
def DataToMsg(x,y,health):

    if health >= 2**6 or health < 0: return None
    bins = fixDigit(bin(health)[2:],6)
    for cord in (x,y):
        if cord >= 2**20: return None
        if cord < 0: bins += "0"
        else: bins += "1"
        bins += fixDigit(bin(int(str(cord).replace("-","")))[2:],20)

    return BinToMsg(bins)

#Characters to Data
def MsgToData(msg):

    bins = MsgToBin(msg)
    data = {"Health":int(bins[:6],2)}
    data["X"] = int(bins[7:27],2)
    data["Y"] = int(bins[28:48],2)
    if bins[6] == "0": data["X"] *= -1
    if bins[27] == "0": data["Y"] *= -1

    return data

这个会这样用...

Player = {"X":-1234,"Y":5678,"Health":23}
...
connection.send(DataToMsg(Player["X"],Player["Y"],Player["Health"]))
...
print(MsgToData(connection.recv(6))
...
Output: {"X":-1234,"Y":5678,"Health":23}

共有1个答案

李耀
2023-03-14

当字符串以UTF-8(默认编码)编码时,长度会增加。所以如果你设置了你的连接。recv()到6,它不会接收所有信息。只是一些切成块的。所以当你解码它时,它会给你一个错误。

为了保持相同的长度,我发现将其编码为“cp037”很有用。

用法

string.encode("cp037")
...
string.decode("cp037")
 类似资料:
  • Win 10 64位C服务器: Java客户端: Python客户端: 运行了一些特殊字符的实验,但客户端或服务器都无法处理它。 java客户端结果:使用utf-8完成编码,python应用程序抛出异常,因为它无法解码从socket:Python3.9接收的数据。5我试图用不同的编码保存服务器,但我认为情况并非如此,可能需要对套接字声明进行一些更改。客户端与服务器是同一台机器。这是我的实际问题,要

  • 我试着做一个简单的服务器-客户机套接字通信,但服务器似乎无法正常工作。无论何时发送或接收,我都会收到此错误: 非插座上的插座操作:非插座上的插座操作 奇怪的是,这只会在服务器发送时出现。客户似乎还可以:

  • 我正在编写原始套接字客户端(成功发送UDP数据包)和一个服务器套接字,问题出在服务器部分。 Im按以下方式创建套接字:

  • 因此,我正在用Java编写一个程序,在DatagramSocket和DataGramPacket的帮助下发送和接收数据。问题是,当我发送数据/接收数据时,数据在我发送的程序中也会有所不同,但只是在某些情况下,比如: 但有时会起作用,比如:

  • 当我尝试接收大量数据时,它会被切断,我必须按enter键才能获取其余数据。起初,我可以增加一点,但它仍然不会收到所有的。正如您所看到的,我增加了conn.recv()上的缓冲区,但它仍然无法获取所有数据。它会在某一点切断它。我必须在原始输入上按enter键才能接收其余数据。我是否可以一次获取所有数据?这是密码。

  • 我使用Android应用程序通过TCP套接字与同一局域网上的PC java应用程序进行通信、发送和接收消息。下面是我在android中使用的Asynctask的代码,用于发送消息并从PC接收回复: } 我在onPostExcecute中的祝酒词中显示PC的回复。 Android通过BufferedWriter发送消息,而PC上的java应用程序在BufferedReader中接收消息。 PC在收到