java聊天室

时间:2024.5.4

//???§??

import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.Font;

import java.awt.GraphicsEnvironment;

import java.awt.Point;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener; import java.awt.event.ItemEvent;

import java.awt.event.ItemListener;

import java.awt.event.KeyEvent;

import java.awt.event.KeyListener;

import java.awt.event.WindowEvent;

import java.awt.event.WindowListener; import java.io.IOException;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.io.Serializable;

import java.net.Socket;

import java.net.UnknownHostException; import java.util.Vector;

import javax.swing.JButton;

import javax.swing.JCheckBox;

import javax.swing.JColorChooser;

import javax.swing.JComboBox;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JList;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JSplitPane;

import javax.swing.JTextArea;

import javax.swing.JTextField;

import javax.swing.JTextPane;

import javax.swing.SwingUtilities;

import javax.swing.text.BadLocationException; import javax.swing.text.Document;

import javax.swing.text.SimpleAttributeSet; import javax.swing.text.StyleConstants;

public class ChatRoom

{

public static void main(String[] args)

{

ChatRoomFrame f = new ChatRoomFrame();

f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true);

}

}

class ChatRoomFrame extends JFrame

{

public ChatRoomFrame()

{

setTitle("????");

setBounds(300, 200, 200, 250);

setResizable(false);

ChatRoomPanel p = new ChatRoomPanel(ChatRoomFrame.this); add(p);

}

}

class ChatRoomPanel extends JPanel

{

private JLabel lname, ladr, lcom;

private JTextField tname, tadr, tcom;

private JButton log, reset;

private ChatRoomFrame frame1;

private Socket socket;

public ChatRoomPanel(ChatRoomFrame f)

{

frame1 = f;

lname = new JLabel("ê?????");

ladr = new JLabel("???·??");

lcom = new JLabel("??????");

tname = new JTextField(10);

tadr = new JTextField("127.0.0.1");

tcom = new JTextField("10000");

log = new JButton("????");

reset = new JButton("????");

add(lname);

add(tname);

add(ladr);

add(tadr);

add(lcom);

add(tcom);

add(log);

add(reset);

log.addActionListener(new ActionListener()

{

public void actionPerformed(ActionEvent arg0)

{

if ("".equals(tname.getText().trim()))

{

JOptionPane.showMessageDialog(null,

"ê?????????????");

} else if ("".equals(tadr.getText().trim())

|| "".equals(tcom.getText().trim()))

{

JOptionPane.showMessageDialog(null,

"?????????·?ò??????");

} else

{

try

{

socket = new Socket(tadr.getText().trim(),Integer.parseInt(tcom.getText().trim()));

ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());

ChatInfo checkname = new ChatInfo(tname.getText().trim());

oos.writeObject(checkname);

ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());

MessageInfo checkmsg = (MessageInfo)ois.readObject();

if(checkmsg.isWhisper())

{

JOptionPane.showMessageDialog(null, checkmsg.getMsg());

}

else

{

frame1.setVisible(false);

ChatRoom1Frame f1 = new ChatRoom1Frame(tname, socket);

f1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

f1.setVisible(true);

}

} catch (NumberFormatException e)

{

e.printStackTrace();

} catch (UnknownHostException e)

{

e.printStackTrace();

} catch (IOException e)

{

e.printStackTrace();

} catch (ClassNotFoundException e)

{

e.printStackTrace();

}

}

}

});

reset.addActionListener(new ActionListener()

{

public void actionPerformed(ActionEvent e)

{

tname.setText("");

tname.requestFocus();

}

});

}

}

class ChatRoom1Frame extends JFrame

{

public ChatRoom1Frame(JTextField name, Socket socket)

{

setTitle("???ì??");

setBounds(200, 50, 850, 700);

ChatRoom1Panel p = new ChatRoom1Panel(ChatRoom1Frame.this, name,socket);

add(p);

}

}

class ChatRoom1Panel extends JSplitPane

