计算机与信息工程系《Java课程设计》报告专业班级学号姓名报告完成日期指导教师网络聊天室一、设计任务与目标现在社会是信息化的社会,什么都追求着快、新、好。
在这种快节奏的生活方式中,人们之间的通讯联系就显得非常的重要了。
商业之间的合作,人们之间的友谊交往,甚至热门谈到的网上恋爱等等都需要通讯联系。
而过去的鸿雁传书已经是满足不了现代人的欲望了。
既然这网络这么的流行,过去的联系方式又这么的落后,因此人们的目光就转向了网络通讯。
聊天工具就是一种网上很普遍但是又很重要的通讯方式。
本聊天软件旨在为同一局域网用户间提供便利的局域网服务,局域网用户可以通过此聊天软件在各终端相互发送聊天信息,同时可以快速传送文件,方便局域网用户间的快速有效通信。
二、.设计思路整体方案的制定聊天工具的系统运行图基本设计思想:采用客户机/服务器(C/S)结构。
即通信双方一方作为服务器等待客户提出请求并予以响应。
客户则在需要服务时向服务器提出申请。
服务器一般作为守护进程始终运行,监听网络端口,一旦有客户请求,就会启动一个服务进程来响应该客户,同时自己继续监听服务端口,使后来的客户也能及时得到服务。
客户端的设计用户之间通过UDP连接来实现用户间的通讯.每个用户在该聊天工具进入主界面时便创建一个线程,无限监听其他好友发来的消息,如果某个好友发来消息,便接受该消息并弹出聊天界面和显示其发来的消息.聊天消息的接受的部分的核心程序流程如下图所示:图聊天消息的接受的部分的核心程序流程聊天消息的发送的部分的核心程序流程如下图所示:图聊天消息的发送的部分的核心程序流程服务器端的设计服务器与客户间通过套接口Socket(TCP)连接。
在java中使用套接口相当简单,Java API为处理套接口的通信提供了一个类.Socket.,使得编写网络应用程序相对容易.服务器采用多线程以满足多用户的请求,通过JDBC与后台数据库连接,并通过创建一个ServerSocket对象来监听来自客户的连接请求,默认端口为8888,然后无限循环调用accept()方法接受客户程序的连接。
服务器程序核心部分的流程如下图所示:三、具体实现服务器端实现代码:import java.io.*;import .*;import java.util.*;public class ChatServer {boolean started=false;ServerSocket s=null;List<Client> clients=new ArrayList<Client>();public static void main(String[] args) {new ChatServer().start(); /*启动线程*/ }public void start(){try {s=new ServerSocket(8888);started=true;}catch(BindException e2){System.out.println("端口使用中……");System.out.println("请关掉相关程序,并重新运行服务器!");System.exit(0);}catch(IOException e){e.printStackTrace();}try{while(started){ /*当客户端有连接上时开始接收*/ Socket ss=s.accept();Client c=new Client(ss);System.out.println("A have connect!");new Thread(c).start();clients.add(c);}} catch (IOException e) { /*突然关闭客户端异常处理*/ System.out.println("Client closed!");}finally{try {s.close();} catch (IOException e) {e.printStackTrace();}}}class Client implements Runnable{private Socket ss;private DataInputStream dis=null;private DataOutputStream dos=null;private boolean bconnected=false;public Client(Socket ss){ /*接收客户端信息*/ this.ss=ss;try {dis=new DataInputStream(ss.getInputStream());dos=new DataOutputStream(ss.getOutputStream());bconnected=true;} catch (IOException e) {e.printStackTrace();}}public void send(String str){ /*发送客户端信息*/ try {dos.writeUTF(str);} catch (IOException e) {clients.remove(this);System.out.println("对方退出了!");//e.printStackTrace();}}public void run() {try{while(bconnected){String st=dis.readUTF();System.out.println(st);for(int i=0;i<clients.size();i++){Client c=clients.get(i);c.send(st);System.out.println("a string send!");}}} catch(EOFException e){System.out.print("Client closed!");}catch (IOException e) {e.printStackTrace();}finally{try {if(dis!=null) dis.close();if(dos!=null) dos.close();if(ss!=null) ss.close();} catch (IOException e1) {e1.printStackTrace();}}}}}客户端实现代码:import java.awt.*;import java.io.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.io.IOException;import .*;import java.text.DateFormat;import java.util.Date;public class ChatClient {public static void main(String[] args) {new MyFrame().launchFrame();}}class MyFrame extends Frame{ /*构造客户端界面*/TextField tf=new TextField();TextArea ta=new TextArea();Panel p=new Panel();Button b1=new Button("发送文件");Button b2=new Button("发送图片");Socket soc=null;DataOutputStream dos=null;DataInputStream dis=null;private boolean bConnected=false;Thread tre=new Thread(new RecvThread()); /*产生线程对象*/ public void launchFrame(){this.setBounds(300, 300, 400,300);add(p,BorderLayout.NORTH);add(tf,BorderLayout.SOUTH);add(ta,BorderLayout.CENTER);p.add(b1);p.add(b2);pack();this.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e){disconnect();System.exit(0);}});tf.addActionListener(new TFListener());this.setVisible(true);connect();tre.start();}public void connect(){ /*与服务器端连接*/try {soc=new Socket("127.0.0.1",8888);dos=new DataOutputStream(soc.getOutputStream());dis=new DataInputStream(soc.getInputStream());System.out.println("Connected!");bConnected=true;} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}public String getDatetime_System(){ /*设置日期输出格式*/DateFormat dt=DateFormat.getInstance();String datetime=dt.format(new Date()).toString();return datetime;}public void disconnect(){ /*断开连接*/try {dos.close();dis.close();soc.close();} catch (IOException e) {e.printStackTrace();}}private class TFListener implements ActionListener{ /*发送信息监听类*/ public void actionPerformed(ActionEvent e) {String s= tf.getText().trim();//ta.setText(s);tf.setText("");try {dos.writeUTF(s);dos.flush();} catch (IOException e1) {e1.printStackTrace();}}}private class RecvThread implements Runnable{public void run() {try{while(bConnected){String s=getDatetime_System();String str="昵称:"+this.hashCode()+"\n"+s+"\n"+dis.readUTF();ta.setText(ta.getText()+str+"\n");}}catch(SocketException e){System.out.println("退出了,bye!");}catch(EOFException e){System.out.println("退出了,bye-bye!");} catch (IOException e) {e.printStackTrace();}}}}五、程序运行的测试与分析服务器连接成功界面如下图所示:客户端运行结果如下图所示:聊天运行结果如下图所示:六、总结通过这次毕业设计,我学到了很多.以前学过JA V A这门课程,也做过关于JA V A 的简单的程序,但是这次的设计对我来说是一个比较大的挑战,我还是头一次做这么复杂的设计.通过这次设计我主要学到了客户端和服务器的通讯,还有学到了遇到困难应该怎样解决的方法.通过这次的课程设计我学习掌握了很多的知识。