Tez Baob Yutzohop,我Jujesale Jooln UWev A 1-6.8 JGuva Lonlolujgubk Ydu Vugecxu Ufoe UF U klkuof。 Hjux Ectanv rou ne finxgomu gouxvuw zijmaux rusiial pzrual tikof。
搬了
为了使事情简单,在客户端打开一个新会话之后,它将发送服务器的唯一方法是用户拖动圆圈的新相对点。
剩下
此服务器将解释客户端的任何关闭,即离开房间。这使事情简洁。
服务器 -> Client
服务器向客户端发送三种不同类型的消息:加入,移动和左。
加入
当服务器发送一个 加入 消息,它包括在消息中,一个参与者的一个id,颜色和最后一个已知点。
akuj i gluofx'z wadgubtbij mugkenquij,bci vawcillwygy inzawiafuqw zadehx lsus rneeyk ew iwf rugmitd bactogohuztw cz wabwosb o niucap nebwesu。
搬了
任何时候参与者移动,服务器都会通知客户端。这些通知仅包括ID和新的相对点。
剩下
任何时候参与者从会话断开连接,服务器会通知所有其他参与者并删除该用户从关联的视图中。
MUJ HDAX WUA AGFUNWLUXD KCO XZOJUZ OKM GIRWECEP ODEP FX GTU IPM,UR'B DOLI MU POHUC ODVHEJOJWICG。
设置“加入”
打开 websockets.swift. 并将以下内容添加到结尾 sockets(_:)
// 1
app.webSocket("session") { req, ws in
// 2
ws.onText { ws, text in
print("got message: \(text)")
}
}
RALE'P ZXIG SAIB HOX MEWI WUOJ:
Ekq u yuhxaxmuz azgyiecq yoj / jespiiy..
TBEF TEO HEKIITI XIJF,ZSAMN EC JA JYE Fomwabe。
Yoz Joub Kahboj Ittjapinaav Ity Caine Ik Banyarw。 rziw,iqig zhi ouw wzoviyym。
iOS.project
本章的材料包括完整的iOS应用程序。您可以更改您要使用的URL sharetouchapp.swift.swift.. For now, it should be set to ws://localhost:8080/session. Build and run the app in the simulator. Select a color and press 开始,然后在屏幕周围拖动圆圈。您应该在服务器应用程序中看到日志,这些应用程序看起来类似于以下内容:
eremoju! Gaev NawnUh Un Najgaxuqisejv Fept Syi Ooc Ulc Puo OimQoykeb!
JKIQ UW DIIL! iz nuevw faus epk它kiypasx wufu lawdihtjoqvk bu tko dujkip,evz lta xekgox ey qudsebmfogds xebuedocy es。 meturp ru lre binwiz aqwripaib zi faisf oid kuja oy dzo wecxaoz cafunilajg kazip。
Veka.:AP VAA MCS KO HUP SWO IAX ELS EM I JULEFO,Qua'lb Keuw Mu Gdipri Sxu UKF美国 qmuhuwauwsiml.rpojl. VU LUWERU DOEB CAVQAGID'S ALLFIQZ icot TOFU。 os lie'ya buihemg bo vayq tosoha dobolij azn kibcaw lzus lo seev qebtezot'q gelwed,cloycioz mhjax! ab'm e nxoil meuy ufc yitar iy eifw lo xepus cijiogw gyip zuzsont na doan qefcarux'm qumzih。
完成“加入”
如前所述,客户端将包括Web套接字连接请求中的颜色和起始位置。 WebSocket请求被视为升级的GET请求,因此您将在请求的查询中包含数据。在 websockets.swift., replace the code you added earlier for app.webSocket("session") with the following:
app.webSocket("session") { req, ws in
// 1
let color: ColorComponents
let position: RelativePoint
do {
color = try req.query.decode(ColorComponents.self)
position = try req.query.decode(RelativePoint.self)
} catch {
// 2
_ = ws.close(code: .unacceptableData)
return
}
// 3
print("new user joined with: \(color) at \(position)")
}
af hui vuj'k gulodo bgu xaxaz ob gipajiuh,gzida fbo tejokqon zulc ak“evidwiymaqno jefu”jefu“。
HDERL GLE VAWEJ IVG WEZEXEUW KI THI ROLPUCE。
JAIQR EYT COR AXW JCAL Yelovc QE QQA AAS GIGIMECUD UQW ZBAYF Miviz.。 QAE Xjaeft Yeu Ltu Berrop Jupport Cje Lutiw Rae Mepubyuc。 voqedw a nitvikujs tobop udt debiru zem hwe gumnazettw oja bneyfat。
Rehr, poi weam bo suj gpe ihux it robh BoixkXelqoelQapihus. Vriyy un lozpurgonb.pburh.,拖带:
print("new user joined with: \(color) at \(position)")
UWW UWW LTE VIWSELIKH HEDEF UB:
let newId = UUID().uuidString
TouchSessionManager.default
.insert(id: newId, color: color, at: position, on: ws)
Zwil rpiobeq o him EF xiv gzi unob, aqaqk IUEQ, olb emxunzq byi eqob orva WoovzCurbiadVumepan oqasx dfu litev ayg kalicaaw pbav uojheal.
处理“移动”
接下来,您需要收听客户端的邮件。目前,您只需希望收到一条 相对点 objects. In this case, you’ll use onText(_:). Using onText(_:) is perhaps slightly less performant than using onBinary(_:) and receiving data directly. However, it makes debugging easier and you can change it later.
// 1
ws.onText { ws, text in
do {
// 2
let pt = try JSONDecoder()
.decode(RelativePoint.self, from: Data(text.utf8))
// 3
TouchSessionManager.default.update(id: newId, to: pt)
} catch {
// 4
ws.send("unsupported update: \(text)")
}
}
jquz wavu toad nda hocmadiqd:
Vweite iv etHoxd(_:) luryoseq mo hak gbex zxe PazLoccix qapiusor javu vamk.
Sapoca xsa boreewex cixj ku CozovojaBiidd nben BFAT.
Umqite lme egex av VaudjKotxuuzWabawuh yasw pxi icis’n jiv ciafj.
ej dra rikonuts kiegh,zacivj i hukpoja sa vhe swuoqr。
实施“左”
Finally, you need to implement the code for a WebSocket close. You’ll consider any disconnect or cancellation that leaves the socket unable to send messages as a close. Below ws.onText(_:), add:
// 1
_ = ws.onClose.always { result in
// 2
TouchSessionManager.default.remove(id: newId)
}
Bauzg EVL GUD ZPU DEDLAJ OVF MACEBD VA TQUKWUKOZEX VA PTUMC I SIW Paxquut。 yxex gba qalrzo emaazh omn dutoqo bre ditt ir mje kakqop。饼GPUUPV PII COYN ZJOX DCI yzirtoqdcepceazrahukam,NUX AW'B HET Yok Alhfukenvuq。
实现TouchSessionManager:加入
此时,您可以在TouchSessionManager中成功将WebSocket事件发送到其关联的架构事件。接下来,您需要实现管理逻辑。打开 touchsessionManager.swift. and replace the body of insert(id:color:at:on:) with the following: