JAVA聊天器(1)

  • 课程设计要求与目的

目的:编写一个小型Java聊天室系统,掌握Java网络通信、多线程、IO文件操作等高级应用编程技能。

要求:以课本第15章 Java网络通信例15.3、15.4的源代码为基础,编写一个小型Java聊天室系统。

完成如下功能:

1、多客户端模式下,实现客户与客户的单独通信,要求信息通过服务器中转

2、端到端的通信,实现并行通信模式(不再是你说一句,我说一句,一端的信息发送不受另一端的影响)

3、实现端到端的文件传输

4、添加图形界面(选做)

(1)在刚起步时候遇到的问题:

在刚开始着手敲代码的时候自己就陷入了细节之中,没有以全局的角度去看待。刚起步的时候自己主要是创建了四个类,如下所示:

主要的想法是MultiTalkServe类实现监听的功能,当监听到用户请求的时候就启动ServerThread这个线程用来处理和客户的收发消息等情况,TalkClient为客户端用来发送请求还有发送消息,因为是基于C-S-C的聊天器模式,所以要想实现客户1与客户2之间互发消息,那么只要将服务器端生成的与客户一一对应的套接字存储起来,再在这些服务器的套接字内部实现消息转发即可实现客户1与客户2的通信,所以自己就再建了一个Store类,用来存储服务器端生成的套接字。

在Store类中声明的是一个Vector动态数组,存放服务器的套接字。

因为之前学过关于类的组合,所以就想在聊天器中实践一下,MultiTalkServer类将Store对象引用st作为自己的数据成员,之后要就可以调用Store类的方法,在刚开始的时候就报了空指针异常,后来才发现是自己没有将对象和引用关联起来的原因,进一步加深了自己对于对象和引用之间类似于电视机和遥控器关系的理解。

在存储好了套接字之后,就希望进一步实现聊天功能,所以就在Store类中新建了一个exchange方法,用来实现消息的转发,具体注释如下所示,

该方法在客户端来被调用,在TalkClient类中也拥有Store对象的引用st,

当时的想法是每新生成一个客户的时候就会输出当前的上线人数,然后再输入想要和对方聊天的编号,最后通过exchange方法来实现消息互传。

 

可是最后在自己真正运行的时候,结果并不和自己当初想象的一样美好,每次新生成一个客户,虽然服务器端能动态更新当前的上线人数,但是客户端的人数总是为0。也就是不能实现动态更新。

后来通过思考,才发现原因为服务器端得到当前人数是通过调用当前引用st的getsize方法得到的,客户端也同样是通过Store类的引用st,每当我新生成一个客户的时候,内存空间就会新开辟一块存放Store对象的内存空间,里面存放它的数据成员Vector动态数组的引用vector,vector关联的是新生成的对象Vector,里面存放的是服务器的套接字,而在客户端并没有加入元素,所以size为0,过程图如下所示:

 

 

猜你喜欢

转载自blog.csdn.net/qq_42140049/article/details/82315288