{

private JTextArea msg;

private JTextPane pub, ind;

private JLabel lmsg, llist;

private JButton color, rename, send, close;

private JTextField newname;

private JCheckBox chatmode;

private JList list;

private JComboBox style, sendmode, size;

private Vector<String> namelist = new Vector<String>(); private boolean ctrl, enter;

private boolean whisper;

private String sname, netAddress;

private ChatRoom1Frame frame;

private Socket socket;

private JScrollPane sp1, sp2;

private ObjectOutputStream oos;

private ObjectInputStream ois;

private MessageInfo msginfo;

public ChatRoom1Panel(ChatRoom1Frame f, JTextField name, Socket socket)

{

sname = name.getText().trim();

frame = f;

this.socket = socket;

try

{

netAddress = socket.getInetAddress().toString();

ChatInfo info0 = new ChatInfo(sname, 0, false, null, null,

null,

false, netAddress);

oos = new ObjectOutputStream(socket.getOutputStream()); // ???????ó·????÷

oos.writeObject(info0);

} catch (UnknownHostException e)

{

e.printStackTrace();

} catch (IOException e)

{

e.printStackTrace();

}

setOrientation(JSplitPane.HORIZONTAL_SPLIT);

LeftPanel left = new LeftPanel();

RightPanel right = new RightPanel();

setLeftComponent(left);

setRightComponent(right);

setDividerLocation(610);

setDividerSize(5);

Connection con = new Connection(list);

con.start();

//

}

class LeftPanel extends JSplitPane

{

public LeftPanel()

{

setOrientation(JSplitPane.VERTICAL_SPLIT);

PubAndInd pai = new PubAndInd();

MsgAndTool mat = new MsgAndTool();

setDividerSize(5);

setDividerLocation(480);

setTopComponent(pai);

setBottomComponent(mat);

}

}

class RightPanel extends JPanel { public RightPanel() { BorderLayout bd = new BorderLayout(); setLayout(bd); llist = new JLabel(" ???§±í:"); list = new JList(namelist); JScrollPane sp = new JScrollPane(list); list.setVisibleRowCount(32); add(llist, "North"); add(sp, "South"); } } class PubAndInd extends JSplitPane { public PubAndInd() { setOrientation(JSplitPane.VERTICAL_SPLIT); setDividerSize(5); setDividerLocation(280); pub = new JTextPane(); ind = new JTextPane(); pub.setEditable(false); ind.setEditable(false); sp1 = new JScrollPane(pub); sp2 = new JScrollPane(ind); setTopComponent(sp1); setBottomComponent(sp2); } } class MsgAndTool extends JSplitPane { public MsgAndTool() { setOrientation(JSplitPane.VERTICAL_SPLIT);

setDividerSize(5); setDividerLocation(40); MsgPanel mp = new MsgPanel(); ToolPanel tp = new ToolPanel(); setTopComponent(tp); setBottomComponent(mp); } } class ToolPanel extends JPanel { public ToolPanel() { Vector<Integer> si = new Vector<Integer>(); for (int i = 0; i < 11; i++) { si.add(2 * i + 8); } setLayout(null); chatmode = new JCheckBox("????"); rename = new JButton("????:"); newname = new JTextField(6); newname.setText(sname); style = new JComboBox(GraphicsEnvironment .getLocalGraphicsEnvironment() .getAvailableFontFamilyNames()); style.setSelectedItem("????"); color = new JButton("????"); close = new JButton("????"); size = new JComboBox(si); size.setSelectedItem(12); chatmode.setBounds(5, 5, 60, 30); rename.setBounds(70, 5, 70, 30); newname.setBounds(150, 5, 120, 30); style.setBounds(280, 5, 120, 30); size.setBounds(405, 5, 40, 30); color.setBounds(445, 5, 70, 30); close.setBounds(520, 5, 70, 30); add(chatmode); add(rename);

add(newname);

add(style);

add(color);

add(close);

add(size);

color.addActionListener(new ActionListener()

{

public void actionPerformed(ActionEvent arg0) {

Color c = JColorChooser.showDialog(frame, "????????",

Color.black);

msg.setForeground(c);

}

});

style.addItemListener(new ItemListener()

{

public void itemStateChanged(ItemEvent e)

{

if (e.getStateChange() == ItemEvent.SELECTED) {

msg.setFont(new Font(

style.getSelectedItem().toString(), msg .getFont().getStyle(),

msg.getFont()

.getSize()));

}

}

});

size.addItemListener(new ItemListener()

{

public void itemStateChanged(ItemEvent e)

{

if (e.getStateChange() == ItemEvent.SELECTED) {

msg.setFont(new Font(msg.getFont().getFamily() .toString(), msg.getFont().getStyle(), (Integer) size.getSelectedItem()));

}

}

});

chatmode.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent arg0) {

if (chatmode.isSelected())

{

whisper = true;

} else

{

whisper = false;

}

}

});

