前段时间开始学习JAVA,学到现在刚好把最基础J2SE的部分学完,最大的感触就是面向对象的编程语言虽然各自实现不一样,但是思想却还是一致的,所以暂目前学起来感觉难度还好,毕竟是最基础的嘛!为了把学的基础知识融会贯通,我开始尝试编写一个简单的在线聊天系统,跟着老师一步一步开始了这个小项目。
暂目前我完成了大体的构造,实现了多个客服端向服务器的发送,步骤如下:
step1:首先要做聊天系统,必须搭建框架,因此先写客服端的程序。我用最基本的GUI知识构建了一个Frame,里面包含了两个元件TextField(简称 tf )和TextArea(简称 ta )。
step2:框架构建好后,通过测试,保证从 tf 输入的内容能够显示到 ta 上,因此在 tf 上加了一个ActionListener。
step3:这一步只是加了一个小功能,就是关闭窗口,所以自身加了一个WindowListener,因为在程序中添加的是匿名类,所以传入的参数实现的是WindowAdapter;
step4:此时客户端基本框架已经搭好,所以开始尝试将客户端和服务器端连接。因此开始写服务器端的程序,应用的是TCP连接,此时在服务器端提供了一个接口,并在客户端进行连接,若是成功连接,输出一条测试语句表明连接成功。
step5:服务器端和客服端已经建立好连接,因此尝试从客服端的 tf 输出的语句能让服务器端接收。因为是 tf 发生动作服务器端作出响应,所以在客户端程序里边是在实现了ActionListener的类里面建立Socket连接,并且在OutputStream外包装了DataOutputStream,此时可以通过writeUTF和flush函数就可以向服务器端发送数据了,同时只要在服务器端的程序中做出对应的处理,便可以接收到。
step6:此时会出现一个小问题,因为在服务器端的ReadUTF函数是阻塞式的,所以当客户端关闭时,服务器端便会报出EOFException的错误,所以在服务器端分成两个try、catch部分,分别为ServerSocket(简称ss)和Socket(简称s)的构建和处理,并将ss 和 s 定义为成员变量,此时在s 部分捕捉EOFException,并作出提示处理。
step7:这是基本功能已经实现,但是服务器端只是接受一个客户端的响应,因为readUTF函数是阻塞式的,主方法卡在此处,无法返回上面的代码处接受另一个客户端,因此想要修正这种情况,必须启动线程,将服务器端的程序的格局进行大改。因此在服务器端写一个内部类实现Runnable接口,内部有自己的成员变量Socket和DataInputStream,在构造方法中,接受一个Socket,并且构造一个DataOutStream。在重写的Run方法中,实现之前的输出。由于main方法是静态的,所以无法在里面启动一个动态的内部类线程,所以添加一个start方法,内部为ServerSocket和Socket的建立,并启动线程,此时main方法,只需启动start方法即可。
通过这七步,我初步构建了一个简单在线聊天系统,后续过程会接着补上。通过这个小项目的锻炼,我最直观的感受就是,程序不是一蹴而就的,也是一步步的搭建和调试,先从最简单的开始,当然在这之中,还遇到了其他的错误就不一一说明,但这是对自己所学知识很好的融会贯通,也积累了不少的经验。