Skip to content

Commit 8e134c2

Browse files
authored
Merge pull request #639 from wechat-miniprogram/docs/UsingNetworking
docs: Update UsingNetworking.md
2 parents 32a7215 + 050547a commit 8e134c2

File tree

1 file changed

+150
-3
lines changed

1 file changed

+150
-3
lines changed

Design/UsingNetworking.md

Lines changed: 150 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,89 @@ while(!www.isDone) {}
5555

5656
## TCP 网络通信
5757

58-
如果游戏使用 TCP 进行网络通信,在 Unity WebGL 中开发者需要使用 Websocket 进行替代。
58+
如果游戏使用 TCP 进行网络通信,在 Unity WebGL 中开发者可以使用微信基础库中的TCPSocket(**需要微信基础库3.1.1**),也可以使用 Websocket 进行替代。
5959

60-
### 客户端
60+
### TCPSocket
61+
62+
注意:出于应用场景考虑,TCPSocket.OnMessage表现与文档不一致。
63+
64+
```c#
65+
/// <summary>
66+
/// [TCPSocket.onMessage(function listener)](https://developers.weixin.qq.com/minigame/dev/api/network/tcp/TCPSocket.onMessage.html)
67+
/// 监听当接收到数据的时触发该事件
68+
/// needInfo: 是否需要返回localInfo和remoteInfo,设置为 false 时这两个字段会返回null,设置为 true 会降低性能,请按需使用
69+
/// 多次使用OnMessage时needInfo以第一个OnMessage为准,OffMessage()移除所有回调后再次OnMessage可重新设置needInfo
70+
/// </summary>
71+
public void OnMessage(Action<TCPSocketOnMessageListenerResult> listener, bool needInfo = false)
72+
```
73+
74+
使用举例:
75+
76+
```c#
77+
using System.Text;
78+
using UnityEngine;
79+
using WeChatWASM;
80+
using LitJson;
81+
82+
public class TCPTest : MonoBehaviour
83+
{
84+
void Start()
85+
{
86+
// 初始化WXSDK
87+
WX.InitSDK((int code) =>
88+
{
89+
Debug.Log("InitSDK code: " + code);
90+
TestTCPSocket();
91+
});
92+
}
93+
94+
void TestTCPSocket()
95+
{
96+
Debug.Log("TestTCPSocket");
97+
// 创建TCPSocket
98+
WXTCPSocket tcp = WX.CreateTCPSocket();
99+
100+
// 注册回调
101+
tcp.OnConnect(res =>
102+
{
103+
Debug.Log("tcp 连接成功");
104+
//连接成功时发送数据
105+
tcp.Write("TCP Write Test");
106+
});
107+
tcp.OnError(res =>
108+
{
109+
Debug.Log("tcp 连接失败" + JsonMapper.ToJson(res));
110+
WX.ShowModal(new ShowModalOption()
111+
{
112+
content = res.errMsg
113+
});
114+
});
115+
// 注意OnMessage参数与文档不同
116+
tcp.OnMessage(res =>
117+
{
118+
Debug.Log("tcp 消息" + JsonMapper.ToJson(res));
119+
WX.ShowModal(new ShowModalOption()
120+
{
121+
content = Encoding.UTF8.GetString(res.message)
122+
});
123+
}, true);
124+
125+
// 在给定的套接字上启动连接,请按需更改地址与端口
126+
tcp.Connect(new TCPSocketConnectOption()
127+
{
128+
address = "www.example.com",
129+
port = 8848
130+
});
131+
}
132+
}
133+
134+
```
135+
136+
137+
138+
### WebSocket
139+
140+
#### 客户端
61141

62142
支持 Unity Websocket 的第三方插件比较多,可以从 Github 或 AssetStore 找到。这里以[UnityWebSocket](https://github.com/psygames/UnityWebSocket)为例。
63143

@@ -89,14 +169,81 @@ UnityWebSocket需要对WebSocket.jslib做两处修改([新版本](https://github
89169

90170
可参考[WebSocket Demo](https://github.com/wechat-miniprogram/minigame-unity-webgl-transform/tree/main/Demo/UnityWebSocket_WebGL)
91171

92-
### 服务端
172+
#### 服务端
93173

94174
如果服务端使用 TCP 接入,则需要使用 WSS<-->TCP 的代理层。解决方案也很多:
95175
- 使用 Ngnix、 [websockify-js](https://github.com/novnc/websockify-js)/[websockify](https://github.com/novnc/websockify)做反向代理(推荐)
96176
- 改造原有TCP服务兼容wss服务
97177

98178
***特别地,在处理WebSocket数据包时,请注意数据的“粘包”问题,需要游戏服务器自行处理。***
99179

180+
## UDP 网络通信
181+
182+
微信基础库支持UDPSocket类。
183+
184+
注意:出于应用场景考虑,TCPSocket.OnMessage表现与文档不一致。
185+
186+
```c#
187+
/// <summary>
188+
/// [UDPSocket.onMessage(function listener)](https://developers.weixin.qq.com/minigame/dev/api/network/udp/UDPSocket.onMessage.html)
189+
/// 监听收到消息的事件
190+
/// needInfo: 是否需要返回localInfo和remoteInfo,设置为 false 时这两个字段会返回null,设置为 true 会降低性能,请按需使用
191+
/// 多次使用OnMessage时needInfo以第一个OnMessage为准,OffMessage()移除所有回调后再次OnMessage可重新设置needInfo
192+
/// </summary>
193+
public void OnMessage(Action<UDPSocketOnMessageListenerResult> listener, bool needInfo = false)
194+
```
195+
196+
使用举例:
197+
198+
```c#
199+
using System.Text;
200+
using UnityEngine;
201+
using WeChatWASM;
202+
using LitJson;
203+
204+
public class UDPTest : MonoBehaviour
205+
{
206+
// Start is called before the first frame update
207+
void Start()
208+
{
209+
Debug.Log("Start");
210+
WX.InitSDK((int code) =>
211+
{
212+
Debug.Log("InitSDK code: " + code);
213+
TestUDPSocket();
214+
});
215+
}
216+
217+
void TestUDPSocket()
218+
{
219+
Debug.Log("TestUDPSocket");
220+
// 创建UDPSocket
221+
var udp = WX.CreateUDPSocket();
222+
// 注册回调
223+
udp.OnMessage(res =>
224+
{
225+
Debug.Log("udp 消息" + JsonMapper.ToJson(res));
226+
WX.ShowModal(new ShowModalOption()
227+
{
228+
content = Encoding.UTF8.GetString(res.message)
229+
});
230+
});
231+
// 绑定端口
232+
udp.Bind();
233+
// 向指定的 IP 和 port 发送消息,请按需更改地址和端口
234+
udp.Send(new UDPSocketSendOption()
235+
{
236+
address = "www.example.com",
237+
port = 8848,
238+
message = "UDP Send Test"
239+
});
240+
}
241+
}
242+
243+
```
244+
245+
246+
100247

101248
## 注意事项
102249
微信小游戏的网络需要提前在MP后台[配置安全域名](https://developers.weixin.qq.com/minigame/dev/guide/base-ability/network.html),以及使用带证书的HTTPS、WSS协议。

0 commit comments

Comments
 (0)