我有一个游戏,我正在用一些网络来制作多人游戏。我创建了一个自定义模块(在任何方面都不是最好的),将两个值(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}
当字符串以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在收到