close.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent arg0) {

try

{

ChatInfo info = new ChatInfo(sname, list .getSelectedIndex() - 1, whisper, msg.getText(), msg.getFont(), msg .getForeground(),

netAddress);

oos =

ObjectOutputStream(socket.getOutputStream());

// ???????ó·????÷

oos.writeObject(info);

// oos.close();

// ois.close();

} catch (IOException e)

{

e.printStackTrace();

}

System.exit(0);

}

});

true, new

frame.addWindowListener(new WindowListener()

{

public void windowActivated(WindowEvent arg0) {

}

public void windowClosed(WindowEvent arg0)

{

}

public void windowClosing(WindowEvent arg0)

{

close.doClick();

}

public void windowDeactivated(WindowEvent arg0) {

}

public void windowDeiconified(WindowEvent arg0) {

}

public void windowIconified(WindowEvent arg0) {

}

public void windowOpened(WindowEvent arg0)

{

}

});

rename.addActionListener(new ActionListener()

{

public void actionPerformed(ActionEvent arg0) {

if ("".equals(newname.getText().trim()))

{

JOptionPane.showConfirmDialog(ChatRoom1Panel.this,

"ê?????????????", "?·??", JOptionPane.CLOSED_OPTION,

JOptionPane.ERROR_MESSAGE, null);

} else

{

sname = newname.getText();

JOptionPane.showConfirmDialog(ChatRoom1Panel.this,

"??????????", "?·??", JOptionPane.CLOSED_OPTION,

JOptionPane.INFORMATION_MESSAGE, null); }

}

});

}

}

class MsgPanel extends JPanel

{

private Vector<String> v = new Vector<String>();

public MsgPanel()

{

setLayout(null);

lmsg = new JLabel("??????");

send = new JButton("·???");

msg = new JTextArea(4, 30);

v.add("°? Enter ·???");

v.add("°? Ctrl+Enter ·???");

sendmode = new JComboBox(v);

sendmode.setSelectedIndex(0);

lmsg.setBounds(5, 5, 40, 20);

msg.setBounds(45, 0, 450, 120);

send.setBounds(500, 10, 70, 30);

sendmode.setBounds(500, 60, 100, 20);

setBackground(new Color(200, 200, 200));

msg.setLineWrap(true);

add(lmsg);

add(send);

add(msg);

add(sendmode);

msg.addKeyListener(new KeyListener() { public void keyPressed(KeyEvent e) { int code = e.getKeyCode(); if (sendmode.getSelectedIndex() == 0) { if (code == KeyEvent.VK_ENTER) { e.consume(); send.doClick(); } } if (sendmode.getSelectedIndex() == 1) { if (code == KeyEvent.VK_CONTROL) { ctrl = true; } if (code == KeyEvent.VK_ENTER) { enter = true; } if (ctrl && enter) { e.consume(); send.doClick(); } } } public void keyReleased(KeyEvent e) { int co = e.getKeyCode(); if (co == KeyEvent.VK_CONTROL) { ctrl = false; }

if (co == KeyEvent.VK_ENTER)

{

enter = false;

}

}

public void keyTyped(KeyEvent e)

{

}

});

send.addActionListener(new ActionListener()

{

public void actionPerformed(ActionEvent arg0) {

ChatInfo info = new ChatInfo(sname,

list.getSelectedIndex(), whisper, msg.getText(),

msg.getFont(), msg.getForeground(), false, netAddress);

try

{

oos = new ObjectOutputStream(socket.getOutputStream());

// ???????ó·????÷

oos.writeObject(info);

msg.setText("");

msg.requestFocus();

} catch (UnknownHostException e)

{

e.printStackTrace();

} catch (IOException e)

{

e.printStackTrace();

}

}

});

}

}

