@@ -179,21 +179,30 @@ func HandleClient(client *client, userConnChan chan net.Conn) {
179
179
go client .Read (ctx )
180
180
go client .Write (ctx )
181
181
182
+ user := & user {
183
+ read : make (chan []byte ),
184
+ write : make (chan []byte ),
185
+ exit : make (chan error ),
186
+ }
187
+
188
+ defer func () {
189
+ _ = client .conn .Close ()
190
+ _ = user .conn .Close ()
191
+ client .reConn <- true
192
+ }()
193
+
182
194
for {
183
195
select {
184
196
case userConn := <- userConnChan :
185
- user := & user {
186
- conn : userConn ,
187
- read : make (chan []byte ),
188
- write : make (chan []byte ),
189
- exit : make (chan error ),
190
- }
191
-
197
+ user .conn = userConn
192
198
go handle (ctx , client , user )
193
199
case err := <- client .exit :
194
200
fmt .Println ("client出现错误, 关闭连接" , err .Error ())
195
201
cancel ()
196
- client .reConn <- true
202
+ return
203
+ case err := <- user .exit :
204
+ fmt .Println ("user出现错误,关闭连接" , err .Error ())
205
+ cancel ()
197
206
return
198
207
}
199
208
}
@@ -203,9 +212,8 @@ func HandleClient(client *client, userConnChan chan net.Conn) {
203
212
// 1. 将从user收到的信息发给client
204
213
// 2. 将从client收到信息发给user
205
214
func handle (ctx context.Context , client * client , user * user ) {
206
- userCtx , cancel := context .WithCancel (ctx )
207
- go user .Read (userCtx )
208
- go user .Write (userCtx )
215
+ go user .Read (ctx )
216
+ go user .Write (ctx )
209
217
210
218
for {
211
219
select {
@@ -217,15 +225,6 @@ func handle(ctx context.Context, client *client, user *user) {
217
225
user .write <- clientRecv
218
226
219
227
case <- ctx .Done ():
220
- _ = client .conn .Close ()
221
- _ = user .conn .Close ()
222
- cancel () // client关闭,关闭user读写协程
223
- return
224
-
225
- case err := <- user .exit :
226
- fmt .Println ("user出现错误,关闭连接" , err .Error ())
227
- _ = user .conn .Close ()
228
- cancel () // user错误,关闭user读写协程
229
228
return
230
229
}
231
230
}
0 commit comments