@@ -78,11 +78,14 @@ func runServer() error {
7878 defer conn .Close ()
7979
8080 // net/textprotoの接続として処理
81+ //
82+ // textproto.NewConn() は、引数に io.ReadWriteCloser を要求しているが
83+ // net.Conn は、os.Fileと同様に io.ReadWriteCloser を実装している。
8184 tpConn := textproto .NewConn (conn )
8285 defer tpConn .Close ()
8386
8487 // ウェルカムメッセージ
85- err = tpConn .PrintfLine ("%d %s" , OK , "ようこそ! コマンド: GET, SET , QUIT" )
88+ err = tpConn .PrintfLine ("%d %s" , OK , "WELCOME AVAILABLE COMMANDS: {SET, GET , QUIT} " )
8689 if err != nil {
8790 return err
8891 }
@@ -133,60 +136,86 @@ func runClient() error {
133136 tpConn := textproto .NewConn (conn )
134137 defer tpConn .Close ()
135138
136- code , message , err := tpConn .ReadCodeLine (OK )
137- if err != nil {
138- return err
139- }
139+ // helper funcs
140+ var (
141+ send = func (tp * textproto.Conn , msg string ) error {
142+ fmt .Printf ("< %s\n " , msg )
143+ return tp .PrintfLine ("%s" , msg )
144+ }
145+ recv = func (tp * textproto.Conn ) error {
146+ code , msg , err := tp .ReadCodeLine (OK )
147+ if err != nil {
148+ return err
149+ }
150+ fmt .Printf ("%d %s\n " , code , msg )
151+
152+ return nil
153+ }
154+ )
140155
141- fmt .Printf ("%d %s\n " , code , message )
156+ // WELCOME
157+ {
158+ err = recv (tpConn )
159+ if err != nil {
160+ return err
161+ }
162+ }
142163
143164 // SET
144165 m := fmt .Sprintf ("%s %s %s" , CmdSet , "Hello" , "World" )
145- fmt .Printf ("< %s\n " , m )
146-
147- err = tpConn .PrintfLine ("%s" , m )
148- if err != nil {
149- return err
150- }
166+ {
167+ err = send (tpConn , m )
168+ if err != nil {
169+ return err
170+ }
151171
152- code , message , err = tpConn .ReadCodeLine (OK )
153- if err != nil {
154- return err
172+ err = recv (tpConn )
173+ if err != nil {
174+ return err
175+ }
155176 }
156177
157- fmt .Printf ("%d %s\n " , code , message )
158-
159178 // GET
160179 m = fmt .Sprintf ("%s %s" , CmdGet , "Hello" )
161- fmt .Printf ("< %s\n " , m )
180+ {
181+ err = send (tpConn , m )
182+ if err != nil {
183+ return err
184+ }
162185
163- err = tpConn .PrintfLine ("%s" , m )
164- if err != nil {
165- return err
186+ err = recv (tpConn )
187+ if err != nil {
188+ return err
189+ }
166190 }
167191
168- code , message , err = tpConn .ReadCodeLine (OK )
169- if err != nil {
170- return err
171- }
192+ // 存在しないコマンド
193+ m = fmt .Sprintf ("%s %s" , "GOLANG" , "HELLO" )
194+ {
195+ err = send (tpConn , m )
196+ if err != nil {
197+ return err
198+ }
172199
173- fmt .Printf ("%d %s\n " , code , message )
200+ err = recv (tpConn )
201+ if err != nil {
202+ fmt .Printf ("%[1]s (%[1]T)\n " , err )
203+ }
204+ }
174205
175206 // QUIT
176207 m = CmdQuit
177- fmt .Printf ("< %s\n " , m )
178-
179- err = tpConn .PrintfLine ("%s" , m )
180- if err != nil {
181- return err
182- }
208+ {
209+ err = send (tpConn , m )
210+ if err != nil {
211+ return err
212+ }
183213
184- code , message , err = tpConn .ReadCodeLine (OK )
185- if err != nil {
186- return err
214+ err = recv (tpConn )
215+ if err != nil {
216+ return err
217+ }
187218 }
188219
189- fmt .Printf ("%d %s\n " , code , message )
190-
191220 return nil
192221}
0 commit comments