(原) Godot 免费跨平台游戏引擎: 中文聊天(网络通信)

原创文章,请后转载,并注明出处。

之前也简单的学习了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等。

相关文章