Erlang 聊天室程序(二) 客户端的退出

接着上一篇Erlang 聊天室程序(一)。客户端退出会导致服务器端异常退出。

异常信息如下:

  1. client sockt closed
  2. ** exception exit: {bad_return_value,true}

显然已经在client_session的 handle_info({tcp_closed,Socket},State) 中捕捉到了Socket断链信息。

  1. handle_info({tcp_closed,Socket},State)->
  2.     io:format(“client sockt closed ~n”),
  3.     chat_room:logout(State),
  4.     {noreply,State};

再向chat_room:logout(Ref)中加入打印代码进行测试:

  1. logout(Ref)->
  2.     io:format(“ref info:~p~n”,[Ref]),
  3.     gen_server:call(?MODULE, {remove_clientinfo,Ref}),
  4.     ok.

错误信息如下:

  1. client sockt closed
  2. ref info:{clientinfo,[1],
  3.                      undefined,#Port<0.1778>,undefined,undefined,undefined,
  4.                      undefined,undefined,undefined,undefined}
  5. ** exception exit: {bad_return_value,true}

改变位置:

  1. gen_server:call(?MODULE, {remove_clientinfo,Ref}),
  2. io:format(“ref info:~p~n”,[Ref])

错误信息如下:

  1. client sockt closed
  2. ** exception exit: {bad_return_value,true}

看来错误是出在gen_server:call里面的。

  1. handle_call({remove_clientinfo,Ref},From,State)->
  2.     Key=Ref#clientinfo.id,
  3.     ets:delete(clientinfo, Key),
  4.     ;

的确如此,加上返回值{reply,ok,State} 再进行测试。

  1. client sockt closed
  2. ref info:{clientinfo,[1],
  3.                      undefined,#Port<0.1778>,undefined,undefined,undefined,
  4.                      undefined,undefined,undefined,undefined}

已经没有错误信息了。



发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

(Spamcheck Enabled)