由百度godot吧 吧主 人类的大敌 提供方案
Godot作为客户端
- 需要继承自Node,采用StreamPeerTCP类
extends Node
var client = StreamPeerTCP.new()
与正常的TCP连接一样,分3组,连接服务器、发送数据、接收数据,这里采用UTF-8格式进行数据通信
- 连接代码
client.connect_to_host('127.0.0.1',9999)
if client.is_connected_to_host():
thread = Thread.new()
thread.start(self,'revice')
- 发送数据(utf8)
client.put_data('你好'.to_utf8())
使用put_data方法可以正常发送数据,其它方法只能用于Godot的服务器与客户端之间通信,因为其它方法Godot会向数据前后添加几个字节的标识,使得数据发生改变
- 接收数据(utf8)
func revice(_all):
while true:
rev_num = client.get_available_bytes()
if rev_num > 0:
var data = client.get_utf8_string(rev_num)
print(data)
continue
采用了while循环,可能会导致帧率降低,先判断收到>0的字节数,再将其转化为utf8字符
- Godot客户端就完成了,一般不考虑关闭连接,如需关闭,调用代码即可
client.disconnect_from_host()
Python服务端代码
-采用socketserver包,可以方便的建立服务端
client = {} # 建立全局字典,保存在线客户端
class MyTCPHandler(socketserver.BaseRequestHandler):
# socketserver包的运行代码方法
def handle(self):
global client
st_alive = True # 用于心跳的标志位
login = None # 用于获取登录用户名
try:
while True:
st = Timer(300,self.handel_timeout) # 5分钟心跳
st.start()
st_alive = True
self.data = self.request.recv(10240) # 接收数据,阻塞
if not self.data:
break
revData = self.data.decode('utf-8')
st.cancel() # 接收到数据,停止心跳
st_alive = False
print(revData) # 对数据进行处理
self.request.sendall('收到了'.encode('utf-8')) # 发送数据
except:
pass
finally:
if login in client:
client.pop(login)
self.request.close() # 关闭连接
if st_alive:
st.cancel()
def setup(self):
pass
# 心跳方法
def handel_timeout(self):
try:
self.request.sendall(''.encode('utf-8'))
except:
self.request.shutdown(0)
if __name__ == "__main__":
HOST,PORT = "0.0.0.0",9999
server = socketserver.ThreadingTCPServer((HOST,PORT),MyTCPHandler)
server.serve_forever()