@@ -78,11 +78,14 @@ func runServer() error {
78
78
defer conn .Close ()
79
79
80
80
// net/textprotoの接続として処理
81
+ //
82
+ // textproto.NewConn() は、引数に io.ReadWriteCloser を要求しているが
83
+ // net.Conn は、os.Fileと同様に io.ReadWriteCloser を実装している。
81
84
tpConn := textproto .NewConn (conn )
82
85
defer tpConn .Close ()
83
86
84
87
// ウェルカムメッセージ
85
- err = tpConn .PrintfLine ("%d %s" , OK , "ようこそ! コマンド: GET, SET , QUIT" )
88
+ err = tpConn .PrintfLine ("%d %s" , OK , "WELCOME AVAILABLE COMMANDS: {SET, GET , QUIT} " )
86
89
if err != nil {
87
90
return err
88
91
}
@@ -133,60 +136,86 @@ func runClient() error {
133
136
tpConn := textproto .NewConn (conn )
134
137
defer tpConn .Close ()
135
138
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
+ )
140
155
141
- fmt .Printf ("%d %s\n " , code , message )
156
+ // WELCOME
157
+ {
158
+ err = recv (tpConn )
159
+ if err != nil {
160
+ return err
161
+ }
162
+ }
142
163
143
164
// SET
144
165
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
+ }
151
171
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
+ }
155
176
}
156
177
157
- fmt .Printf ("%d %s\n " , code , message )
158
-
159
178
// GET
160
179
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
+ }
162
185
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
+ }
166
190
}
167
191
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
+ }
172
199
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
+ }
174
205
175
206
// QUIT
176
207
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
+ }
183
213
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
+ }
187
218
}
188
219
189
- fmt .Printf ("%d %s\n " , code , message )
190
-
191
220
return nil
192
221
}
0 commit comments