《Java聊天系统实训报告.doc》由会员分享,可在线阅读,更多相关《Java聊天系统实训报告.doc(18页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、郑州轻工业学院实 训 报 告实训名称: 即时聊天系统 姓 名: 王路超 院 (系): 软件学院 专业班级: java01 学 号: 3 指导教师: 刘育熙 胡春辉 成 绩: 时间: 2014 年 06 月 3 日至 2014 年 06 月 20 日一、学生信息专业 软件技术 学号 3 姓名 王路超 二、用户需求及约束条件完成一个即时聊天程序,使用服务器、客户端(C/S)架构,实现多人之间和个体对个体的聊天。服务器端使用线程非阻塞方式。使用数据库保存用户信息,允许其注册修改。当用户不在线时,支持信息留言三、实训目的:1、理解C/S模式的软件系统结构,掌握网络编程的基本概念;2、了解Java 的多
2、线程机制,掌握Java多线程技术的应用;3、熟练掌握基于TCP协议的Socket编程;4、熟练掌握基于UDP协议的Socket编程;5、了解Socket编程的协议约定以及信息交互方法;四、实训要求:使用JBuilder提供的组件及网络包,开发一个实用的C/S模式聊天室系统。 (1) 功能要求要求该系统由客户端及服务器端两部分组成。(2) 系统界面要求:要求系统具有友好的用户界面,界面简洁、操作方便;本程序客户端主要完成了:1. 客户端发送信息可以广播客户。2. 广播客户,则将信息转发到所有客户端。服务器主要完成了:客户-服务器之间信息的交互。例如hello发送信息到服务器,服务器将信息转发到所
3、有与之连接的客户(hello、boy),通过这种形式,就可以实现客户之间的信息广播。 本程序可以实现发送信息广播,只要进入客户端都可以看到消息,本程序采用了流的概念,java多线程,Socket应用程序中用到的代码如下启动端口如下:package 聊天系统;import java.awt.BorderLayout;import java.awt.Color;import java.awt.Font;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;i
4、mport java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import .Socket;import java.util.logging.Level;import java.util.logging.Logger;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JScrollPa
5、ne;import javax.swing.JTextArea;import javax.swing.JTextField;public class 聊天系统 extends JFrame implements ActionListener, Runnable private JFrame app; private JPanel a1,a2,a3,a4,a5; private JLabel 输入昵称; private JTextField l1, l2; private JTextArea textArea; private JButton b1,b2,b3; protected Socket
6、 socket; protected Thread thread; protected DataInputStream in; protected DataOutputStream out; protected String nickname; public 聊天系统() app=new JFrame(); app.setSize(400,300); app.setLocation(500,500); app.setLayout(new BorderLayout(); app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); a1=new JPan
7、el(); a1.setBackground(Color.yellow); a2=new JPanel(); a2=new JPanel(); a4=new JPanel(); a4.setBackground(Color.red); a5=new JPanel(); 输入昵称=new JLabel(输入昵称); l1=new JTextField(12); b1=new JButton(确定); a1.add(输入昵称); a1.add(l1); a1.add(b1); textArea=new JTextArea(); textArea.setLineWrap(true); textAre
8、a.setWrapStyleWord(true); textArea.setFont(new Font(幼圆,Font.PLAIN,16); l2=new JTextField(20); a4.add(l2); b2=new JButton(发送); b2.setEnabled(false); a4.add(b2); b3=new JButton(离线); b3.setEnabled(false); a4.add(b3); app.add(a1,BorderLayout.NORTH); app.add(new JScrollPane(textArea),BorderLayout.CENTER)
9、; app.add(a4,BorderLayout.SOUTH); app.setVisible(true); public static void main(String args) new 聊天系统(); Override public void actionPerformed(ActionEvent e) if(e.getSource()=b1) b1Button(); if(e.getSource()=b2) b2Button(); if(e.getSource()=b3) b3Button(); private void b1Button()/确定 private void b2Bu
10、tton()/发送 try out.writeUTF(nickname+说:+l2.getText(); textArea.append(nickname+说:+l2.getText()+n); l1.setText(); catch (IOException e) e.printStackTrace(); private void b3Button()/离线 try out.writeUTF(bye); b2.setEnabled(false); b3.setEnabled(false); textArea.append(连接断开!); socketClosing(); catch (IOE
11、xception ioe) ioe.printStackTrace(); public void run() System.out.println(线程启动); String i=; while(true) try i=in.readUTF(); if(i.equals(bye) b2.setEnabled(false); b3.setEnabled(false); textArea.append(连接断开!); socketClosing(); break; else textArea.append(i+n); catch (IOException ex) socketClosing();
12、System.out.println(有异常,连接中断!); break; System.out.println(线程中断!); private void socketClosing() try in.close(); out.close(); socket.close(); catch (IOException ex) System.out.println(关闭socket和流时,发生异常); 客户端代码:package 聊天系统;/shuo you jiekou import java.awt.BorderLayout;import java.awt.Color;import java.a
13、wt.Font;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import .Socket;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import java
14、x.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.JTextField;public class 客户端 extends JFrame implements ActionListener, Runnable/窗口工具 private JFrame app; private JPanel p1,p2,p3,p4,p5; private JLabel 输入昵称;/面板 private JTextField l1,l2; private JTextArea textArea; private JButton b1,
15、b2,b3; protected Socket socket; protected Thread thread; protected DataInputStream in; protected DataOutputStream out; protected String nickname; public 客户端() app=new JFrame(客户端); app.setSize(400,300);/设置框架大小 app.setLocation(500,500);/设置位置 app.setLayout(new BorderLayout(); app.setDefaultCloseOperati
16、on(JFrame.EXIT_ON_CLOSE);/关闭按钮 关闭窗口 p1=new JPanel(); p1.setBackground(Color.red); p2=new JPanel(); p3=new JPanel(); p4=new JPanel(); p4.setBackground(Color.yellow); p5=new JPanel(); 输入昵称=new JLabel(昵称); 输入昵称.setFont(new Font(宋体,Font.PLAIN,16); 输入昵称.setForeground(Color.red); l1=new JTextField(12); b1
17、=new JButton(确定); b1.setFont(new Font(宋体,Font.PLAIN,16); b1.setForeground(Color.red); b1.addActionListener(this); p1.add(输入昵称); p1.add(l1); p1.add(b1); textArea=new JTextArea(); textArea.setLineWrap(true); textArea.setWrapStyleWord(true); textArea.setFont(new Font(宋体,Font.PLAIN,16); textArea.setFore
18、ground(Color.red); l2=new JTextField(20); p4.add(l2); b2=new JButton(发送); b2.setFont(new Font(宋体,Font.PLAIN,16); b2.setForeground(Color.red); b2.addActionListener(this); b2.setEnabled(false); p4.add(b2); b3=new JButton(离线); b3.setFont(new Font(宋体,Font.PLAIN,16); b3.setForeground(Color.red); b3.addAc
19、tionListener(this); b3.setEnabled(false); p4.add(b3); app.add(p1,BorderLayout.NORTH); app.add(new JScrollPane(textArea),BorderLayout.CENTER); app.add(p4,BorderLayout.SOUTH); app.setVisible(true); Override public void actionPerformed(ActionEvent e) if(e.getSource()=b1) b1Button(); if(e.getSource()=b2
20、) b2Button(); if(e.getSource()=b3) b3Button(); private void b1Button()/确定 textArea.append(连接服务器!n); try nickname=l1.getText(); textArea.append(nickname + 连接服务器n); socket=new Socket(127.0.0.1,8888); in=new DataInputStream(socket.getInputStream(); out=new DataOutputStream(socket.getOutputStream(); thr
21、ead=new Thread(this); thread.start(); b1.setEnabled(false); b2.setEnabled(true); b3.setEnabled(true); out.writeUTF(nickname+说:在干嘛呢); catch(IOException e) e . printStackTrace(); private void b2Button()/发送 try out.writeUTF(nickname+说:+l2.getText(); textArea.append(nickname+说:+l2.getText()+n); l1.setTe
22、xt(); catch (IOException e) e.printStackTrace(); private void b3Button()/离线 try out.writeUTF(bye); b2.setEnabled(false); b3.setEnabled(false); textArea.append(连接断开!); socketClosing(); catch (IOException ioe) ioe.printStackTrace(); public void run() System.out.println(线程启动); String i=; while(true) tr
23、y i=in.readUTF(); if(i.equals(bye) b2.setEnabled(false); b3.setEnabled(false); textArea.append(连接断开!); socketClosing(); break; else textArea.append(i+n); catch (IOException ex) socketClosing(); System.out.println(有异常,连接中断!); break; System.out.println(线程中断!); private void socketClosing() try in.close
24、(); out.close(); socket.close(); catch (IOException ex) System.out.println(关闭socket和流时,发生异常); public static void main(String args) new 客户端(); 服务器代码如下:package 聊天系统;import java.awt.BorderLayout;import java.awt.Color;import java.awt.Font;import java.awt.GridLayout;import java.awt.event.ActionEvent;impo
25、rt java.awt.event.ActionListener;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import .ServerSocket;import .Socket;import java.util.logging.Level;import java.util.logging.Logger;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel
26、;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.JTextField;public class 服务端 extends JFrame implements ActionListener, Runnable /shiyoude duixiang private JFrame app; private JPanel a1,a2,a3,a4,a5; private JLabel 输入昵称; private JTextField l1,l2
27、; private JTextArea textArea; private JButton b1,b2,b3; /shou bao hu de protected Socket socket; protected Thread thread; protected DataInputStream a; protected DataOutputStream out; protected String nickname; public 服务端() app=new JFrame(服务器); app.setSize(400,300); app.setLocation(500,500); app.setL
28、ayout(new BorderLayout(); app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); a1=new JPanel(); a1.setBackground(Color.yellow); a2=new JPanel(); a3=new JPanel(); a4=new JPanel(); a4.setBackground(Color.red); a5=new JPanel(); 输入昵称=new JLabel(输入昵称); 输入昵称.setFont(new Font(宋体,Font.PLAIN,16); 输入昵称.setFore
29、ground(Color.yellow); l1=new JTextField(12); b1=new JButton(确定); b1.setFont(new Font(宋体,Font.PLAIN,16); b1.setForeground(Color.red); b1.addActionListener(this); a1.add(输入昵称); a1.add(l1); a1.add(b1); textArea=new JTextArea(); textArea.setLineWrap(true); textArea.setWrapStyleWord(true); textArea.setFo
30、nt(new Font(幼圆,Font.PLAIN,16); textArea.setForeground(Color.red); l2=new JTextField(20); a4.add(l2); b2=new JButton(发送); b2.setFont(new Font(宋体,Font.PLAIN,16); b2.setForeground(Color.red);/yanshe b2.addActionListener(this); b2.setEnabled(false); a4.add(b2); b3=new JButton(离线); b3.setFont(new Font(宋体
31、,Font.PLAIN,16); b3.setForeground(Color.red); b3.addActionListener(this); b3.setEnabled(false); a4.add(b3); app.add(a1,BorderLayout.NORTH); app.add(new JScrollPane(textArea),BorderLayout.CENTER); app.add(a4,BorderLayout.SOUTH); app.setVisible(true); public static void main(String args) new 服务端(); Override public void actionPerformed(ActionEvent e) if(e.getSource()=b1) b1Button(); if(e.getSource()=b2) b2Button(); if(e.getSource()=b3) b3Button();
限制150内