之前也简单的学习了Godot的网络相关内容,但一直不明白如何收发中文信息。今天在网上“遨游”的时候发现网友的文章godot游戏引擎实现TCP和UDP(网络联机,多人游戏) (此网友出了些东西,看过他的B站视频),发现别人用的根本就不是这个语句。
我的界面如下
代码改为这样,加上一个中转的golang服务器,整个代码很简单。
extends Control
var socket = PacketPeerUDP.new()
func _ready():
pass
func _input(event):
if event is InputEventKey and event.pressed:
#回车键发送
if event.scancode == KEY_ENTER:
socket.set_dest_address("127.0.0.1",4242)
var chat = $InputChat.text
if chat == "END":
socket.put_packet("quit".to_ascii())
socket.close()
get_tree().quit()
else:
$InputChat.text = ""
#socket.put_packet(chat.to_ascii())
socket.put_var(chat)
func _process(delta):
if socket.get_available_packet_count() > 0:
var array_bytes = socket.get_var()
$ChatContent.text = array_bytes
这是简单的golang UDP服务端(且称为服务端吧),实现功能,代码不用深究。
package main
import (
"fmt"
"net"
"os"
"strings"
)
func main() {
address := "127.0.0.1:4242"
addr, err := net.ResolveUDPAddr("udp", address)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
conn, err := net.ListenUDP("udp", addr)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
defer conn.Close()
for {
// Here must use make and give the lenth of buffer
data := make([]byte, 300)
_, rAddr, err := conn.ReadFromUDP(data)
if err != nil {
fmt.Println(err)
continue
}
strData := string(data)
fmt.Println("Received:", strData)
upper := strings.ToUpper(strData)
_, err = conn.WriteToUDP([]byte(upper), rAddr)
if err != nil {
fmt.Println(err)
continue
}
fmt.Println("Send:", upper)
}
}
空了看看这位网友的Godot游戏开发实践之一:用High Level Multiplayer API制作多人游戏(上)
以下是两种协议的通信,godot的脚本还是比较干净简单
# TCP客户端
func _ready():
var client = StreamPeerTCP.new()
client.connect_to_host("127.0.0.1",8087)
if client.is_connected_to_host():
client.put_var("这是一条测试信息")
# TCP服务端
var server = TCP_Server.new()
func _ready():
server.listen(8087,"127.0.0.1")
func _process(delta):
if server.is_listening():
var socket = server.take_connection()
if socket:
print(socket.get_var())
# UDP接收
func _ready():
var udp = PacketPeerUDP.new()
udp.listen(8087,"127.0.0.1")
udp.wait() #注意: 阻塞,直到有消息
var message = udp.get_var()
print(message)
# UDP发送
func _ready():
var udp = PacketPeerUDP.new()
udp.set_dest_address("127.0.0.1",8087)
udp.put_var("这是一条测试信息")
接下来的一步就是网络通信,例如处理登陆,移动,事件等等。
稍研究了一下加密,针对几个通信我做了一个简单的导图,算是0.001版。
接下来的问题是godot如何实现RSA等。