第六页:记住自己身在何处

by Brian Slesinsky

到目前为止,我们的交谈服务器还存在一个问题:你不知道是谁在说话。真正的交谈服务器在用户的回话旁边显示其“头衔”,所以你能搞清楚是哪个人在说话。

如果在同一时刻我们只做一件事,那么询问“头衔”的代码则非常浅显易懂,如下所示:

my $new=$listen->accept;

$select->add($new);

print $new->fileno. ?/FONT>:connected\n?/FONT>;

$new->write(?/FONT>choose a handle>?/FONT>);

$handle[$new->fileno]=$new->recv;

我们需要做的是记下自己身在何处、在新来的用户敲信息时处理其他人的请求以及在新来者输完信息后再返回来。代码应分成两部分:

sub login {

my($new)=@_;

$select->add($new);

print $new->fileno. ?/FONT>connected\n?/FONT>;

$new->write(?/FONT>choose a handle>?/FONT>);

save_where_we_are( );

}

sub get_handle {

my($socket)=@_;

$handle[$socket->fileno]=$socket->recv;

}

怎样才能记下自己身在何处呢?一个办法是留出一个指针指向那个包含有下一步该做什么的子程序:

$nextsub[$socket->fileno]=&get_handle;

这样我们就可以通过查看@nextsub的相应入口来找出我们是从何处离开的。

把这些综合起来,利用对象技术对程序进行整理和归纳,并且使其具有可扩展性。这就是最终的程序代码。

Page 1: How to Write a Chat Server
Page 2: Socket Programming the Easy Way
Page 3: We Don?/FONT>t Wait for Nobody
Page 4: The Echo Chamber
Page 5: Now Broadcasting
Page 6: Keeping Track of Where You Were
Page 7: What?/FONT>s Left?

 


Brian Slesinsky is a former HotWired engineer. He left the company to work full-time on his death ray.