public void insertDocument(String text, Color textColor, int size, String family, JTextPane textpane)// ?ù?????????????°??×???????×???????±??ò

{

SimpleAttributeSet set = new SimpleAttributeSet();

StyleConstants.setForeground(set, textColor);// ?è????×????? StyleConstants.setFontSize(set, size);// ?è??×????ó?? StyleConstants.setFontFamily(set, family);

Document doc = textpane.getStyledDocument();

try

{

doc.insertString(doc.getLength(), text, set);// ??????×? } catch (BadLocationException e)

{

}

}

class Connection extends Thread

{

private JList li;

public Connection(JList li)

{

this.li = li;

}

public void run()

{

try

{

while (true)

{

ois = new ObjectInputStream(socket.getInputStream());

msginfo = (MessageInfo) ois.readObject();

if (msginfo.isExit())

{

break;

} else

{

namelist = msginfo.getNamelist();

list.setListData(namelist);

list.setSelectedIndex(msginfo.getIndex());

SwingUtilities.updateComponentTreeUI(li);

if (msginfo.isWhisper())

{

if (list.getSelectedIndex() >= 0)

{

Point p2 = new Point();

p2.setLocation(0, ind.getHeight()); sp2.getViewport().setViewPosition(p2);

insertDocument(msginfo.getNickname() + " "

+ "???????? "

+

list.getSelectedValue().toString()

+ " ??:", Color.black, 12, "????", ind);

insertDocument(msginfo.getMsg() + "\r\n", msginfo.getColor(),

msginfo.getFont()

.getSize(),

msginfo.getFont()

.getFamily(), ind); } else

{

insertDocument(msginfo.getNickname() + " "

+ "????????:", Color.black, 12, "????", ind);

insertDocument(msginfo.getMsg() + "\r\n", msginfo.getColor(),

msginfo.getFont()

.getSize(),

msginfo.getFont()

.getFamily(), ind); }

} else

{

if ("".equals(msginfo.getNickname())) {

insertDocument(msginfo.getMsg() + "\r\n", msginfo.getColor(),

msginfo.getFont()

.getSize(),

msginfo.getFont()

.getFamily(), pub); } else

{

Point p1 = new Point();

p1.setLocation(0, pub.getHeight()); sp1.getViewport().setViewPosition(p1);

insertDocument(msginfo.getNickname() + " "

+ "??:", Color.black, 12, "????", pub);

insertDocument(msginfo.getMsg() + "\r\n", msginfo.getColor(),

msginfo.getFont()

.getSize(),

msginfo.getFont()

.getFamily(), pub); }

}

}

}

} catch (ClassNotFoundException e)

{

e.printStackTrace();

} catch (IOException e)

{

e.printStackTrace();

}

}

}

}

class ChatInfo implements Serializable

{

private String nickname, message, netAddress;

private int index;

private boolean whisper;

private Font font;

private Color color;

private boolean exit;

public ChatInfo(String name, int in, boolean whi, String msg, Font fo,

Color colo, boolean ex, String netaddr)

{

nickname = name;

index = in;

whisper = whi;

message = msg;

font = fo;

color = colo;

netAddress = netaddr;

exit = ex;

}

public ChatInfo(String name)

{

nickname = name;

}

public String getNickname()

{

return nickname;

}

public String getMessage()

{

return message;

}

public int getIndex()

{

return index;

}

public boolean isWhisper() {

return whisper;

}

public Font getFont()

{

return font;

}

public Color getColor() {

return color;

}

public boolean isExit() {

return exit;

}

public String getNetAddress() {

return netAddress;

}

}

//·????÷??

import java.awt.Color;

import java.awt.Font;

import java.awt.Window;

import java.io.IOException;

import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.net.ServerSocket; import java.net.Socket;

import java.util.ArrayList; import java.util.Vector;

import javax.swing.JOptionPane;

class ChatRoomServer extends Thread

