рдЪрд┐рддреНрд░ rawpixel.com рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛рдЗрд╕ рдкреНрд░рдХрд╛рд╢рди рдореЗрдВ, рд╣рдо рдЯреАрд╕реАрдкреА рдкрд░рдд рдкрд░ рдЬрд╛рдПрдВрдЧреЗ, рдЪреИрдЯ рдПрдкреНрд▓реАрдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрд░ рдлрд╛рдЙрдВрдбреЗрд╢рди рдХреЗ рд╕реЙрдХреЗрдЯреНрд╕ рдФрд░ рдЯреВрд▓реНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдиреЗрдВред
рдЕрдиреБрдорд╛рдирд┐рдд рдкрдврд╝рдиреЗ рдХрд╛ рд╕рдордп: 25 рдорд┐рдирдЯред
рд╕реЙрдХреЗрдЯ рдХреНрдпреЛрдВ?
рдЖрдк рд╕реЛрдЪ рд░рд╣реЗ рд╣реЛрдВрдЧреЗ: "рдореБрдЭреЗ
URLSession рд╕реЗ рдПрдХ рд╕реНрддрд░ рдХрдо рдХреНрдпреЛрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?" рдпрджрд┐ рдЖрдк рдХрд╛рдлреА рдЪрддреБрд░ рд╣реИрдВ рдФрд░ рдпрд╣ рд╕рд╡рд╛рд▓ рдирд╣реАрдВ рдкреВрдЫрддреЗ рд╣реИрдВ, рддреЛ рд╕реАрдзреЗ рдЕрдЧрд▓реЗ рдЕрдиреБрднрд╛рдЧ рдкрд░ рдЬрд╛рдПрдВред
рдЗрддрдирд╛ рд╕реНрдорд╛рд░реНрдЯ рдирд╣реАрдВ рд╣реЛрдиреЗ рдХрд╛ рдЬрд╡рд╛рдмрдмрдбрд╝рд╛ рдЕрдЪреНрдЫрд╛ рд╕рд╡рд╛рд▓! рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ URLSession рдХрд╛ рдЙрдкрдпреЛрдЧ
HTTP рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдЕрд░реНрдерд╛рддреН, рд╕рдВрдЪрд╛рд░
рдЕрдиреБрд░реЛрдз-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рд╢реИрд▓реА рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓рдЧрднрдЧ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
- JSON рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╕рд░реНрд╡рд░ рд╕реЗ рдХреБрдЫ рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз
- рдпрд╣ рдбреЗрдЯрд╛, рдкреНрд░рдХреНрд░рд┐рдпрд╛, рдкреНрд░рджрд░реНрд╢рди рдЖрджрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред
рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдореЗрдВ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░ рдбреЗрдЯрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдпрдВ рдХреА рдкрд╣рд▓ рдкрд░ рдПрдХ рд╕рд░реНрд╡рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдпрд╣рд╛рдБ HTTP рдХрд╛рдо рд╕реЗ рдмрд╛рд╣рд░ рд╣реИред
рдмреЗрд╢рдХ, рд╣рдо рд╕рд░реНрд╡рд░ рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рдЦреАрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд╣реИ (рдЙрд░реНрдл
рдкреЛрд▓рд┐рдВрдЧ )ред рдпрд╛ рд╣рдо рдЕрдзрд┐рдХ рдкрд░рд┐рд╖реНрдХреГрдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░
рд▓рдВрдмреЗ рдорддрджрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░
рд╕рдХрддреЗ рд╣реИрдВ ред рд▓реЗрдХрд┐рди рдЗрди рд╕рднреА рдмреИрд╕рд╛рдЦреА рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрдиреБрдЪрд┐рдд рд╣реИрдВред
рдЖрдЦрд┐рд░рдХрд╛рд░, рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдЕрдиреБрд░реЛрдз-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рддрд┐рдорд╛рди рддрдХ рд╕реАрдорд┐рдд рдХреНрдпреЛрдВ рдХрд░реЗрдВ рдпрджрд┐ рдпрд╣ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдп рдХреЛ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╕реЗ рдХрдо рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ?
рдЗрд╕ рдЧрд╛рдЗрдб рдореЗрдВ, рдЖрдк рд╕реАрдЦреЗрдВрдЧреЗ рдХрд┐ рдПрдмреНрд╕рдЯреНрд░реИрдХреНрд╢рди рдХреЗ рдирд┐рдЪрд▓реЗ рд╕реНрддрд░ рдкрд░ рдХреИрд╕реЗ рдЬрд╛рдПрдВ рдФрд░ рдЪреИрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╕реАрдзреЗ
рд╕реЙрдХреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рдирдП рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдорд╛рд░рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЙрди рдзрд╛рд░рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ рдЬреЛ рдЪреИрдЯ рд╕рддреНрд░ рдХреЗ рджреМрд░рд╛рди рдЦреБрд▓реА рд░рд╣рддреА рд╣реИрдВред
рд╢реБрд░реБрдЖрдд рд╣реЛ рд░рд╣реА рд╣реИ
рд╕реНрд░реЛрдд рд╕рд╛рдордЧреНрд░реА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред рдПрдХ рдореЙрдХ рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░
рдЧреЛ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕рд░реНрд╡рд░ рд╣реИред
рдЖрдкрдХреЛ рдЧреЛ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рд╕рд░реНрд╡рд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рддрд╛рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЗрд╕рд╕реЗ рдЬреБрдбрд╝ рд╕рдХреЗрдВред
рд╕рд░реНрд╡рд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ
рд╕реНрд░реЛрдд рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдФрд░ рд╕реНрд░реЛрдд рджреЛрдиреЛрдВ рд╣реИрдВред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕реНрд╡рд╕реНрде рд╡реНрдпрд╛рдореЛрд╣ рд╣реИ рдФрд░ рдХрд┐рд╕реА рдФрд░ рдХреЗ рд╕рдВрдХрд▓рд┐рдд рдХреЛрдб рдкрд░ рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк рд╕реНрд╡рдпрдВ рд╕реНрд░реЛрдд рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрджрд┐ рдЖрдк рдмрд╣рд╛рджреБрд░ рд╣реИрдВ, рддреЛ
рдЯрд░реНрдорд┐рдирд▓ рдЦреЛрд▓реЗрдВ, рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдЬрд╛рдПрдВ рдФрд░ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдВ:
sudo ./server
рд╕рдВрдХреЗрдд рджрд┐рдП рдЬрд╛рдиреЗ рдкрд░, рдЕрдкрдирд╛ рдкрд╛рд╕рд╡рд░реНрдб рджрд░реНрдЬ рдХрд░реЗрдВред рдЙрд╕рдХреЗ рдмрд╛рдж рдЖрдкрдХреЛ рдПрдХ рд╕рдВрджреЗрд╢ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП
127.0.0.1:80 рдкрд░ рд╕реБрди рд░рд╣реЗ рд╣реИрдВредрдиреЛрдЯ: рд╕рд░реНрд╡рд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдореЛрдб ("sudo" рдХрдорд╛рдВрдб) рдореЗрдВ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреЛрд░реНрдЯ 80 рдкрд░ рд╕реБрдирддрд╛ рд╣реИред 1024 рд╕реЗ рдХрдо рд╕рдВрдЦреНрдпрд╛ рд╡рд╛рд▓реЗ рд╕рднреА рдкреЛрд░реНрдЯреНрд╕ рдХреЛ рд╡рд┐рд╢реЗрд╖ рдкрд╣реБрдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдЖрдкрдХрд╛ рдЪреИрдЯ рд╕рд░реНрд╡рд░ рддреИрдпрд╛рд░ рд╣реИ! рдЖрдк рдЕрдЧрд▓реЗ рднрд╛рдЧ рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдпрджрд┐ рдЖрдк рд╕рд░реНрд╡рд░ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рд╕реНрд╡рдпрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ,рдлрд┐рд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдкрдХреЛ
рд╣реЛрдордмреНрд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ
рдЧреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ Homebrew рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЯрд░реНрдорд┐рдирд▓ рдЦреЛрд▓реЗрдВ рдФрд░ рд╡рд╣рд╛рдВ рдирд┐рдореНрди рдкрдВрдХреНрддрд┐ рдЪрд┐рдкрдХрд╛рдПрдБ:
/usr/bin/ruby -e \
"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
рдлрд┐рд░ Go рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
brew install go
рдЕрдВрдд рдореЗрдВ, рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рд╕реНрд░реЛрдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдЬрд╛рдПрдВ рдФрд░ рд╕рд░реНрд╡рд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ:
go build server.go
рдЕрдВрдд рдореЗрдВ, рдЖрдк
рдЗрд╕ рдЦрдВрдб рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рдо рдЧреНрд░рд╛рд╣рдХ рдореЗрдВ рдЬреЛ рдХреБрдЫ рднреА рд╣реИ рдЙрд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ
рдЕрдм
DogeChat рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЦреЛрд▓реЗрдВ, рдЗрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, DogeChat рдЕрдм рдЖрдкрдХреЛ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рджрд░реНрдЬ рдХрд░рдиреЗ рдФрд░ рд╕реНрд╡рдпрдВ рдЪреИрдЯ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЬрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдпрд╣ рдкрддрд╛ рдирд╣реАрдВ рдерд╛ рдХрд┐ рдЪреИрдЯ рдХреИрд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИред рддреЛ рд╣рдо рд╕рдм рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рдпреВрдЖрдИ рдФрд░ рдиреЗрд╡рд┐рдЧреЗрд╢рди рд╣реИред рд╣рдо рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рд▓реЗрдпрд░ рд▓рд┐рдЦреЗрдВрдЧреЗред рд╣реБрд░реНрд░реЗ!
рдПрдХ рдЪреИрдЯ рд░реВрдо рдмрдирд╛рдПрдВ
рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рд╕реАрдзреЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП,
ChatRoomViewController.swift рдкрд░
рдЬрд╛рдПрдВ ред рдпрд╣ рдПрдХ рджреГрд╢реНрдп рдирд┐рдпрдВрддреНрд░рдХ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рджрд░реНрдЬ рдХрд┐рдП рдЧрдП рдкрд╛рда рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдкреНрд░рд╛рдкреНрдд рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдПрдХ рдЯреЗрдмрд▓рд╡реНрдпреВ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдЪреВрдБрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ
ChatRoomViewController рд╣реИ , рдпрд╣ рдПрдХ
ChatRoom рд╡рд░реНрдЧ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдЬреЛ рд╕рднреА рдореЛрдЯреЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
рдЖрдЗрдП рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдирдпрд╛ рд╡рд░реНрдЧ рдХреНрдпрд╛ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛:
- рд╕рд░реНрд╡рд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдиреЗрдХреНрд╢рди рдЦреЛрд▓рдирд╛;
- рдХрд┐рд╕реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЪреИрдЯ рдХреЗ рд▓рд┐рдП рдЙрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╛рдо рд╕реЗ рдЬреЛрдбрд╝рдирд╛;
- рд╕рдВрджреЗрд╢ рднреЗрдЬрдирд╛ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛;
- рдЕрдВрдд рдореЗрдВ рдХрдиреЗрдХреНрд╢рди рдмрдВрдж рдХрд░рдирд╛ред
рдЕрдм рдЬрдм рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЗрд╕ рд╡рд░реНрдЧ рд╕реЗ рдХреНрдпрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ,
рдХрдорд╛рдВрдб-рдПрди рджрдмрд╛рдПрдВ,
рд╕реНрд╡рд┐рдлреНрдЯ рдлрд╛рдЗрд▓ рдЪреБрдиреЗрдВ рдФрд░ рдЗрд╕реЗ
рдЪреИрдЯрд░реВрдо рдХрд╣реЗрдВ ред
I / O рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рдирд╛
рдЗрд╕рдХреЗ рд╕рд╛рде
ChatRoom.swift рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ
рдмрджрд▓реЗрдВ :
import UIKit class ChatRoom: NSObject {
рдпрд╣рд╛рдБ рд╣рдо
ChatRoom рд╡рд░реНрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрди рдЧреБрдгреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
- рдкрд╣рд▓реЗ рд╣рдо рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рдЬреЛрдбрд╝реА рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд╣рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ рдЪреИрдЯ рд╕рд░реНрд╡рд░ рдХреЗ рдмреАрдЪ рд╕реЙрдХреЗрдЯ рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓реЗрдЧреАред рдмреЗрд╢рдХ, рд╣рдо рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрджреЗрд╢ рднреЗрдЬреЗрдВрдЧреЗ, рдФрд░ рдЗрдирдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред
- рдЕрдЧрд▓рд╛, рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
- рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣рдо рд╡реИрд░рд┐рдПрдмрд▓ рдореИрдХреНрд╕рд░реЗрд▓рдбреНрд░реАрдорд┐рдЯреА рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐рд╕реА рдПрдХ рд╕рдВрджреЗрд╢ рдХреА рдЕрдзрд┐рдХрддрдо рд▓рдВрдмрд╛рдИ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИред
рдЕрдм
ChatRoomViewController.swift рдлрд╛рдЗрд▓ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдЗрд╕ рд▓рд╛рдЗрди рдХреЛ рдЗрд╕рдХреЗ рдЧреБрдгреЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
let chatRoom = ChatRoom()
рдЕрдм рдЬрдм рд╣рдордиреЗ рдХрдХреНрд╖рд╛ рдХреА рдореВрд▓ рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдИ рд╣реИ, рддреЛ рдпрд╣ рдпреЛрдЬрдирд╛рдмрджреНрдз рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдкрд╣рд▓рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ: рдЖрд╡реЗрджрди рдФрд░ рд╕рд░реНрд╡рд░ рдХреЗ рдмреАрдЪ рдХрдиреЗрдХреНрд╢рди рдЦреЛрд▓рдирд╛ред
рдХрдиреЗрдХреНрд╢рди рдЦреЛрд▓реЗрдВ
рд╣рдо ChatRoom.swift рдкрд░ рд▓реМрдЯрддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрдкрддреНрддрд┐ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
func setupNetworkCommunication() {
рд╣рдо рдпрд╣рд╛рдБ рдХреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВ:
- рдкрд╣рд▓реЗ рд╣рдо рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдореЗрдореЛрд░реА рдкреНрд░рдмрдВрдзрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рд╕реЙрдХреЗрдЯ рдзрд╛рд░рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рджреЛ рдЪрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ
- рдлрд┐рд░, рд╣рдо рдЗрди рд╕рдорд╛рди рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╕реАрдзреЗ рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рд╣реЛрд╕реНрдЯ рдФрд░ рдкреЛрд░реНрдЯ рдирдВрдмрд░ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рд╣реИрдВред
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЪрд╛рд░ рддрд░реНрдХ рд╣реИрдВред рдкрд╣рд▓рд╛ рдореЗрдореЛрд░реА рдПрд▓реЛрдХреЗрдЯрд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рдереНрд░реЗрдбреНрд╕ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╕рдордп рдХрд░реЗрдВрдЧреЗред рдЖрдкрдХреЛ
kCFAllocatorDefault рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрджрд┐ рдЖрдк рдереНрд░реЗрдбреНрд╕ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЕрдиреНрдп рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред
рдЕрдиреБрд╡рд╛рджрдХ рдХрд╛ рдиреЛрдЯCFStreamCreatePairWithSocketToHost рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╣рддрд╛ рд╣реИ: NULL рдпрд╛ kCFAllocatorDefault рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдФрд░ kCFAllocatorDefault рдХрд╛ рд╡рд░реНрдгрди рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ NULL рдХрд╛ рдкрд░реНрдпрд╛рдп рд╣реИ ред рд╕рд░реНрдХрд▓ рдмрдВрдж рд╣реЛ рдЧрдпрд╛ рд╣реИ!
рдлрд┐рд░ рд╣рдордиреЗ рд╣реЛрд╕реНрдЯ рдирд╛рдо рд╕реЗрдЯ рдХрд┐рдпрд╛ред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рд╕реНрдерд╛рдиреАрдп рд╕рд░реНрд╡рд░ рд╕реЗ рдЬреБрдбрд╝ рд░рд╣реЗ рд╣реИрдВред рдпрджрд┐ рдЖрдкрдХрд╛ рд╕рд░реНрд╡рд░ рджреВрд╕рд░реА рдЬрдЧрд╣ рд╕реНрдерд┐рдд рд╣реИ, рддреЛ рдЖрдк рдЙрд╕рдХрд╛ рдЖрдИрдкреА рдкрддрд╛ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдлрд┐рд░ рд╕рд░реНрд╡рд░ рдЬрд┐рд╕ рдкреЛрд░реНрдЯ рдирдВрдмрд░ рдкрд░ рд╕реБрди рд░рд╣рд╛ рд╣реИред
рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЕрдкрдиреЗ I / O рд╕реНрдЯреНрд░реАрдо рдХреЛ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдлрдВрдХреНрд╢рди рдЙрдиреНрд╣реЗрдВ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░ рд╕рдХреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЙрди рд╕реНрдЯреНрд░реАрдо рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХреЗ рдЬреЛ рдЗрд╕реЗ рдмрдирд╛рддрд╛ рд╣реИред
рдЕрдм рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреНрд░рд╡рд╛рд╣ рд╣реИ, рд╣рдо рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ
setupNetworkCommunication () рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:
inputStream = readStream!.takeRetainedValue() outputStream = writeStream!.takeRetainedValue()
рдПрдХ рдЕрдкреНрд░рдмрдВрдзрд┐рдд рд╡рд╕реНрддреБ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ
takeRetainedValue () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣рдореЗрдВ рдПрдХ рд╕рдВрджрд░реНрдн рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░, рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рднрд╡рд┐рд╖реНрдп рдХреА рдореЗрдореЛрд░реА рд▓реАрдХ рд╕реЗ рдмрдЪреЗрдВред рдЕрдм рд╣рдо рдЬрд╣рд╛рдВ рдЪрд╛рд╣реЗрдВ рд╡рд╣рд╛рдВ рдЕрдкрдиреЗ рдзрд╛рдЧреЛрдВ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдм рд╣рдореЗрдВ рдЗрди рдереНрд░реЗрдбреНрд╕ рдХреЛ
рд░рди рд▓реВрдк рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рд╣рдорд╛рд░рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдиреЗрдЯрд╡рд░реНрдХ рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд╕рдХреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
setupNetworkCommunication () рдХреЗ рдЕрдВрдд рдореЗрдВ рдЗрди рджреЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВ:
inputStream.schedule(in: .current, forMode: .common) outputStream.schedule(in: .current, forMode: .common)
рдЕрдВрдд рдореЗрдВ рдпрд╣ рдкрд╛рд▓ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ! рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ
setupNetworkCommunication () рд╡рд┐рдзрд┐ рдХреЗ рдмрд╣реБрдд рдЕрдВрдд рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
inputStream.open() outputStream.open()
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣рдорд╛рд░реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдмреАрдЪ рдПрдХ рдЦреБрд▓рд╛ рд╕рдВрдмрдВрдз рд╣реИред
рд╣рдо рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдФрд░ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЕрднреА рддрдХ рдХреЛрдИ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рджрд┐рдЦреЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЕрдкрдиреЗ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд░реНрд╡рд░ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдЪреИрдЯ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ
рдЕрдм рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдерд╛рдкрд┐рдд рдХрдиреЗрдХреНрд╢рди рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ! рдЪреИрдЯ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдЕрдкрдирд╛ рдкрд░рд┐рдЪрдп рджреЗрдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдлрд┐рд░ рдЖрдк рд╡рд╛рд░реНрддрд╛рдХрд╛рд░реЛрдВ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣ рд╣рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ: рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрджреЗрд╢ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рдЙрдирдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЪреИрдЯ рдкреНрд░реЛрдЯреЛрдХреЙрд▓
рдЯреАрд╕реАрдкреА рдкрд░рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рд╕рдВрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ "рдкреНрд░реЛрдЯреЛрдХреЙрд▓" рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдЧрд░ рд╣рдордиреЗ HTTP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдЗрди рд╡рд┐рднрд┐рдиреНрди рд╢рдмреНрджреЛрдВ
GET ,
PUT ,
PATCH рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╣рдореЗрдВ URL рдмрдирд╛рдиреЗ рдФрд░ рд╕рд╣реА рд╣реЗрдбрд░ рдФрд░ рд╕рднреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрджреЗрд╢ рд╣реИрдВред рд╣рдо рднреЗрдЬ рджреЗрдВрдЧреЗ
iam:Luke
рдЪреИрдЯ рджрд░реНрдЬ рдХрд░рдиреЗ рдФрд░ рдЕрдкрдирд╛ рдкрд░рд┐рдЪрдп рджреЗрдиреЗ рдХреЗ рд▓рд┐рдПред
рдФрд░ рд╣рдо рднреЗрдЬ рджреЗрдВрдЧреЗ
msg:Hey, how goes it, man?
рд╕рднреА рдЙрддреНрддрд░рджрд╛рддрд╛рдУрдВ рдХреЛ рдЪреИрдЯ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдПред
рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд┐рд▓реНрдХреБрд▓ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВред
рдЕрдм рд╣рдореЗрдВ рдкрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░рд╛ рд╕рд░реНрд╡рд░ рдХреНрдпрд╛ рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рдо
рдЪреИрдЯрд░реВрдо рдХреНрд▓рд╛рд╕ рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЪреИрдЯ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдПрдХрдорд╛рддреНрд░ рддрд░реНрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдЙрдкрдирд╛рдо рд╣реИред
рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ
ChatRoom.swift рдХреЗ рдЕрдВрджрд░
рдЬреЛрдбрд╝реЗрдВ :
func joinChat(username: String) {
- рдкрд╣рд▓реЗ рд╣рдо рдЕрдкрдиреЗ "рдкреНрд░реЛрдЯреЛрдХреЙрд▓" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдирд╛ рд╕рдВрджреЗрд╢ рдмрдирд╛рддреЗ рд╣реИрдВ
- рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдирд╛рдо рд╕рд╣реЗрдЬреЗрдВред
- withUnsafeBytes (_ :) рдПрдХ рдХреНрд▓реЛрдЬрд░ рдХреЗ рдЕрдВрджрд░ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
- рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЕрдкрдирд╛ рд╕рдВрджреЗрд╢ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рднреЗрдЬрддреЗ рд╣реИрдВред рдпрд╣ рдЖрдкрдХреА рдЕрдкреЗрдХреНрд╖рд╛ рд╕реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд▓рд┐рдЦреЗрдВ (_: maxLength :) рдкрд┐рдЫрд▓реЗ рдЪрд░рдг рдореЗрдВ рдмрдирд╛рдП рдЧрдП рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдкреЙрдЗрдВрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдЕрдм рд╣рдорд╛рд░реА рд╡рд┐рдзрд┐ рддреИрдпрд╛рд░ рд╣реИ,
ChatRoomViewController.swift рдЦреЛрд▓реЗрдВ рдФрд░
viewWillAppear (_ :) рдХреЗ рдЕрдВрдд рдореЗрдВ рдЗрд╕ рд╡рд┐рдзрд┐ рдореЗрдВ рдПрдХ рдХреЙрд▓ рдЬреЛрдбрд╝реЗрдВред
chatRoom.joinChat(username: username)
рдЕрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЪрд▓рд╛рдПрдВред рдЕрдкрдирд╛ рдЙрдкрдирд╛рдо рджрд░реНрдЬ рдХрд░реЗрдВ рдФрд░ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕реА рдкрд░ рдЯреИрдк рдХрд░реЗрдВ ...

...
рдХрд┐ рдлрд┐рд░ рд╕реЗ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИ!рд░реБрдХреЛ, рдпрд╣ рд╕рдм рдареАрдХ рд╣реИ! рдЯрд░реНрдорд┐рдирд▓ рд╡рд┐рдВрдбреЛ рдкрд░ рдЬрд╛рдПрдВред рд╡рд╣рд╛рдБ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╕рдВрджреЗрд╢
рд╡рд╛рд╕реНрдпрд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛ рдЧрдпрд╛ рд╣реИ рдпрд╛ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдкрдХрд╛ рдирд╛рдо рд╡рд╛рд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред
рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдкрдиреЗ рдлреЛрди рдХреА рд╕реНрдХреНрд░реАрди рдкрд░ рдПрдХ рд╕рдлрд▓ рдХрдиреЗрдХреНрд╢рди рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред
рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рдЬрд╡рд╛рдм
рд╕рд░реНрд╡рд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЗ рд╕рд╛рде рдЪреИрдЯ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╕рднреА рд▓реЛрдЧреЛрдВ рдХреЛ рднреЗрдЬрддрд╛ рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА
ChatRoomViewController рдХреА рд╕рдВрджреЗрд╢ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рд╕реА рднреА рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рд╣реИред
рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдЗрди рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ "рдкрдХрдбрд╝рдиреЗ" рдХреЗ рд▓рд┐рдП
рдЗрдирдкреБрдЯрд╕реНрдЯреНрд░реАрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ
рд╕рдВрджреЗрд╢ рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдВред
рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ
StreamDelegate рдкреНрд░реЛрдЯреЛрдХреЙрд▓
рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
ChatRoom рдХреА
рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ
ChatRoom.swift рдлрд╝рд╛рдЗрд▓ рдХреЗ рдиреАрдЪреЗ рдЬреЛрдбрд╝реЗрдВ:
extension ChatRoom: StreamDelegate { }
рдЕрдм рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ рдХрд┐ рдХреМрди рдЗрдирдкреБрдЯрд╕реНрдЯреНрд░реАрдо рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдмрди рдЬрд╛рдПрдЧрд╛ред
рд╢реЗрдбреНрдпреВрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ setupNetworkCommunication () рд╡рд┐рдзрд┐ рдореЗрдВ рдЗрд╕ рд▓рд╛рдЗрди рдХреЛ рдЬреЛрдбрд╝реЗрдВ: (forMode :):
inputStream.delegate = self
рдЕрдм рдзрд╛рд░рд╛ рдЬреЛрдбрд╝реЗрдВ (_: рд╕рдВрднрд╛рд▓ :) рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:
func stream(_ aStream: Stream, handle eventCode: Stream.Event) { switch eventCode { case .hasBytesAvailable: print("new message received") case .endEncountered: print("The end of the stream has been reached.") case .errorOccurred: print("error occurred") case .hasSpaceAvailable: print("has space available") default: print("some other event...") } }
рд╣рдо рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ
рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред рд╡рд╣ рдШрдЯрдирд╛ рдЬреЛ рд╣рдореЗрдВ
рд░реБрдЪрддреА рд╣реИ
.hasBytesAvailable , рдЬреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЖрдиреЗ рд╡рд╛рд▓рд╛ рд╕рдВрджреЗрд╢ рдЖ рдЧрдпрд╛ рд╣реИред
рд╣рдо рдПрдХ рд╡рд┐рдзрд┐ рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рдЗрди рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреА рд╣реИред рдирдИ рдЧрдпреА рд╡рд┐рдзрд┐ рдХреЗ рдиреАрдЪреЗ, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
private func readAvailableBytes(stream: InputStream) {
- рд╣рдо рдмрдлрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЖрдиреЗ рд╡рд╛рд▓реЗ рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдкрдврд╝реЗрдВрдЧреЗред
- рд╣рдо рдПрдХ рд▓реВрдк рдореЗрдВ рдШреВрдорддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдЗрдирдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдХреБрдЫ рдкрдврд╝рдирд╛ рд╣реИред
- рд╣рдо рд░реАрдб (_: maxLength :) рдХрд╣рддреЗ рд╣реИрдВ, рдЬреЛ рд╕реНрдЯреНрд░реАрдо рд╕реЗ рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдмрдлрд░ рдореЗрдВ рдбрд╛рд▓рддрд╛ рд╣реИред
- рдпрджрд┐ рдХреЙрд▓ рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдПрдХ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ рдФрд░ рд▓реВрдк рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╣реИрдВред
рд╣рдореЗрдВ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреИрд╕реЗ рд╣реА рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрдиреЗ рд╡рд╛рд▓реА рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдбреЗрдЯрд╛ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдо
рд╕реНрдЯреНрд░реАрдо рдХреЗ рдЕрдВрджрд░
рд╕реНрд╡рд┐рдЪ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдкрд░ рдЬрд╛рдПрдВ (_: рд╣реИрдВрдбрд▓ :) рд╡рд┐рдзрд┐,
.hasBytesAvailable рд╕реНрд╡рд┐рдЪ
рдвреВрдВрдвреЗрдВ рдФрд░ рдкреНрд░рд┐рдВрдЯ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ:
readAvailableBytes(stream: aStream as! InputStream)
рдЗрд╕ рд╕реНрдерд╛рди рдкрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░рд╛рдкреНрдд рдЖрдВрдХрдбрд╝реЛрдВ рдХрд╛ рдПрдХ рддреИрдпрд╛рд░ рдмрдлрд░ рд╣реИ!
рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЕрднреА рднреА рдЗрд╕ рдмрдлрд░ рдХреЛ рд╕рдВрджреЗрд╢ рддрд╛рд▓рд┐рдХрд╛ рдХреА рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред
рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ
readAvailableBytes (рд╕реНрдЯреНрд░реАрдо :) рдкрд░
рд░рдЦреЗрдВ ред
private func processedMessageString(buffer: UnsafeMutablePointer<UInt8>, length: Int) -> Message? {
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдмрдлрд░ рдФрд░ рдЖрдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдЖрд░рдВрднреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдо рдЗрд╕ рд╡рд┐рдзрд┐ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВред
рдкрд╛рда UTF-8 рдореЗрдВ рд╣реЛрдЧрд╛, рдЕрдВрдд рдореЗрдВ рд╣рдо рдмрдлрд░ рдХреЛ рдореБрдХреНрдд рдХрд░реЗрдВрдЧреЗ, рдФрд░ рд╕рдВрджреЗрд╢ рдХреЛ ':' рдХреЛ рдкреНрд░реЗрд╖рдХ рдХреЗ рдирд╛рдо рдФрд░ рд╕рдВрджреЗрд╢ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВрдЧреЗред
рдЕрдм рд╣рдо рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╕рдВрджреЗрд╢ рджреВрд╕рд░реЗ рдкреНрд░рддрд┐рднрд╛рдЧреА рд╕реЗ рдЖрдпрд╛ рд╣реИред рдЙрддреНрдкрд╛рдж рдкрд░, рдЖрдк рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдЯреЛрдХрди рдЬреИрд╕рд╛ рдХреБрдЫ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдбреЗрдореЛ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
рдЕрдВрдд рдореЗрдВ, рдЗрд╕ рд╕рднреА рдЕрд░реНрдерд╡реНрдпрд╡рд╕реНрдерд╛ рдореЗрдВ, рд╣рдо рд╕рдВрджреЗрд╢ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
рд░реАрдб-рдЕрд╡реЗрд▓реЗрдмрд▓ рдмрд┐рдЯреНрд╕ (рд╕реНрдЯреНрд░реАрдо :) рд╡рд┐рдзрд┐ рдореЗрдВ рдЕрдВрддрд┐рдо
рд▓реВрдк рдХреЗ рдЕрдВрдд рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд
рдЗрдл-рд▓реЗрдЯ рдХреЛ рдЕрдВрддрд┐рдо рдЯрд┐рдкреНрдкрдгреА рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдЬреЛрдбрд╝реЗрдВ:
if let message = processedMessageString(buffer: buffer, length: numberOfBytesRead) {
рдЕрдм рд╕рдм рдХреБрдЫ рдХрд┐рд╕реА рдХреЛ
рд╕рдВрджреЗрд╢ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ ... рд▓реЗрдХрд┐рди рдХрд┐рд╕рд╕реЗ?
ChatRoomDelegate рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдмрдирд╛рдПрдБ
рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ
ChatRoomViewController.swift рдХреЛ рдирдП рд╕рдВрджреЗрд╢ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рдирд╣реАрдВ рд╣реИред рдЪреВрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдПрдХ рдордЬрдмреВрдд
рдЪреИрдЯрд░реВрдо рд▓рд┐рдВрдХ рд╢рд╛рдорд┐рд▓ рд╣реИ, рд╣рдо рдПрдХ рдордЬрдмреВрдд рд▓рд┐рдВрдХ рдЪрдХреНрд░ рдХреЗ рдЬрд╛рд▓ рдореЗрдВ рдЧрд┐рд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣ рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдЬрдЧрд╣ рд╣реИред ChatRoom рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдирдП рдкрджреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред
ChatRoom.swift рдХреЗ рд╢реАрд░реНрд╖ рдкрд░
, рдПрдХ рдирдИ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкрд░рд┐рднрд╛рд╖рд╛ рдЬреЛрдбрд╝реЗрдВ:
protocol ChatRoomDelegate: class { func received(message: Message) }
рдЕрдм
ChatRoom рд╡рд░реНрдЧ рдХреЗ рдЕрдВрджрд░
, рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдордЬреЛрд░ рд▓рд┐рдВрдХ рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдмрди рдЬрд╛рдПрдЧрд╛:
weak var delegate: ChatRoomDelegate?
рдЪрд▓рд┐рдП рдЕрдм
readAvailableBytes (рд╕реНрдЯреНрд░реАрдо :) рдореЗрдердб рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЕрдЧрд░-рд▓реЗрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдирд┐рдореНрди рд▓рд╛рдЗрди рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рд╡рд┐рдзрд┐ рдореЗрдВ рдЕрдВрддрд┐рдо рдЯрд┐рдкреНрдкрдгреА рдХреЗ рддрд╣рдд:
delegate?.received(message: message)
ChatRoomViewController.swift рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ рдФрд░ рдирд┐рдореНрди рд╡рд░реНрдЧ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЬреЛрдбрд╝реЗрдВ, рдЬреЛ
ChatRoomDelegate рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЕрдиреБрдкрд╛рд▓рди рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ, MessageInputDelegate рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж:
extension ChatRoomViewController: ChatRoomDelegate { func received(message: Message) { insertNewMessageCell(message) } }
рдореВрд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП
рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░реЗрдВрдореЗрдиреЗрд╕реЗрдЬрд╕реЗрд▓ (_ :) рдЖрдкрдХреЗ рд╕рдВрджреЗрд╢ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдЧрд╛ рдФрд░ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕рд╣реА рд╕реЗрд▓ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред
рдЕрдм
viewWillAppear (_ :) рдХреЛ super.viewWillearear () рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдЗрд╕реЗ рдЬреЛрдбрд╝рдХрд░ рдПрдХ рджреГрд╢реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рджреГрд╢реНрдп рдирд┐рдпрдВрддреНрд░рдХ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ
chatRoom.delegate = self
рдЕрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЪрд▓рд╛рдПрдВред рдПрдХ рдирд╛рдо рджрд░реНрдЬ рдХрд░реЗрдВ рдФрд░ рд╡рд╛рдкрд╕реА рдкрд░ рдЯреИрдк рдХрд░реЗрдВред

рдЖрдк рдЪреИрдЯ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдХрдиреЗрдХреНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╕реЗрд▓ рджреЗрдЦреЗрдВрдЧреЗред рд╣реБрд░реНрд░реЗ, рдЖрдкрдиреЗ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╕рд░реНрд╡рд░ рдХреЛ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрд╛ рдФрд░ рдЗрд╕реЗ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдорд┐рд▓реА!
рд╕рдВрджреЗрд╢ рдкреЛрд╕реНрдЯ рдХрд░ рд░рд╣рд╛ рд╣реИ
рдЕрдм рдЬрдм ChatRoom рд╕рдВрджреЗрд╢ рднреЗрдЬ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЕрдкрдиреЗ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рднреЗрдЬрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИред
ChatRoom.swift рдореЗрдВ, рдХрдХреНрд╖рд╛ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдВрдд рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ:
func send(message: String) { let data = "msg:\(message)".data(using: .utf8)! _ = data.withUnsafeBytes { guard let pointer = $0.baseAddress?.assumingMemoryBound(to: UInt8.self) else { print("Error joining chat") return } outputStream.write(pointer, maxLength: data.count) } }
рдпрд╣ рд╡рд┐рдзрд┐
joinChat (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо :) рдХреЗ рд╕рдорд╛рди рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд▓рд┐рдЦрд╛ рдерд╛, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЗрд╕рдореЗрдВ рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рд╕рд╛рдордиреЗ
msg рдЙрдкрд╕рд░реНрдЧ рд╣реИ (рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЪреИрдЯ рд╕рдВрджреЗрд╢ рд╣реИ)ред
рдЪреВрдБрдХрд┐ рд╣рдо
Send рдмрдЯрди рджреНрд╡рд╛рд░рд╛ рд╕рдВрджреЗрд╢ рднреЗрдЬрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╣рдо
ChatRoomViewController.swift рдкрд░
рд▓реМрдЯрддреЗ рд╣реИрдВ рдФрд░ рд╡рд╣рд╛рдВ
MessageInputDoggate рдЦреЛрдЬреЗрдВред
рдпрд╣рд╛рдВ рд╣рдо рдЦрд╛рд▓реА
SendWasTapped (рд╕рдВрджреЗрд╢ :) рд╡рд┐рдзрд┐ рджреЗрдЦрддреЗ рд╣реИрдВред рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ chatRoom рдкрд░ рднреЗрдЬреЗрдВ:
chatRoom.send(message: message)
рдЕрд╕рд▓ рдореЗрдВ, рд╡рд╣ рд╕рдм рд╣реИ! рдЪреВрдВрдХрд┐ рд╕рд░реНрд╡рд░ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрд╕реЗ рд╕рднреА рдХреЛ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░реЗрдЧрд╛, рдЪреИрдЯ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдХреЗ рджреМрд░рд╛рди рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдЪреИрдЯрд░реВрдо рдХреЛ рдирдП рд╕рдВрджреЗрд╢ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЪрд▓рд╛рдПрдВред

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдм рдХрд┐рд╕реА рд╕реЗ рдЪреИрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ, рддреЛ рдПрдХ рдирдИ рдЯрд░реНрдорд┐рдирд▓ рд╡рд┐рдВрдбреЛ рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ рдФрд░ рджрд░реНрдЬ рдХрд░реЗрдВ:
nc localhost 80
рдпрд╣ рдЖрдкрдХреЛ рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдЧрд╛ред рдЕрдм рдЖрдк рдЙрд╕реА "рдкреНрд░реЛрдЯреЛрдХреЙрд▓" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪреИрдЯ рд╕реЗ рдЬреБрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:
iam:gregg
рдФрд░ рдЗрд╕рд▓рд┐рдП - рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬреЗрдВ:
msg:Ay mang, wut's good?

рдмрдзрд╛рдИ рд╣реЛ, рдЖрдкрдиреЗ рдЪреИрдЯ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рдЗрдВрдЯ рд▓рд┐рдЦрд╛ рд╣реИ!
рд╣рдо рдЦреБрдж рдХреЛ рд╕рд╛рдл рдХрд░рддреЗ рд╣реИрдВ
рдпрджрд┐ рдЖрдк рдХрднреА рдРрд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрдврд╝рддреЗ / рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЕрдЪреНрдЫреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдмрдВрдж рдХрд░ рджреЗрддреЗ рд╣реИрдВ рдЬрдм рд╡реЗ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╕реЙрдХреЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдлрд╝рд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХрд╛рдо рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдЖрдкрдХреЛ рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдлрд╝рд╛рдЗрд▓ рдХреА рддрд░рд╣ рдмрдВрдж рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
Send (рд╕рдВрджреЗрд╢ :) : рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж
ChatRoom.swift рдореЗрдВ рдирд┐рдореНрди рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ:
func stopChatSession() { inputStream.close() outputStream.close() }
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рд╢рд╛рдпрдж рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдерд╛, рдпрд╣ рд╡рд┐рдзрд┐ рдереНрд░реЗрдб рдХреЛ рдмрдВрдж рдХрд░ рджреЗрддреА рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдЕрдм рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рди рдХрд░ рд╕рдХреЗрдВ рдФрд░ рд╕рдВрджреЗрд╢ рди рднреЗрдЬ рд╕рдХреЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдереНрд░реЗрдбреНрд╕ рдХреЛ
рд░рди рд▓реВрдк рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдЙрдиреНрд╣реЗрдВ рд░рдЦрд╛ рдерд╛ред
рдЗрд╕ рд╡рд┐рдзрд┐ рдореЗрдВ рдПрдХ рдХреЙрд▓ рдЬреЛрдбрд╝реЗрдВред
рдзрд╛рд░рд╛ рдХреЗ рдЕрдВрджрд░
рд╕реНрд╡рд┐рдЪ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ
.Encountered рд╕реЗрдХреНрд╢рди
(_: рд╣реИрдВрдбрд▓ :) :
stopChatSession()
рдЗрд╕рдХреЗ рдмрд╛рдж
ChatRoomViewController.swift рдкрд░
рдЬрд╛рдПрдВ рдФрд░
viewWillDisappear (_ :) : рдореЗрдВ рднреА рдРрд╕рд╛ рд╣реА рдХрд░реЗрдВ
chatRoom.stopChatSession()
рдпрд╣ рдмрд╛рдд рд╣реИ! рдЕрдм рдкрдХреНрдХрд╛!
рдирд┐рд╖реНрдХрд░реНрд╖
рдЕрдм рдЬрдм рдЖрдкрдиреЗ рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ рдХреА рдореВрд▓ рдмрд╛рддреЛрдВ рдореЗрдВ рдорд╣рд╛рд░рдд рд╣рд╛рд╕рд┐рд▓ рдХрд░ рд▓реА рд╣реИ, рддреЛ рдЖрдк рдЕрдкрдиреЗ рдЬреНрдЮрд╛рди рдХреЛ рдЧрд╣рд░рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпреВрдбреАрдкреА рд╕реЙрдХреЗрдЯреНрд╕
рдпрд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЯреАрд╕реАрдкреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдиреЗрдЯрд╡рд░реНрдХ рд╕рдВрдЪрд╛рд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдЬреЛ рдЧрдВрддрд╡реНрдп рддрдХ рдкреИрдХреЗрдЯ рдХреЗ рд╡рд┐рддрд░рдг рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдк рдпреВрдбреАрдкреА рд╕реЙрдХреЗрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХрдиреЗрдХреНрд╢рди рдкреИрдХреЗрдЬ рдХреЗ рд╡рд┐рддрд░рдг рдХреЛ рдЙрдирдХреЗ рдЗрдЪреНрдЫрд┐рдд рдЙрджреНрджреЗрд╢реНрдп рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рддреЗрдЬрд╝ рд╣реИред
рдпрд╣ рдЦреЗрд▓реЛрдВ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реИред рдХрднреА рдПрдХ рдЕрдВрддрд░рд╛рд▓ рдЕрдиреБрднрд╡ рдХрд┐рдпрд╛? рдЗрд╕рдХрд╛ рдорддрд▓рдм рдерд╛ рдХрд┐ рдЖрдкрдХреЗ рд╕рдВрдмрдВрдз рдЦрд░рд╛рдм рдереЗ рдФрд░ рдпреВрдбреАрдкреА рдХреЗ рдХрдИ рдкреИрдХреЗрдЯ рдЦреЛ рдЧрдП рдереЗред
WebSockets
рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ HTTP рдХрд╛ рдПрдХ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рдПрдХ рддрдХрдиреАрдХ рд╣реИ рдЬрд┐рд╕реЗ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдирд┐рдпрдорд┐рдд рдЯреАрд╕реАрдкреА рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╡реЗрдм рд╕реЙрдХреЗрдЯ рд╕рдВрдЪрд╛рд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП HTTP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЙрдирдХреА рдорджрдж рд╕реЗ, рдЖрдк рд╕рд╛рдзрд╛рд░рдг рд╕реЙрдХреЗрдЯ рдХреЗ рд╕рд╛рде рд╣реА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрд░рд╛рдо рдФрд░ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд╕рд╛рде, рдЬреИрд╕реЗ рдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВред