Java QQ聊天界面实验报告
- 格式:doc
- 大小:154.00 KB
- 文档页数:9
实验报告实验课程:Java实验报告项目名称:QQ聊天程序学生姓名:学号:专业班级:2018年 4 月 27 日目录一、实验内容 (1)二、问题描述 (1)三、项目功能 (1)四、项目分析 (1)五、项目设计 (2)六、系统实现 (3)七、总结 (15)一、实验内容根据本课程设计的实践及其前后的准备与总结,复习、领会、巩固和运用课堂上所学的Java语言知识和MySQL数据库,设计一个QQ聊天程序。
二、问题描述1.解决程序窗口的显示和界面设计问题2.解决提取数据库信息的问题3.解决程序按钮功能的实现问题4.解决好友的添加的问题5.解决与好友聊天的问题三、项目功能主要项目功能:1.数据库的设计2.数据库的增删改查从鼠标和键盘监听a.键盘输入账号,密码和聊天内容b.鼠标移动到登陆按钮,点击触发用户登陆c.鼠标移动到取消按钮,点击触发取消登陆d.鼠标移动到好友栏,点击触发聊天界面3.多线程设计a.main函数内while(true)循环重复调用b.main 函数内通过创建构造器来显示登录界面四、项目分析结合问题描述以及项目功能的介绍,分析如下:1.主界面,程序运行界面的设计如下五、 项目设计主窗体项目设计如下流程图所示:流程图六、系统实现1. package com.zt.view;import java.awt.Color;import java.awt.GridLayout;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.DataInputStream;import java.io.DataOutputStream;import .InetAddress;import .Socket;import .UnknownHostException;import javax.swing.ImageIcon;import javax.swing.JButton;import javax.swing.JCheckBox;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JPasswordField;import javax.swing.JTabbedPane;import javax.swing.JTextField;public class ClientLoginView extends JFrame implements ActionListener{ //大布局JPanel jp1; //北部JPanel jp2; //中间JPanel jp3; //南部//选项卡JTabbedPane jtb;JPanel jtb_jp1,jtb_jp2,jtb_jp3;JLabel jtb_jp1_lb1,jtb_jp1_lb2,jtb_jp1_lb3,jtb_jp1_lb4;JTextField jtb_jp1_jt;JPasswordField jtb_jp1_jpf;JButton jtb_jp1_jb;JCheckBox jtb_jp1_jc1,jtb_jp1_jc2;JButton jp3_jb1,jp3_jb2,jp3_jb3;public ClientLoginView(){//中间jtb=new JTabbedPane();jtb_jp1=new JPanel(new GridLayout(3,3));jtb_jp1_lb1=new JLabel("QQ号码",JLabel.CENTER);jtb_jp1_lb2=new JLabel("QQ密码",JLabel.CENTER);jtb_jp1_lb3=new JLabel("忘记密码");jtb_jp1_lb3.setForeground(Color.blue);jtb_jp1_lb4=new JLabel("申请密码保护");jtb_jp1_lb4.setForeground(Color.blue);jtb_jp1_jt=new JTextField();jtb_jp1_jpf=new JPasswordField();jtb_jp1_jb=new JButton(new ImageIcon("image/clear.gif"));jtb_jp1_jc1=new JCheckBox("隐身登陆");jtb_jp1_jc2=new JCheckBox("记住密码");jtb_jp1.add(jtb_jp1_lb1);jtb_jp1.add(jtb_jp1_jt);jtb_jp1.add(jtb_jp1_jb);jtb_jp1.add(jtb_jp1_lb2);jtb_jp1.add(jtb_jp1_jpf);jtb_jp1.add(jtb_jp1_lb3);jtb_jp1.add(jtb_jp1_jc1);jtb_jp1.add(jtb_jp1_jc2);jtb_jp1.add(jtb_jp1_lb4);jtb.add("QQ号码",jtb_jp1);jtb.add("手机号码",jtb_jp2);jtb.add("QQ邮箱",jtb_jp3);this.add(jtb,"Center");//北部的图片JLabel jtou =new JLabel(new ImageIcon("image/tou.gif"));jp1 = new JPanel();jp1.add(jtou);this.add(jp1,"North");//南部按钮jp3=new JPanel();jp3_jb1=new JButton(new ImageIcon("image/denglu.gif"));jp3_jb1.addActionListener(this);jp3_jb2=new JButton(new ImageIcon("image/quxiao.gif"));jp3_jb2.addActionListener(this);jp3_jb3=new JButton(new ImageIcon("image/xiangdao.gif"));jp3.add(jp3_jb1);jp3.add(jp3_jb2);jp3.add(jp3_jb3);this.add(jp3,"South");//设置窗口大小this.setSize(350,250);//设置窗口标题this.setTitle("QQ聊天程序");//设置窗口大小不变this.setVisible(false);//单击关闭按钮,程序退出后台线程this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//获取屏幕分辨率,界面居中对齐Toolkit kit=Toolkit.getDefaultToolkit();int Screenwidth=kit.getScreenSize().width;int Screenheight=kit.getScreenSize().height;this.setLocation((Screenwidth-350)/2,(Screenheight-250)/2);//把窗口设置成可见this.setVisible(true);}public static void main(String[] args){new ClientLoginView();}@Overridepublic void actionPerformed(ActionEvent e) {//获取操作对象Object obj=e.getSource();if(obj==jp3_jb1){//单击登入按钮String name =jtb_jp1_jt.getText().trim();String pass= jtb_jp1_jpf.getText().trim();login(name,pass);}else{if(obj==jp3_jb2){//单击取消按钮}}}public void login (String name,String pass){if(name.equals("")||pass.equals("")){JOptionPane.showMessageDialog(this, "账号或密码输入错误,请重新输入!");}else{try {String ip = InetAddress.getLocalHost().getHostAddress();Socket sc=new Socket(ip,8888);DataOutputStream dout=new DataOutputStream(sc.getOutputStream());dout.writeUTF(name+","+pass);//获取服务器端的反馈结果DataInputStream din =new DataInputStream(sc.getInputStream());String result=din.readUTF();if("error".equals(result)){JOptionPane.showMessageDialog(this, "账号或密码输入有误,请重新输入!");}else{this.setVisible(false);ClientFirendView fs =new ClientFirendView();fs.setVisible(true);}} catch (Exception e) {e.printStackTrace();} } } }2.package com.zt.view;import java.awt.BorderLayout;import java.awt.GridLayout;import java.awt.Toolkit;import javax.swing.ImageIcon;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JScrollPane;import erDao;import erDaoimpl;public class ClientFirendView extends JFrame{JButton jb1,jb2,jb3;JScrollPane jsp;JPanel jp,jp1,jp2;JLabel[] friends;public ClientFirendView(){jb1=new JButton("我的好友");jb2=new JButton("陌生人");jb3=new JButton("黑名单");jp=new JPanel(new BorderLayout()); //最大的面板jp1=new JPanel(new GridLayout(20,1,10,10)); //好友默认可放20个UserDao userDao=new UserDaoimpl();friends=new JLabel[20];for(int i=0;i<friends.length;i++){int num=i%12+1;friends[i]=new JLabel("好友"+(i+1),newImageIcon("image/"+num+".png"),JLabel.LEFT);jp1.add(friends[i]);}jsp=new JScrollPane(jp1); //中间我们的好友面板jp2=new JPanel(new GridLayout(2,1)); //陌生人,黑名单面板jp2.add(jb2);jp2.add(jb3);jp.add(jb1,"North");jp.add(jsp,"Center");jp.add(jb2,"South");this.add(jp);//设置窗口大小this.setSize(200,600);//设置窗口标题this.setTitle("好友界面");//设置窗口大小不变this.setVisible(false);//单击关闭按钮,程序退出后台线程this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//获取屏幕分辨率,界面居中对齐Toolkit kit=Toolkit.getDefaultToolkit();int Screenwidth=kit.getScreenSize().width;int Screenheight=kit.getScreenSize().height;this.setLocation((Screenwidth-200)/2,(Screenheight-600)/2);//把窗口设置成可见this.setVisible(true);}public static void main(String[] args){new ClientFirendView();}}3. package com.zt.view;import java.awt.Toolkit;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.JTextField;public class MessageView extends JFrame{JScrollPane jsp; //聊天内容区域JPanel jp2; //发送消息JTextArea jta; //文本域JTextField jtf;JButton jb;public MessageView(){jta=new JTextArea(9,20);jsp=new JScrollPane(jta);jp2=new JPanel();jtf=new JTextField(20);jb=new JButton("发送消息");jp2.add(jtf);jp2.add(jb);this.add(jsp,"North");this.add(jp2,"South");//设置窗口大小this.setSize(350,250);//设置窗口标题this.setTitle("QQ聊天界面");//设置窗口大小不变this.setVisible(false);//单击关闭按钮,程序退出后台线程this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//获取屏幕分辨率,界面居中对齐Toolkit kit=Toolkit.getDefaultToolkit();int Screenwidth=kit.getScreenSize().width;int Screenheight=kit.getScreenSize().height;this.setLocation((Screenwidth-350)/2,(Screenheight-250)/2);//把窗口设置成可见this.setVisible(true);}public static void main(String[] args){new MessageView();}}4.package com.zt.dao;import java.util.List;import er;public interface UserDao {public User login(String name,String pass);public List<User> findUserFirends(String name);}5. package com.zt.db;import java.sql.*;public class DButils {private static final String url="jdbc:mysql://localhost:3306/qqdb";private static final String user="root";private static final String password="root";public static Connection getConnection(){Connection conn=null;try {//加载驱动类Class.forName("com.mysql.jdbc.Driver");//建立连接conn= DriverManager.getConnection(url, user, password);} catch (Exception e) {// TODO 自动生成的 catch 块e.printStackTrace();}return conn;}public static ResultSet getQueryResult(String sql){ResultSet rs=null;try {Connection conn =DButils.getConnection();Statement stmt=conn.createStatement();rs=stmt.executeQuery(sql);} catch (SQLException e) {// TODO 自动生成的 catch 块e.printStackTrace();}return rs;}public static ResultSet getQueryResult(String sql,Object[] objs){ ResultSet rs=null;try {Connection conn =DButils.getConnection();PreparedStatement pstmt= conn.prepareStatement(sql);for(int i=0;i<objs.length;i++){pstmt.setObject(i+1,objs[i]);}rs=pstmt.executeQuery();} catch (SQLException e) {// TODO 自动生成的 catch 块e.printStackTrace();}return rs;}public static Boolean executeSql(String sql,Object[] params){ boolean result = false;try {Connection conn =DButils.getConnection();PreparedStatement pstmt= conn.prepareStatement(sql);for(int i=0;i<params.length;i++){pstmt.setObject(i+1,params[i]);}int n=pstmt.executeUpdate();if(n>0){result=true;}} catch (SQLException e) {// TODO 自动生成的 catch 块e.printStackTrace();}return result;}}6.package com.zt.db;import java.sql.ResultSet;import java.util.ArrayList;import java.util.List;import erDao;import com.zt.db.DButils;import er;public class UserDaoimpl implements UserDao{public User login(String name, String pass){User user=null;try{String sql="select * from t_user where name=? and pass=?" ;Object[] params={name,pass};ResultSet rs=DButils.getQueryResult(sql, params);if(rs.next()){user=new User();user.setId(rs.getInt("id"));user.setName(rs.getString("name"));user.setNickname(rs.getString("nickName"));user.setPhoto(rs.getString("photo"));user.setSex(rs.getString("sex"));}}catch(Exception e){e.printStackTrace();}return user;}public List<User> findUserFriends(String name) {List<User> userList=new ArrayList<User>();String sql="select * from t_user where name in (select friendName from t_userfriends where userName=? )";Object[] params={name};try{ResultSet rs=DButils.getQueryResult(sql, params);while(rs.next()){User user=new User();user.setId(rs.getInt("id"));user.setName(rs.getString("name"));user.setNickname(rs.getString("nickName"));user.setPhoto(rs.getString("photo"));user.setSex(rs.getString("sex"));userList.add(user);}}catch(Exception e){e.printStackTrace();}System.out.println("-----------------------"+userList.size());return userList;}@Overridepublic List<User> findUserFirends(String name) {return null;}}7.package com.zt.po;public class User {private int id;private String name;private String pass;private String nickName;private String sex;private String photo;private String status;public void setId(int int1) {}public void setName(String string) {}public void setNickname(String string) {}public void setPhoto(String string) {}public void setSex(String string) {}}8. package com.zt.service;import .*;public class Test {public static void main(String[] args){try {String ip = InetAddress.getLocalHost().getHostAddress();} catch (UnknownHostException e) {e.printStackTrace();}}}9.package com.zt.service;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import .ServerSocket;import .Socket;import erDao;import erDaoimpl;import er;/** 用户注册登路的socket的服务器端*/public class UserLoginService {private ServerSocket userServerSocket;public static void main(String[] args){try {ServerSocket userServerSocket=new ServerSocket(8888);Socket client=userServerSocket.accept();while(true){DataInputStream din=new DataInputStream(client.getInputStream());String info =din.readUTF();String infos[]=info.split(",");UserDao userDao=new UserDaoimpl();User user=userDao.login(infos[0], infos[1]);DataOutputStream dout = new DataOutputStream(client.getOutputStream());if(user==null){dout.writeUTF("error");}else{dout.writeUTF("success");}}} catch (IOException e) {e.printStackTrace();}}}七、总结通过这次大作业,我更加清晰的认识到学海无涯,还有很多东西等待我去发掘。
计算机网络课程设计报告设计选题网络聊天室姓名马继鸣学号 0909090630完成时间 2012-1-12 一、需求分析聊天工具大多数由客户端程序和服务器程序外加服务器端,本程序采用客户机/服务器架构模式。
通过Java提供的Socket类来连接客户机和服务器并使客户机和服务器之间相互通信,由于聊天是多点对多点的而Java提供的多线程功能。
用多线程可完成多点对多点的聊天。
主要有两个应用程序,分别为服务器程序和客户端程序。
服务器应用程序主要用于消息转发,以及向所有用户发送系统消息等;客户端应用程序主要用于客户聊天记录的显示和信息输入。
采用Client/Server(C/S)体系结构,即客户机/服务器体系结构。
聊天服务器专门用于监控用户状态和转发消息,客户端负责接收消息的用户序列和消息文本发送到服务器。
该聊天系统实现群聊,用户登陆,退出聊天系统等功能。
二. 设计1.设计思想:课程设计中利用JAVA实现基于C/S模式的聊天程序。
聊天室共分为服务器端和客户端两部分,服务器端程序主要负责侦听客户发来的消息,客户端登录到服务器端才可以实现正常的聊天功能。
2.功能设计(1)服务器端的主要功能如下。
在特定端口上进行侦听,等待客户端连接。
用户可以配置服务端的侦听端口,默认端口为10000.当停止服务时,断开所有用户连接。
(2)客户端的主要功能如下。
连接到已经开启聊天服务的服务端。
当服务器端开启的话,用户可以随时登录与注销。
用户可以向所有人发送消息。
3.详细设计聊天室服务器端设计聊天室服务器中主要的功能文件的功能如下:MyButLis.java主要用于添加事件侦听和动作处理,具体是服务器按钮中的“终止”“发送”的处理。
public class MyButLis implements ActionListenerprivate MyServe server;private JTextField filed1;public void actionPerformed(ActionEvent e)MyChatSet.java服务器的线程队列,运行的方法,新增一个用户,则增加一个线程,并可以返回应答消息,给其余用户发送上下线信息,发送聊天信息(群聊私聊虽然已写,但是不知为何没有实现),发送用户列表。
java实训聊天系统报告总结一、项目背景随着互联网的快速发展,人们在日常生活和工作中越来越依赖于网络。
在线聊天成为了人们日常交流的重要方式。
为了满足不同用户对聊天系统的需求,本次实训项目选择开发一款功能完善的Java聊天系统。
二、项目目标1. 设计一款用户界面友好,操作简单的聊天系统。
2. 实现用户的注册和登录功能,保障系统的安全性。
3. 提供实时聊天功能,用户可以通过系统进行文字、图片的交流。
4. 支持多人群聊、私聊的功能。
5. 实现聊天记录的存储和查看。
三、系统架构1. 前端设计本次项目的前端开发使用Java的Swing库进行界面设计,保障用户操作的友好性和系统的易用性。
2. 后端开发后端使用Java语言进行开发,使用Socket实现实时通讯功能,使用MySQL进行用户数据的存储和管理。
四、功能实现1. 用户注册和登录功能用户可以通过系统注册新账号,并使用已有账号进行登录。
系统会对用户输入的信息进行验证,保障系统的安全性。
2. 实时聊天用户可以通过系统进行实时的文字、图片交流,确保用户之间的沟通顺畅和效率。
3. 多人群聊、私聊功能系统支持多人同时进行群聊,同时也支持用户进行私聊。
用户可以根据自己的需求选择不同的聊天方式。
4. 聊天记录存储和查看系统会将用户的聊天记录进行存储,并提供查看功能,用户可以随时查看自己的聊天记录。
3. 数据库设计设计数据库存储用户的基本信息、聊天记录等数据,确保数据的安全性和完整性。
4. 功能实现实现用户注册、登录、实时聊天、群聊、私聊等功能,并保障系统的稳定性和安全性。
六、总结本次实训项目成功设计并开发了一款功能完善的Java聊天系统,满足了用户对聊天系统的基本需求。
通过本次项目的实训,加深了我们对Java语言、数据库设计和网络通讯的理解和实践能力,为我们以后的开发工作积累了丰富的经验。
七、展望在今后的工作中,我们还可以进一步完善系统功能,例如增加语音、视频通话功能,优化系统的性能和用户体验,使系统更加满足用户的需求。
java聊天程序实验报告Java聊天程序实验报告一、引言随着互联网的快速发展,人们之间的交流方式也在不断改变。
聊天程序作为一种实时通信工具,已经成为人们日常生活中必不可少的一部分。
本实验旨在通过使用Java编程语言,设计并实现一个简单的聊天程序,以探索实时通信的原理和机制。
二、实验目的1. 学习和掌握Java编程语言的基本语法和面向对象的编程思想;2. 了解Socket编程的基本原理和实现方式;3. 设计并实现一个简单的聊天程序,实现用户之间的实时通信。
三、实验过程1. 确定程序的基本功能和界面设计。
聊天程序需要实现用户之间的即时通信,并提供简单的用户界面用于输入和显示聊天内容。
2. 使用Java编程语言,创建一个服务器端程序和多个客户端程序。
服务器端程序负责接收和转发客户端的消息,客户端程序负责发送和接收消息。
3. 使用Socket编程,建立服务器和客户端之间的连接。
服务器端程序监听指定的端口,等待客户端的连接请求;客户端程序通过指定服务器的IP地址和端口号,连接到服务器。
4. 实现消息的发送和接收功能。
客户端程序可以通过输入框输入消息,并通过Socket将消息发送到服务器;服务器端程序接收到消息后,将消息转发给其他客户端。
5. 实现消息的显示功能。
客户端程序通过界面显示接收到的消息,并可以将消息保存到本地。
四、实验结果经过实验,我们成功地实现了一个简单的Java聊天程序。
用户可以通过输入框输入消息,并通过服务器端进行消息的转发。
其他客户端可以接收到转发的消息,并在界面上进行显示。
同时,我们还实现了消息的保存功能,用户可以将接收到的消息保存到本地文件中。
五、实验总结通过本次实验,我们深入了解了Java编程语言的基本语法和面向对象的编程思想。
同时,我们也学习了Socket编程的原理和实现方式。
通过实践,我们掌握了如何使用Java编写一个简单的聊天程序,实现用户之间的实时通信。
然而,本实验只是一个简单的聊天程序,还有很多可以改进和扩展的地方。
第1篇一、实训背景随着互联网技术的飞速发展,聊天程序作为一种重要的网络应用,已经深入到人们的日常生活和工作中。
为了提高学生的实践能力,培养适应社会需求的技术人才,我们开展了本次聊天程序实训。
本次实训旨在通过实际编程,让学生掌握聊天程序的设计与实现,提高学生的编程能力和团队协作能力。
二、实训目标1. 理解聊天程序的基本原理和设计思路。
2. 掌握常用的编程语言和开发工具。
3. 能够独立设计和实现简单的聊天程序。
4. 培养良好的编程习惯和团队协作精神。
三、实训内容本次实训主要分为以下几个阶段:1. 需求分析在实训开始前,我们对聊天程序的需求进行了详细的分析。
主要包括以下功能:- 用户注册与登录- 文字消息发送与接收- 图片消息发送与接收- 多人聊天功能- 消息记录查看2. 系统设计根据需求分析,我们设计了以下系统架构:- 客户端:负责用户界面展示、消息发送与接收。
- 服务器端:负责用户管理、消息转发、数据存储等。
3. 技术选型在本次实训中,我们选择了以下技术:- 编程语言:Java- 开发工具:Eclipse- 数据库:MySQL- 消息传递:WebSocket4. 系统实现4.1 客户端实现客户端主要实现以下功能:- 用户注册与登录界面- 消息发送与接收界面- 图片消息发送与接收界面- 多人聊天界面4.2 服务器端实现服务器端主要实现以下功能:- 用户管理:包括用户注册、登录、信息修改等。
- 消息转发:负责将客户端发送的消息转发给对应的接收者。
- 数据存储:将用户信息和聊天记录存储在数据库中。
5. 系统测试在系统实现完成后,我们对聊天程序进行了详细的测试,包括功能测试、性能测试和安全性测试。
测试结果表明,聊天程序能够稳定运行,满足需求。
四、实训成果通过本次实训,我们取得了以下成果:1. 学生掌握了聊天程序的基本原理和设计思路。
2. 学生熟练掌握了Java编程语言和Eclipse开发工具。
3. 学生独立设计和实现了简单的聊天程序。
java聊天程序实验报告《Java聊天程序实验报告》摘要:本实验报告旨在介绍和分析我们设计并实现的基于Java的聊天程序。
通过该程序,用户可以在网络上进行实时的文字交流,实现了简单的聊天功能。
我们将介绍程序的设计思路、实现过程、功能特点以及存在的问题和改进方向。
一、设计思路我们的聊天程序采用了客户端-服务器架构,通过Socket通信实现了用户之间的数据传输。
客户端和服务器端分别使用了Java的Socket和ServerSocket类来建立连接和进行通信。
客户端可以向服务器发送消息并接收其他用户的消息,服务器负责转发消息给其他在线用户。
二、实现过程在实现过程中,我们首先设计了程序的基本框架,包括客户端和服务器端的代码结构。
然后,我们使用Socket和ServerSocket类来建立连接和进行数据传输。
客户端和服务器端分别使用了多线程来处理连接请求和消息转发,以保证程序的稳定性和并发性。
三、功能特点我们的聊天程序具有以下功能特点:1. 用户注册和登录:用户可以注册新账号并登录到服务器,实现了用户身份的识别和管理。
2. 实时聊天:用户可以在聊天室中实时发送和接收消息,与其他在线用户进行文字交流。
3. 离线消息:服务器可以保存用户的离线消息,并在用户上线时进行推送,确保用户不会错过重要消息。
四、存在的问题和改进方向在实验过程中,我们发现了一些问题和改进方向:1. 安全性问题:目前我们的程序还没有实现用户身份验证和消息加密等安全机制,存在一定的安全风险。
2. 用户体验:目前用户界面较为简陋,可以进一步优化界面设计和交互体验。
3. 功能扩展:可以考虑增加文件传输、群聊等功能,丰富程序的功能特点。
结论:通过本次实验,我们成功设计并实现了基于Java的聊天程序,实现了简单的聊天功能。
在未来,我们将继续改进程序,提高安全性和用户体验,丰富功能特点,使程序更加完善和实用。
实验报告(五)课程名称:互联网程序设计年级:2017级实验日期:姓名:学号:班级:教师评语(成绩):实验名称:实验五 QQ聊天项目拓展(4学时)DatagramPacket backPacket=new DatagramPacket(buf,buf.length,packet.getAddress(),packet.getPort());//向登录用户发送的报文serverSocket.send(backPacket); //发送}else { //登录成功backMsg.setType("M_SUCCESS");byte[] buf=Translate.ObjectToByte(backMsg);DatagramPacket backPacket=new DatagramPacket(buf,buf.length,packet.getAddress(),packet.getPort());//向登录用户发送的报文serverSocket.send(backPacket); //发送User user=new User();user.setUserId(userId); //用户名user.setPacket(packet); //保存收到的报文userList.add(user); //将新用户加入用户列表//更新服务器聊天室大厅parentUI.txtArea.append(userId+" 登录!\n");//向所有其他在线用户发送M_LOGIN消息,向新登录者发送整个用户列表for (int i=0;i<userList.size();i++) { //遍历整个用户列表//向其他在线用户发送M_LOGIN消息if(!userId.equalsIgnoreCase(userList.get(i).getUserId())){DatagramPacketoldPacket=userList.get(i).getPacket();DatagramPacket newPacket=new DatagramPacket(data,data.length,oldPacket.getAddress(),oldPacket.getPort());//向其他用户发送的报文serverSocket.send(newPacket); //发送}//end if//向当前用户回送M_ACK消息,将第i个用户加入当前用户的用户列表Message other=new Message();other.setUserId(userList.get(i).getUserId());other.setType("M_ACK");byte[] buffer=Translate.ObjectToByte(other);DatagramPacket newPacket=new DatagramPacket(buffer,buffer.length,packet.getAddress(),packet.getPort());serverSocket.send(newPacket);}//end for}//end if}else if (msg.getType().equalsIgnoreCase("M_MSG")) { //是M_MSG消息//更新显示parentUI.txtArea.append(userId+" 说:"+msg.getText()+"\n");//转发消息for (int i=0;i<userList.size();i++) { //遍历用户DatagramPacket oldPacket=userList.get(i).getPacket();DatagramPacket newPacket=new DatagramPacket(data,data.length,oldPacket.getAddress(),oldPacket.getPort());serverSocket.send(newPacket); //发送}}else if (msg.getType().equalsIgnoreCase("M_QUIT")) { //是M_QUIT消息//更新显示parentUI.txtArea.append(userId+" 下线!\n");//删除用户for(int i=0;i<userList.size();i++) {if (userList.get(i).getUserId().equals(userId)) {userList.remove(i);break;}}//end for//向其他用户转发下线消息for (int i=0;i<userList.size();i++) {DatagramPacket oldPacket=userList.get(i).getPacket();DatagramPacket newPacket=new DatagramPacket(data,data.length,oldPacket.getAddress(),oldPacket.getPort());serverSocket.send(newPacket);}//end for}//end if} catch (IOException | NumberFormatException ex) { }}//end while}//end run}//end class实验结果:五、总结对上机实践结果进行分析,问题回答,上机的心得体会及改进意见。
综合实验二聊天软件一、实验目的掌握编写图形界面、socket、多线程、数据库的编程,包括文本框、标签、文本区、按钮、ServerSocket、Socket、Runnable接口的用法。
二、实验环境PC系列微机,Windows XP。
Eclipse、JDK150或更高版本。
三、实验内容利用8个学时的时间完成编写一个简单的类似QQ的聊天软件,要求:1、具有登陆界面,包括服务器IP(或服务器名)、用户名、密码。
如图所示:登录:在数据库服务器上验证用户名和密码,如果匹配就进入QQ聊天主界面,否则提示不能登录。
取消:退出即可。
注册:进入用户注册界面。
2、注册界面,可以让第一次使用的用户注册,即给自己在服务器上注册一个用户名、密码、自己所使用的机器IP、自己的端口号,如图所示:注册:首先验证密码和确认密码是否一致,如果不一致,则提示,否则,把输入的信息记录到数据库中,如果用户名重复也要提示。
3、聊天主界面登陆成功后就进入本届面,界面如下:界面设计类似简单的QQ界面,在上面显示“好友列表”四个字,然后下面显示自己的好友名单,名单可以用多个JLabel控件(JLabel中添加ImageIcon)显示。
最下边可以显示“欢迎您:***”。
好友要求用不同的图标显示在线和不在线的状态。
双击在线的好友名字可以打开聊天窗口,而双击不在线的好友不动(即不开启聊天窗口)。
4、聊天窗口当在聊天主界面双击某个在线好友后即开启本窗口,同时好友的机器上也同步打开本窗口。
界面如下:上边显示“您正在与*** 交流”。
中间是大的文本区,显示聊天的内容。
下边显示小的单行文本框,用于输入聊天内容和发送和关闭按钮。
发送:当单击发送按钮时,将输入在单行文本框中的内容显示在上边的文本区中,并同时发送到对方。
关闭:关闭聊天窗口,同时对方会得到提示,然后也关闭聊天窗口,从而结束对话。
5、做的快的同学,可以考虑增加功能,比如查找好友、添加好友、动态刷新好友列表功能等。
java实训聊天系统报告总结一、引言随着互联网的发展,即时通讯成为了人们日常生活中必不可少的一部分。
而Java语言作为当前最流行的程序语言之一,其庞大的社区和强大的跨平台特性让其成为了开发即时通讯软件的理想选择。
针对这一需求,我们进行了Java实训项目,完成了一个基于Java 语言的聊天系统。
本文主要对该聊天系统进行总结和说明。
二、项目简介聊天系统是一款基于Java语言的即时通讯软件,它的实现原理是使用Java Socket编程实现客户端和服务器之间的通信。
用户可以通过该聊天系统与其他任何使用该系统的用户进行即时通信,并进行聊天记录保存、文件传输等功能。
三、系统框架该聊天系统采用B/S架构,客户端使用JavaFx实现,服务器端使用Java网络编程实现。
其框架如下所示:客户端:JavaFx + Java网络编程服务器端:Java网络编程四、模块介绍1. 用户模块:用户模块是整个聊天系统的核心模块,包含用户登陆、注册、消息接收等功能。
服务器端需要对用户进行身份验证,并将用户信息存储到数据库中。
而客户端需要通过Socket连接服务器,与其他用户进行通信。
2. 消息模块:消息模块包含聊天记录、消息发送、群聊、私聊等功能。
客户端需要记录聊天记录,并将消息发送到服务器,缓存在本地并展示在用户聊天界面上。
而服务器端需要接收消息,并进行下发给对应用户的操作。
3. 文件传输模块:文件传输模块可以让用户在聊天中传输文件,包含文件选择、上传下载等功能。
该模块是服务于消息模块的,服务器端需要对文件进行存储和传输管理,客户端需要实现文件的选择和上传下载功能。
五、项目结构1. 服务器端服务器端的主要目的是接收客户端的请求并进行处理,其结构如下所示:1、UserServer:用户身份验证。
2、MsgServer:聊天记录的发送和接收处理。
3、FileServer:文件传输功能的实现。
4、DBUtils:数据库操作工具类。
2. 客户端客户端需要实现用户登录、注册、聊天、文件传输等功能,其结构如下所示:1、LoginController:登录页面的相关操作,包含用户登录和注册。
Java语言实验报告实验环境:Eclipse 6.0环境实验目的:1、了解文件和流的概念,字节的输入输出,掌握文件的操作;2、了解网络通信,掌握TCP Socket通信和TCP Socket的工作方式。
实验原理:1、采用TCP Socket通信是实现的点对点聊天,ChatServer类提供服务端的TCP的链接服务,SingleTalkClient类与SingleTalkServer类实现客户端与服务端的TCP Socket通信以及两者的图形界面;2、Socket对象用于在服务端和客户端的TCP链接之间进行发送和接受的双向数据通信,从Socket对象中能够获得字节输入流和字节输出流。
实验内容:实现一对一的聊天程序1、分析需求,确定程序主要框架、所需要的编程语言、以及开发环境;2、研究一对一聊天程序的原理及主要功能;3、根据实验要求编写聊天界面及聊天程序;4、完成编码,进行测试;5、完成测试,完善代码。
实验步骤:一、创建客户端界面package jiemian;import java.io.*;import .*;import javax.swing.*;import java.awt.event.*;import java.awt.*;/*** 用户界面SingleTalkClient*/public class SingleTalkClient extends JFrame {private static final long serialVersionUID = 3774711323397279594L;JTextArea mainArea;JTextArea sendArea;ChatClient client;JTextField ipArea;JTextField nameArea;JButton buttonLink;public void setClient(ChatClient client) {this.client = client;}public SingleTalkClient() {super("用户");Container contain = getContentPane();contain.setLayout(new BorderLayout());mainArea = new JTextArea();JScrollPane mainAreaP = new JScrollPane(mainArea);// 为文本区添加滚动条JPanel panel = new JPanel();panel.setLayout(new FlowLayout());sendArea = new JTextArea(3, 30);JButton sendBtn = new JButton("发送");JButton leave = new JButton("离线");JButton sentMessage = new JButton("发送");panel.add(leave);sendBtn.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent ae) {client.sendMsg(sendArea.getText());mainArea.append("【用户】" + sendArea.getText() + "\n");sendArea.setText("");}});JPanel ipPanel = new JPanel();ipPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 10));ipPanel.add(new JLabel("服务器:"));JPanel namePanel = new JPanel();namePanel.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 10));namePanel.add(new JLabel("昵称:"));nameArea = new JTextField(4);nameArea.setText(" ");namePanel.add(nameArea);ipArea = new JTextField(12);ipArea.setText("127.0.0.1");ipPanel.add(ipArea);buttonLink = new JButton("连接");ipPanel.add(buttonLink);buttonLink.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent ae) {client = new ChatClient(ipArea.getText(), 8888, SingleTalkClient.this);// 创建socket对象SingleTalkClient.this.setClient(client);}});panel.add(sendBtn, BorderLayout.EAST);panel.add(sendArea, BorderLayout.CENTER);contain.add(ipPanel, BorderLayout.NORTH);contain.add(namePanel, BorderLayout.WEST);contain.add(mainAreaP, BorderLayout.CENTER);contain.add(panel, BorderLayout.SOUTH);setSize(500, 300);setVisible(true);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}public static void main(String[] args) {SingleTalkClient ui = new SingleTalkClient();}}/*** 通讯类ChatClient负责守候数据到来*/class ChatClient extends Thread {Socket server;// 对象server,用来处理与服务BufferedReader in;// 声明输入流缓冲区,用于存储服务器发来的信息PrintWriter out;// 声明打印输出流,用于信息的发送SingleTalkClient ui;public ChatClient(String ip, int port, SingleTalkClient ui) {// 初始化ChatClient类this.ui = ui;try {server = new Socket(ip, port); // 创建server, 用服务器ip和端口作参数System.out.println("已顺利联接到服务器。
");out = new PrintWriter(server.getOutputStream(), true);in = new BufferedReader(newInputStreamReader(server.getInputStream()));} catch (Exception e) {System.out.println(e);}start();}public void run() { // 用于监听服务器端发送来的信息String messaga = "";while (true) {try {messaga = in.readLine();// 从缓冲区读入一行字符存于message } catch (SocketException ex) {System.out.println(ex);break;} catch (Exception ex) {System.out.println(ex);}if (messaga != null && messaga.trim() != "") {// 若message信息不为空System.out.println(">>" + messaga);ui.mainArea.append(messaga + "\n");// 把message信息添加到客户端的文本区域内}}}public void sendMsg(String msg) {// 用于发送信息try {out.println("【用户】" + msg);} catch (Exception e) {System.out.println(e);}}}二、创建服务端界面package jiemian;import java.io.*;import .*;import javax.swing.*;import java.awt.event.*;import java.awt.*;/*** 服务端界面SingleTalkServer*/public class SingleTalkServer extends JFrame {private static final long serialVersionUID = 1L;JTextArea mainArea;JTextArea sendArea;JTextField indexArea;ServerCom server;public void setServer(ServerCom server) {this.server = server;}public SingleTalkServer() {super("服务器端");Container contain = getContentPane();contain.setLayout(new BorderLayout());mainArea = new JTextArea();JScrollPane mainAreaP = new JScrollPane(mainArea);JPanel panel = new JPanel();panel.setLayout(new BorderLayout());sendArea = new JTextArea(3, 8);JButton sendBtn = new JButton("发送");sendBtn.addActionListener(new ActionListener()// 注册动作监听器{public void actionPerformed(ActionEvent ae) {server.sendMsg(sendArea.getText());// 把信息传递到客户端mainArea.append("【服务器】" + sendArea.getText() + "\n");// 把信息显示在服务器的聊天记录区域indexArea.setText("0");}});JPanel tmpPanel = new JPanel();indexArea = new JTextField(2);indexArea.setText("0");tmpPanel.add(sendBtn);tmpPanel.add(indexArea);panel.add(tmpPanel, BorderLayout.EAST);panel.add(sendArea, BorderLayout.CENTER);contain.add(mainAreaP, BorderLayout.CENTER);contain.add(panel, BorderLayout.SOUTH);setSize(500, 300);setVisible(true);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}public static void main(String[] args) {SingleTalkServer ui = new SingleTalkServer();ServerCom server = new ServerCom(ui);// 创建并启动网络通讯线程,准备接受客户端数据包}}/*** 通讯类ServerCom负责守候数据到来*/class ServerCom extends Thread// 网络通讯类{Socket client;ServerSocket soc;BufferedReader in;PrintWriter out;SingleTalkServer ui;// ChatServer server;public ServerCom(SingleTalkServer ui) { // 初始化ServerCom类this.ui = ui;ui.setServer(this);try {soc = new ServerSocket(8888); // 开设服务器端口8888System.out.println("启动服务器成功,等待端口号:8888");client = soc.accept();// 当客户机请求连接时,创建一条链接System.out.println("连接成功!来自" + client.toString());in = new BufferedReader(new InputStreamReader(client.getInputStream()));out = new PrintWriter(client.getOutputStream(), true);} catch (Exception ex) {System.out.println(ex);}start();}public void run() {// 用于监听客户端发送来的信息String message = "";while (true) {try {message = in.readLine();// 从in对象上读数据信息} catch (SocketException ex) {System.out.println(ex);break;} catch (Exception ex) {System.out.println(ex);}if (message != null && message.trim() != "") {System.out.println(">>" + message);ui.mainArea.append(message + "\n");}}}public void sendMsg(String msg) {// 用于发送信息try {out.println("【服务器】" + msg);// 把信息写入输出流} catch (Exception e) {System.out.println(e);}}}运行结果:将IP地址改为另一个客户端的IP地址,启动两个客户端与服务端,当两个客户端成功链接服务器端后,就可以进行一对一的聊天了,两个客户都可以给对方发送消息,而且对方能收到。