{

private ServerSocket server;

private ArrayList<Socket> list = new ArrayList<Socket>(); private Vector<String> namelist = new Vector<String>();

public ChatRoomServer()

{

try

{

server = new ServerSocket(10000);

} catch (IOException e)

{

e.printStackTrace();

System.out.println("·????÷?????§°?!");

}

}

public void run()

{

try

{

while (true)

{

Socket s = server.accept();

boolean same = false;

ObjectInputStream ois = new ObjectInputStream(s.getInputStream());

ChatInfo checkname = (ChatInfo)ois.readObject(); for(String na:namelist)

{

if(checkname.getNickname().equals(na))

{

same = true;

break;

}

}

if(same)

{

ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());

MessageInfo checkmsg = new MessageInfo("??ê???????????",true);

oos.writeObject(checkmsg);

s.close();

}

else

{

ObjectOutputStream oos = ObjectOutputStream(s.getOutputStream());

MessageInfo checkmsg = MessageInfo("",false);

oos.writeObject(checkmsg);

list.add(s);

ServerRunner sr = new ServerRunner(s, namelist);

sr.start();

// break;

}

}

} catch (IOException e)

{

e.printStackTrace();

} catch (ClassNotFoundException e)

{

e.printStackTrace();

}

}

public static void main(String[] args)

{

new ChatRoomServer().start();

}

}

class ServerRunner extends Thread

{

private Socket s;

private ArrayList<Socket> list;

private Vector<String> namelist;

private ChatInfo chatinfo;

private ObjectInputStream ois; new new list,

private ObjectOutputStream oos;

public ServerRunner(Socket s, ArrayList<Socket> l, Vector<String> namelist)

{

this.s = s;

list = l;

this.namelist = namelist;

}

public void run()

{

String socketName;

try

{

ois = new ObjectInputStream(s.getInputStream());

chatinfo = (ChatInfo) ois.readObject();

namelist.add(chatinfo.getNickname());

socketName = chatinfo.getNickname();

MessageInfo msginfo0 = new MessageInfo("", chatinfo.getNickname()

+ " " + "?????????ì????", new Font("????", Font.BOLD,

12),

Color.red, false, namelist,chatinfo.getIndex()); sendMessage(msginfo0, chatinfo);

while (true)

{

ois = new ObjectInputStream(s.getInputStream()); chatinfo = (ChatInfo) ois.readObject();

if (chatinfo.isExit())

{

list.remove(s);

namelist.remove(chatinfo.getNickname());

MessageInfo msginfo1 = new MessageInfo("", chatinfo .getNickname()

+ " " + "?????????ì????", new Font("????", Font.BOLD, 12),

Color.red, false, namelist,chatinfo.getIndex());

sendMessage(msginfo1, chatinfo);

oos = new ObjectOutputStream(s.getOutputStream()); MessageInfo exitInfo = new MessageInfo(true); // ???????§??

oos.writeObject(exitInfo);

s.close();

ois.close();

oos.close();

break;

} else

{

int index = namelist.indexOf(socketName);

namelist.remove(index);

namelist.insertElementAt(chatinfo.getNickname(), index);

socketName = chatinfo.getNickname();

MessageInfo msginfo = new MessageInfo(chatinfo

.getNickname(), chatinfo.getMessage(), chatinfo

.getFont(), chatinfo.getColor(), chatinfo .isWhisper(),

namelist,chatinfo.getIndex());

sendMessage(msginfo, chatinfo);

}

}

} catch (IOException e)

{

e.printStackTrace();

} catch (ClassNotFoundException e)

{

e.printStackTrace();

}

}

public void sendMessage(MessageInfo minfo, ChatInfo cinfo) {

if (!cinfo.isWhisper())

{

try

{

for (Socket so : list)

{

oos = new ObjectOutputStream(so.getOutputStream()); // ???????§??

oos.writeObject(minfo);

}

} catch (IOException e)

{

e.printStackTrace();

}

} else

{

try

{

int count = 0;

for (Socket so : list)

{

if (count == cinfo.getIndex()

|| cinfo.getNetAddress().equals(

so.getInetAddress().toString())) {

ObjectOutputStream oos = new ObjectOutputStream(so

.getOutputStream());

// ???????§??

oos.writeObject(minfo);

}

count++;

}

} catch (IOException e)

{

e.printStackTrace();

}

}

}

}

class MessageInfo implements Serializable

