群聊的简单实现

群聊就是群聊就是大家聚在一起聊天,每一个参与者说的话都可以被其他参与者看见,
也就是说:服务器接受到客户机上传的信息后,将信息分别在发送给每一个客户机

V1版本的实现:telnet连结,一个客户机发出消息,其他的客户机可以接受的到

在服务器线程中,每当有客户机申请连结的时候,就会启动一个服务器线程,来处理此连结,先用一个队列将这些服务器线程保存起来
每保存一个服务器线程对象,就相当于保存了一个客户机对象(个人理解。。。仅供参考)

启动服务器后,有客户机申请连结,当连结成功后,启动一个服务器线程来处理该链接,并将该线程添加到队列中去。

服务器线程对象serverthread首先要通过输入流InputStream读取客户机传来的消息

然后通过方法sendToAll()将消息传给队列中其余的线程:

//静态方法,由类名就可以调用
/**
* 将消息msg发送给所有的客户机
* @param msg 消息
* @param sst 发出原始信息的客户机对应的线程
*/
public static void sendToAll(String msg,ServerThread sst){
for(int i = 0;i<stList.size();i++){
ServerThread st = stList.get(i);
st.sendToClient(sst.name + "say: " +msg);
}
}




再由每一个线程,输出到各自对应的客户机上

①将InputStream封装成BufferedReader,方便信息的读入
//InputStream只能一个字节一个字节的读取,现在将其封装成BufferedReader对象,这样就可以一次读取一行
//BufferedReader的构造器要有一个Reader类型的参数,而InputStreamReader是Reader的子类
BufferedReader br = new BufferedReader(new InputStreamReader(ins));
②处理服务器线程的,单独写成一个类,也可以将管理这些线程的方法写进ServerThread类中
③在自己写程序时,经常会先把框架写好,即我需要哪些方法,来实现那些功能,但是这样也经常会忘记往里面填写内容,尤其是main()和run()
④空指针异常。。。这个一路伴随我成长的错误。。。
输出流OutputStream是空的,应该是在获取ous = client.getOutputStream()的代码为未执行时就使用了ous
问题出现在管理的添加方法调用上,即ManageServer.addST(ServerThread st);的调用上
先启动该线程?现将线程对象加入到队列中去?
答案肯定是先启动线程,在获取了ous:ous = client.getOutputStream()
也就是说,人不能太死心眼,我最开始把ManageServer.addST(ServerThread st)写在启动线程之后,但是谁规定添加线程到队列的函数一定要紧紧地、一步不差地跟在创建线程对象之后呢
⑤先从线程队列中移除,再关闭线程
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值