IOS рдкрд░ рдЪреИрдЯ рдХрд░реЗрдВ: рд╕реЙрдХреЗрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


рдЪрд┐рддреНрд░ 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 { //1 var inputStream: InputStream! var outputStream: OutputStream! //2 var username = "" //3 let maxReadLength = 4096 } 

рдпрд╣рд╛рдБ рд╣рдо ChatRoom рд╡рд░реНрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрди рдЧреБрдгреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

  1. рдкрд╣рд▓реЗ рд╣рдо рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рдЬреЛрдбрд╝реА рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд╣рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ рдЪреИрдЯ рд╕рд░реНрд╡рд░ рдХреЗ рдмреАрдЪ рд╕реЙрдХреЗрдЯ рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓реЗрдЧреАред рдмреЗрд╢рдХ, рд╣рдо рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрджреЗрд╢ рднреЗрдЬреЗрдВрдЧреЗ, рдФрд░ рдЗрдирдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред
  2. рдЕрдЧрд▓рд╛, рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
  3. рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣рдо рд╡реИрд░рд┐рдПрдмрд▓ рдореИрдХреНрд╕рд░реЗрд▓рдбреНрд░реАрдорд┐рдЯреА рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐рд╕реА рдПрдХ рд╕рдВрджреЗрд╢ рдХреА рдЕрдзрд┐рдХрддрдо рд▓рдВрдмрд╛рдИ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИред

рдЕрдм ChatRoomViewController.swift рдлрд╛рдЗрд▓ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдЗрд╕ рд▓рд╛рдЗрди рдХреЛ рдЗрд╕рдХреЗ рдЧреБрдгреЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:

 let chatRoom = ChatRoom() 

рдЕрдм рдЬрдм рд╣рдордиреЗ рдХрдХреНрд╖рд╛ рдХреА рдореВрд▓ рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдИ рд╣реИ, рддреЛ рдпрд╣ рдпреЛрдЬрдирд╛рдмрджреНрдз рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдкрд╣рд▓рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ: рдЖрд╡реЗрджрди рдФрд░ рд╕рд░реНрд╡рд░ рдХреЗ рдмреАрдЪ рдХрдиреЗрдХреНрд╢рди рдЦреЛрд▓рдирд╛ред

рдХрдиреЗрдХреНрд╢рди рдЦреЛрд▓реЗрдВ


рд╣рдо ChatRoom.swift рдкрд░ рд▓реМрдЯрддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрдкрддреНрддрд┐ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:

 func setupNetworkCommunication() { // 1 var readStream: Unmanaged<CFReadStream>? var writeStream: Unmanaged<CFWriteStream>? // 2 CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, "localhost" as CFString, 80, &readStream, &writeStream) } 

рд╣рдо рдпрд╣рд╛рдБ рдХреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВ:

  1. рдкрд╣рд▓реЗ рд╣рдо рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдореЗрдореЛрд░реА рдкреНрд░рдмрдВрдзрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рд╕реЙрдХреЗрдЯ рдзрд╛рд░рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рджреЛ рдЪрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ
  2. рдлрд┐рд░, рд╣рдо рдЗрди рд╕рдорд╛рди рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╕реАрдзреЗ рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рд╣реЛрд╕реНрдЯ рдФрд░ рдкреЛрд░реНрдЯ рдирдВрдмрд░ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рд╣реИрдВред

рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЪрд╛рд░ рддрд░реНрдХ рд╣реИрдВред рдкрд╣рд▓рд╛ рдореЗрдореЛрд░реА рдПрд▓реЛрдХреЗрдЯрд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рдереНрд░реЗрдбреНрд╕ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╕рдордп рдХрд░реЗрдВрдЧреЗред рдЖрдкрдХреЛ 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) { //1 let data = "iam:\(username)".data(using: .utf8)! //2 self.username = username //3 _ = data.withUnsafeBytes { guard let pointer = $0.baseAddress?.assumingMemoryBound(to: UInt8.self) else { print("Error joining chat") return } //4 outputStream.write(pointer, maxLength: data.count) } } 

  1. рдкрд╣рд▓реЗ рд╣рдо рдЕрдкрдиреЗ "рдкреНрд░реЛрдЯреЛрдХреЙрд▓" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдирд╛ рд╕рдВрджреЗрд╢ рдмрдирд╛рддреЗ рд╣реИрдВ
  2. рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдирд╛рдо рд╕рд╣реЗрдЬреЗрдВред
  3. withUnsafeBytes (_ :) рдПрдХ рдХреНрд▓реЛрдЬрд░ рдХреЗ рдЕрдВрджрд░ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
  4. рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЕрдкрдирд╛ рд╕рдВрджреЗрд╢ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рднреЗрдЬрддреЗ рд╣реИрдВред рдпрд╣ рдЖрдкрдХреА рдЕрдкреЗрдХреНрд╖рд╛ рд╕реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд▓рд┐рдЦреЗрдВ (_: 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) { //1 let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: maxReadLength) //2 while stream.hasBytesAvailable { //3 let numberOfBytesRead = inputStream.read(buffer, maxLength: maxReadLength) //4 if numberOfBytesRead < 0, let error = stream.streamError { print(error) break } // Construct the Message object } } 

  1. рд╣рдо рдмрдлрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЖрдиреЗ рд╡рд╛рд▓реЗ рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдкрдврд╝реЗрдВрдЧреЗред
  2. рд╣рдо рдПрдХ рд▓реВрдк рдореЗрдВ рдШреВрдорддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдЗрдирдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдХреБрдЫ рдкрдврд╝рдирд╛ рд╣реИред
  3. рд╣рдо рд░реАрдб (_: maxLength :) рдХрд╣рддреЗ рд╣реИрдВ, рдЬреЛ рд╕реНрдЯреНрд░реАрдо рд╕реЗ рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдмрдлрд░ рдореЗрдВ рдбрд╛рд▓рддрд╛ рд╣реИред
  4. рдпрджрд┐ рдХреЙрд▓ рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдПрдХ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ рдФрд░ рд▓реВрдк рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╣реИрдВред

рд╣рдореЗрдВ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреИрд╕реЗ рд╣реА рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрдиреЗ рд╡рд╛рд▓реА рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдбреЗрдЯрд╛ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕реНрдЯреНрд░реАрдо рдХреЗ рдЕрдВрджрд░ рд╕реНрд╡рд┐рдЪ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдкрд░ рдЬрд╛рдПрдВ (_: рд╣реИрдВрдбрд▓ :) рд╡рд┐рдзрд┐, .hasBytesAvailable рд╕реНрд╡рд┐рдЪ рдвреВрдВрдвреЗрдВ рдФрд░ рдкреНрд░рд┐рдВрдЯ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ:

 readAvailableBytes(stream: aStream as! InputStream) 

рдЗрд╕ рд╕реНрдерд╛рди рдкрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░рд╛рдкреНрдд рдЖрдВрдХрдбрд╝реЛрдВ рдХрд╛ рдПрдХ рддреИрдпрд╛рд░ рдмрдлрд░ рд╣реИ!

рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЕрднреА рднреА рдЗрд╕ рдмрдлрд░ рдХреЛ рд╕рдВрджреЗрд╢ рддрд╛рд▓рд┐рдХрд╛ рдХреА рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред

рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ readAvailableBytes (рд╕реНрдЯреНрд░реАрдо :) рдкрд░ рд░рдЦреЗрдВ ред

 private func processedMessageString(buffer: UnsafeMutablePointer<UInt8>, length: Int) -> Message? { //1 guard let stringArray = String( bytesNoCopy: buffer, length: length, encoding: .utf8, freeWhenDone: true)?.components(separatedBy: ":"), let name = stringArray.first, let message = stringArray.last else { return nil } //2 let messageSender: MessageSender = (name == self.username) ? .ourself : .someoneElse //3 return Message(message: message, messageSender: messageSender, username: name) } 

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдмрдлрд░ рдФрд░ рдЖрдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдЖрд░рдВрднреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдо рдЗрд╕ рд╡рд┐рдзрд┐ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВред

рдкрд╛рда UTF-8 рдореЗрдВ рд╣реЛрдЧрд╛, рдЕрдВрдд рдореЗрдВ рд╣рдо рдмрдлрд░ рдХреЛ рдореБрдХреНрдд рдХрд░реЗрдВрдЧреЗ, рдФрд░ рд╕рдВрджреЗрд╢ рдХреЛ ':' рдХреЛ рдкреНрд░реЗрд╖рдХ рдХреЗ рдирд╛рдо рдФрд░ рд╕рдВрджреЗрд╢ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВрдЧреЗред

рдЕрдм рд╣рдо рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╕рдВрджреЗрд╢ рджреВрд╕рд░реЗ рдкреНрд░рддрд┐рднрд╛рдЧреА рд╕реЗ рдЖрдпрд╛ рд╣реИред рдЙрддреНрдкрд╛рдж рдкрд░, рдЖрдк рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдЯреЛрдХрди рдЬреИрд╕рд╛ рдХреБрдЫ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдбреЗрдореЛ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред

рдЕрдВрдд рдореЗрдВ, рдЗрд╕ рд╕рднреА рдЕрд░реНрдерд╡реНрдпрд╡рд╕реНрдерд╛ рдореЗрдВ, рд╣рдо рд╕рдВрджреЗрд╢ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВред

рдЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд░реАрдб-рдЕрд╡реЗрд▓реЗрдмрд▓ рдмрд┐рдЯреНрд╕ (рд╕реНрдЯреНрд░реАрдо :) рд╡рд┐рдзрд┐ рдореЗрдВ рдЕрдВрддрд┐рдо рд▓реВрдк рдХреЗ рдЕрдВрдд рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЗрдл-рд▓реЗрдЯ рдХреЛ рдЕрдВрддрд┐рдо рдЯрд┐рдкреНрдкрдгреА рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдЬреЛрдбрд╝реЗрдВ:

 if let message = processedMessageString(buffer: buffer, length: numberOfBytesRead) { // Notify interested parties } 

рдЕрдм рд╕рдм рдХреБрдЫ рдХрд┐рд╕реА рдХреЛ рд╕рдВрджреЗрд╢ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ ... рд▓реЗрдХрд┐рди рдХрд┐рд╕рд╕реЗ?

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 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЙрдирдХреА рдорджрдж рд╕реЗ, рдЖрдк рд╕рд╛рдзрд╛рд░рдг рд╕реЙрдХреЗрдЯ рдХреЗ рд╕рд╛рде рд╣реА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрд░рд╛рдо рдФрд░ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд╕рд╛рде, рдЬреИрд╕реЗ рдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВред

Source: https://habr.com/ru/post/hi467909/


All Articles