{

private String msg, nickname;

private Font font;

private Color color;

private boolean whisper,exit;

private Vector<String> namelist;

private int index;

public MessageInfo(String nickname, String msg, Font font, Color color,

boolean whisper, Vector<String> namelist,int index) {

this.nickname = nickname; this.msg = msg; this.font = font; this.color = color; this.whisper = whisper; this.namelist = namelist; this.index = index; } public MessageInfo(boolean exit) { this.exit = exit; } public MessageInfo(String msg,boolean whisper) { this.msg = msg; this.whisper = whisper; } public String getNickname() { return nickname; } public String getMsg() { return msg; } public Font getFont() { return font; } public Color getColor() { return color; } public boolean isWhisper() { return whisper; } public Vector<String> getNamelist() {

} return namelist; } public int getIndex() { return index; } public boolean isExit() { return exit; }

更多相关推荐:
java局域聊天室实践总结

河北科技师范学院JAVA程序设计课程设计个人实习总结实习类型课程设计实习单位指导教师所在院系信息技术系班级姓名学号一实习时间和地点时间20xx31720xx414地点F310F311二实习的内容我所开发的系统是...

java聊天室设计总结

JAVA聊天室程序设计总结大二第一学期末我们进行了为期两周的java实习这次的实习内容是设计一个多人聊天室在网络越来越发达的今天人们对网络的依赖越来越多越来越离不开网络由此而产生的聊天工具越来越多类似QQMSN...

java聊天室项目设计书

Java项目设计聊天室设计设计人XXX指导老师XXX设计时间20xx417到20xx424目录第一部分项目概况1项目说明42项目背景4第二部分项目计划1项目目标42项目范围43项目策略44项目开发周期45每项任...

java项目总结

DBHelp类packagecomxunpoitprodbimportjavasqlConnectionimportjavasqlDriverManagerimportjavasqlSQLExceptionim...

《Java程序设计基础》项目设计报告

Java程序设计基础项目设计报告题目求三角形面积的实现专业班级学号姓名完成时间成绩课程设计说明书论文第I页目录1设计的目的111设计的目的112内容要求12系统基本框架结构图23系统功能设计331系统主界面设计...

Java Me 小项目报告

手机应用程序开发JavaME项目报告学院信息科学与技术班级学号姓名主要功能屏幕上有一个小球上下弹动按左键向左移动按右键向右移送按上键减速按下键加速中间的确定键变大其他键改变颜色在红绿蓝色之间变化右软件可以暂停或...

java计算器项目课程设计报告(包涵源文件与类图)

计算机网络技术专业专业代码590102动态网站基础程序设计课程设计班级网站1101班学号20xx352220xx184220xx221520xx515320xx352820xx289320xx352320xx3...

Java雷电游戏项目报告模板

北京青年政治学院小学期达内JAVA课程项目报告项目题目专业班级学生姓名学生学号雷电游戏的设计与实现指导教师姓名目录一系统目标X二系统设计思路X三系统详细设计X四系统实现X五系统设计总结XX六参考文献XX1一系统...

Java EE项目开发实验报告

实验一Struts框架技术及应用一实验目的掌握Struts框架技术的原理及其在项目中的应用掌握MVC开发模式二实验内容创建一个用于本次和后续JavaEE项目的名为test的数据库并在数据库中创建一个名为user...

java个人记事本总结报告

计算机学院工程实践总结报告个人记事本小组序号组员姓名年级班级指导教师姓名提交日期目录12引言2项目需求分析及方案2212223243程序的基本功能2输入输出要求3测试数据3设计方案3项目概要设计4313233抽...

Java项目报告模版

Java程序设计项目报告班级姓名学号指导教师20xx年06月3日1选题概述题目javaXX应用程序简介通过本程序可以实现XX的基本功能程序是Frame类的子类使用GridLayout的布局方式对组件进行布局用P...

Java小项目报告

HUNANUNIVERSITYJava小项目报告题目:学生成绩管理系统学生姓名吕良学生学号***专业班级计算机科学与技术(3)班指导老师文佳宝完成日期20**.12.23Java小项目:学生成绩管理系统一、项目…

java聊天室项目总结(4篇)