level 3
2L 其他支援教程
https://www.bilibili.com/video/av4266648/?from=search&seid=12516583731004653970
2018年02月05日 12点02分

服务端与客户端之间不同的传输协议,就好比我们选用不同的交通工具,不同的交通工具具有不同的特性。
TCP是基于连接的协议,也就是说在正式收发数据前,必须和对方建立可靠的连接,比如你给别人打电话,必须等线路接通了、对方拿起话筒才能相互通话。同理,我们要为服务端和每个客户端之间铺设好轨道,才可以开始进行传输。我们可以把每辆列车视为数据包,数据包都是有序地往一端进行输送。TCP是可靠的传输协议,所有的数据包到达一端后,基本都是有序且完整没有遗漏的。
UDP是面向非连接的协议,不必要与对方先建立起连接就可以进行传输,好比你给别人发短信,输入个手机号码发送就性了,无需经过对方的应答。同理,把每个小车视为数据包,在宽敞的公路上不同的车有快有慢,数据包不一定会按顺序达到另一端,甚至有的小车会停在路中央,不到达另一端,也就是丢包。因此,UDP传输协议是不可靠的(但是UDP是可以保证每个数据包里的数据的完整性,这点跟TCP一样可以放心,您使用的交通工具里的乘客不会中途丢失……)。
创建列表:用于统计所有玩家socket ID的列表
async_load是GMS提供的映射map,我们可以查找键key,得到我们想要的值value。
端口连接时触发的事件 connect
{
{
看不懂英文也好,不懂u8、s8、u16等等也罢,表格里后面描述的取值范围你一定能看懂,自己查阅掂量着用,选择合适的最好。
var count = ds_list_size(global.list_socket);
player_buffer是oServer创建事件里已经创建好的buffer
sock是刚加入者的socket ID以及刚断开连接者的socket ID,是我们之前在网络异步事件里的ConnectDisconnectClient脚本中定义的成员变量。一定要注意async_load里socket与id的区别,socket返回得到的是刚加入者的socket ID或刚断开连接者的socket ID,而id返回的是事件触发者的socket ID(这里的事件指的是type里的联入、断开、接收到数据包3个事件。)
network_send_packet这个函数最后一个参数是size尺寸,我们一般直接使用buffer_tell函数直接返回得到buffer的大小。
在第二个数据包中,用ds_list_write函数将global.list_socket列表转换成字符串,便于我们传送数据,另一端可以再使用ds_list_read函数把这个字符串再还原成跟global.list_socket一模一样的列表。
client = network_create_socket(network_socket_tcp)
uid = -1同样,没有被声明过的变量,我们在后面的绘制事件里也无法绘制出来,在创建后完成连接的一瞬间才会接收到服务器发送的socket ID。