基本信息
源码名称:java 在线聊天软件源码
源码大小:0.53M
文件格式:.zip
开发语言:Java
更新时间:2018-06-11
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):78630559
本次赞助数额为: 3 元×
微信扫码支付:3 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
没有数据库,打开直接运行即可
没有数据库,打开直接运行即可
package cat.client;
import java.applet.Applet;
import java.applet.AudioClip;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.URL;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
import javax.swing.AbstractListModel;
import javax.swing.BorderFactory;
import javax.swing.DefaultListModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ListCellRenderer;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.Border;
import javax.swing.border.TitledBorder;
import cat.function.CatBean;
import cat.util.CatUtil;
class CellRenderer extends JLabel implements ListCellRenderer {
CellRenderer() {
setOpaque(true);
}
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));// 加入宽度为5的空白边框
if (value != null) {
setText(value.toString());
setIcon(new ImageIcon("images//1.jpg"));
}
if (isSelected) {
setBackground(new Color(255, 255, 153));// 设置背景色
setForeground(Color.black);
} else {
// 设置选取与取消选取的前景与背景颜色.
setBackground(Color.white); // 设置背景色
setForeground(Color.black);
}
setEnabled(list.isEnabled());
setFont(new Font("sdf", Font.ROMAN_BASELINE, 13));
setOpaque(true);
return this;
}
}
class UUListModel extends AbstractListModel{
private Vector vs;
public UUListModel(Vector vs){
this.vs = vs;
}
@Override
public Object getElementAt(int index) {
// TODO Auto-generated method stub
return vs.get(index);
}
@Override
public int getSize() {
// TODO Auto-generated method stub
return vs.size();
}
}
public class CatChatroom extends JFrame {
private static final long serialVersionUID = 6129126482250125466L;
private static JPanel contentPane;
private static Socket clientSocket;
private static ObjectOutputStream oos;
private static ObjectInputStream ois;
private static String name;
private static JTextArea textArea;
private static AbstractListModel listmodel;
private static JList list;
private static String filePath;
private static JLabel lblNewLabel;
private static JProgressBar progressBar;
private static Vector onlines;
private static boolean isSendFile = false;
private static boolean isReceiveFile = false;
// 声音
private static File file, file2;
private static URL cb, cb2;
private static AudioClip aau, aau2;
/**
* Create the frame.
*/
public CatChatroom(String u_name, Socket client) {
// 赋值
name = u_name;
clientSocket = client;
onlines = new Vector();
SwingUtilities.updateComponentTreeUI(this);
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (InstantiationException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IllegalAccessException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (UnsupportedLookAndFeelException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
setTitle(name);
setResizable(false);
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
setBounds(200, 100, 688, 510);
contentPane = new JPanel() {
private static final long serialVersionUID = 1L;
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(new ImageIcon("images\\聊天室1.jpg").getImage(), 0, 0,
getWidth(), getHeight(), null);
}
};
setContentPane(contentPane);
contentPane.setLayout(null);
// 聊天信息显示区域
JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(10, 10, 410, 300);
getContentPane().add(scrollPane);
textArea = new JTextArea();
textArea.setEditable(false);
textArea.setLineWrap(true);//激活自动换行功能
textArea.setWrapStyleWord(true);//激活断行不断字功能
textArea.setFont(new Font("sdf", Font.BOLD, 13));
scrollPane.setViewportView(textArea);
// 打字区域
JScrollPane scrollPane_1 = new JScrollPane();
scrollPane_1.setBounds(10, 347, 411, 97);
getContentPane().add(scrollPane_1);
final JTextArea textArea_1 = new JTextArea();
textArea_1.setLineWrap(true);//激活自动换行功能
textArea_1.setWrapStyleWord(true);//激活断行不断字功能
scrollPane_1.setViewportView(textArea_1);
// 关闭按钮
final JButton btnNewButton = new JButton("\u5173\u95ED");
btnNewButton.setBounds(214, 448, 60, 30);
getContentPane().add(btnNewButton);
// 发送按钮
JButton btnNewButton_1 = new JButton("\u53D1\u9001");
btnNewButton_1.setBounds(313, 448, 60, 30);
getRootPane().setDefaultButton(btnNewButton_1);
getContentPane().add(btnNewButton_1);
// 在线客户列表
listmodel = new UUListModel(onlines) ;
list = new JList(listmodel);
list.setCellRenderer(new CellRenderer());
list.setOpaque(false);
Border etch = BorderFactory.createEtchedBorder();
list.setBorder(BorderFactory.createTitledBorder(etch, "<" u_name ">"
"在线客户:", TitledBorder.LEADING, TitledBorder.TOP, new Font(
"sdf", Font.BOLD, 20), Color.green));
JScrollPane scrollPane_2 = new JScrollPane(list);
scrollPane_2.setBounds(430, 10, 245, 375);
scrollPane_2.setOpaque(false);
scrollPane_2.getViewport().setOpaque(false);
getContentPane().add(scrollPane_2);
// 文件传输栏
progressBar = new JProgressBar();
progressBar.setBounds(430, 390, 245, 15);
progressBar.setMinimum(1);
progressBar.setMaximum(100);
getContentPane().add(progressBar);
// 文件传输提示
lblNewLabel = new JLabel(
"\u6587\u4EF6\u4F20\u9001\u4FE1\u606F\u680F:");
lblNewLabel.setFont(new Font("SimSun", Font.PLAIN, 12));
lblNewLabel.setBackground(Color.WHITE);
lblNewLabel.setBounds(430, 410, 245, 15);
getContentPane().add(lblNewLabel);
try {
oos = new ObjectOutputStream(clientSocket.getOutputStream());
// 记录上线客户的信息在catbean中,并发送给服务器
CatBean bean = new CatBean();
bean.setType(0);
bean.setName(name);
bean.setTimer(CatUtil.getTimer());
oos.writeObject(bean);
oos.flush();
// 消息提示声音
file = new File("sounds\\呃欧.wav");
cb = file.toURL();
aau = Applet.newAudioClip(cb);
// 上线提示声音
file2 = new File("sounds\\叮.wav");
cb2 = file2.toURL();
aau2 = Applet.newAudioClip(cb2);
// 启动客户接收线程
new ClientInputThread().start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 发送按钮
btnNewButton_1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String info = textArea_1.getText();
List to = list.getSelectedValuesList();
if (to.size() < 1) {
JOptionPane.showMessageDialog(getContentPane(), "请选择聊天对象");
return;
}
if (to.toString().contains(name "(我)")) {
JOptionPane
.showMessageDialog(getContentPane(), "不能向自己发送信息");
return;
}
if (info.equals("")) {
JOptionPane.showMessageDialog(getContentPane(), "不能发送空信息");
return;
}
CatBean clientBean = new CatBean();
clientBean.setType(1);
clientBean.setName(name);
String time = CatUtil.getTimer();
clientBean.setTimer(time);
clientBean.setInfo(info);
HashSet set = new HashSet();
set.addAll(to);
clientBean.setClients(set);
// 自己发的内容也要现实在自己的屏幕上面
textArea.append(time " 我对" to "说:\r\n" info "\r\n");
sendMessage(clientBean);
textArea_1.setText(null);
textArea_1.requestFocus();
}
});
// 关闭按钮
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(isSendFile || isReceiveFile){
JOptionPane.showMessageDialog(contentPane,
"正在传输文件中,您不能离开...",
"Error Message", JOptionPane.ERROR_MESSAGE);
}else{
btnNewButton.setEnabled(false);
CatBean clientBean = new CatBean();
clientBean.setType(-1);
clientBean.setName(name);
clientBean.setTimer(CatUtil.getTimer());
sendMessage(clientBean);
}
}
});
// 离开
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
if(isSendFile || isReceiveFile){
JOptionPane.showMessageDialog(contentPane,
"正在传输文件中,您不能离开...",
"Error Message", JOptionPane.ERROR_MESSAGE);
}else{
int result = JOptionPane.showConfirmDialog(getContentPane(),
"您确定要离开聊天室");
if (result == 0) {
CatBean clientBean = new CatBean();
clientBean.setType(-1);
clientBean.setName(name);
clientBean.setTimer(CatUtil.getTimer());
sendMessage(clientBean);
}
}
}
});
// 列表监听
list.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
List to = list.getSelectedValuesList();
if (e.getClickCount() == 2) {
if (to.toString().contains(name "(我)")) {
JOptionPane
.showMessageDialog(getContentPane(), "不能向自己发送文件");
return;
}
// 双击打开文件文件选择框
JFileChooser chooser = new JFileChooser();
chooser.setDialogTitle("选择文件框"); // 标题哦...
chooser.showDialog(getContentPane(), "选择"); // 这是按钮的名字..
// 判定是否选择了文件
if (chooser.getSelectedFile() != null) {
// 获取路径
filePath = chooser.getSelectedFile().getPath();
File file = new File(filePath);
// 文件为空
if (file.length() == 0) {
JOptionPane.showMessageDialog(getContentPane(),
filePath "文件为空,不允许发送.");
return;
}
CatBean clientBean = new CatBean();
clientBean.setType(2);// 请求发送文件
clientBean.setSize(new Long(file.length()).intValue());
clientBean.setName(name);
clientBean.setTimer(CatUtil.getTimer());
clientBean.setFileName(file.getName()); // 记录文件的名称
clientBean.setInfo("请求发送文件");
// 判断要发送给谁
HashSet<String> set = new HashSet<String>();
set.addAll(list.getSelectedValuesList());
clientBean.setClients(set);
sendMessage(clientBean);
}
}
}
});
}
class ClientInputThread extends Thread {
@Override
public void run() {
try {
// 不停的从服务器接收信息
while (true) {
ois = new ObjectInputStream(clientSocket.getInputStream());
final CatBean bean = (CatBean) ois.readObject();
switch (bean.getType()) {
case 0: {
// 更新列表
onlines.clear();
HashSet<String> clients = bean.getClients();
Iterator<String> it = clients.iterator();
while (it.hasNext()) {
String ele = it.next();
if (name.equals(ele)) {
onlines.add(ele "(我)");
} else {
onlines.add(ele);
}
}
listmodel = new UUListModel(onlines);
list.setModel(listmodel);
aau2.play();
textArea.append(bean.getInfo() "\r\n");
textArea.selectAll();
break;
}
case -1: {
return;
}
case 1: {
String info = bean.getTimer() " " bean.getName()
" 对 " bean.getClients() "说:\r\n";
if (info.contains(name) ) {
info = info.replace(name, "我");
}
aau.play();
textArea.append(info bean.getInfo() "\r\n");
textArea.selectAll();
break;
}
case 2: {
// 由于等待目标客户确认是否接收文件是个阻塞状态,所以这里用线程处理
new Thread(){
public void run() {
//显示是否接收文件对话框
int result = JOptionPane.showConfirmDialog(
getContentPane(), bean.getInfo());
switch(result){
case 0:{ //接收文件
JFileChooser chooser = new JFileChooser();
chooser.setDialogTitle("保存文件框"); // 标题哦...
//默认文件名称还有放在当前目录下
chooser.setSelectedFile(new File(bean
.getFileName()));
chooser.showDialog(getContentPane(), "保存"); // 这是按钮的名字..
//保存路径
String saveFilePath =chooser.getSelectedFile().toString();
//创建客户CatBean
CatBean clientBean = new CatBean();
clientBean.setType(3);
clientBean.setName(name); //接收文件的客户名字
clientBean.setTimer(CatUtil.getTimer());
clientBean.setFileName(saveFilePath);
clientBean.setInfo("确定接收文件");
// 判断要发送给谁
HashSet<String> set = new HashSet<String>();
set.add(bean.getName());
clientBean.setClients(set); //文件来源
clientBean.setTo(bean.getClients());//给这些客户发送文件
// 创建新的tcp socket 接收数据, 这是额外增加的功能, 大家请留意...
try {
ServerSocket ss = new ServerSocket(0); // 0可以获取空闲的端口号
clientBean.setIp(clientSocket.getInetAddress().getHostAddress());
clientBean.setPort(ss.getLocalPort());
sendMessage(clientBean); // 先通过服务器告诉发送方, 你可以直接发送文件到我这里了...
isReceiveFile=true;
//等待文件来源的客户,输送文件....目标客户从网络上读取文件,并写在本地上
Socket sk = ss.accept();
textArea.append(CatUtil.getTimer() " " bean.getFileName()
"文件保存中.\r\n");
DataInputStream dis = new DataInputStream( //从网络上读取文件
new BufferedInputStream(sk.getInputStream()));
DataOutputStream dos = new DataOutputStream( //写在本地上
new BufferedOutputStream(new FileOutputStream(
saveFilePath)));
int count = 0;
int num = bean.getSize() / 100;
int index = 0;
while (count < bean.getSize()) {
int t = dis.read();
dos.write(t);
count ;
if(num>0){
if (count % num == 0 && index < 100) {
progressBar.setValue( index);
}
lblNewLabel.setText("下载进度:" count
"/" bean.getSize() " 整体" index
"%");
}else{
lblNewLabel.setText("下载进度:" count
"/" bean.getSize() " 整体:" new Double(new Double(count).doubleValue()/new Double(bean.getSize()).doubleValue()*100).intValue() "%");
if(count==bean.getSize()){
progressBar.setValue(100);
}
}
}
//给文件来源客户发条提示,文件保存完毕
PrintWriter out = new PrintWriter(sk.getOutputStream(),true);
out.println(CatUtil.getTimer() " 发送给" name "的文件[" bean.getFileName() "]"
"文件保存完毕.\r\n");
out.flush();
dos.flush();
dos.close();
out.close();
dis.close();
sk.close();
ss.close();
textArea.append(CatUtil.getTimer() " " bean.getFileName()
"文件保存完毕.存放位置为:" saveFilePath "\r\n");
isReceiveFile = false;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
}
default: {
CatBean clientBean = new CatBean();
clientBean.setType(4);
clientBean.setName(name); //接收文件的客户名字
clientBean.setTimer(CatUtil.getTimer());
clientBean.setFileName(bean.getFileName());
clientBean.setInfo(CatUtil.getTimer() " "
name "取消接收文件["
bean.getFileName() "]");
// 判断要发送给谁
HashSet<String> set = new HashSet<String>();
set.add(bean.getName());
clientBean.setClients(set); //文件来源
clientBean.setTo(bean.getClients());//给这些客户发送文件
sendMessage(clientBean);
break;
}
}
};
}.start();
break;
}
case 3: { //目标客户愿意接收文件,源客户开始读取本地文件并发送到网络上
textArea.append(bean.getTimer() " " bean.getName() "确定接收文件" ",文件传送中..\r\n");
new Thread(){
public void run() {
try {
isSendFile = true;
//创建要接收文件的客户套接字
Socket s = new Socket(bean.getIp(),bean.getPort());
DataInputStream dis = new DataInputStream(
new FileInputStream(filePath)); //本地读取该客户刚才选中的文件
DataOutputStream dos = new DataOutputStream(
new BufferedOutputStream(s
.getOutputStream())); //网络写出文件
int size = dis.available();
int count = 0; //读取次数
int num = size / 100;
int index = 0;
while (count < size) {
int t = dis.read();
dos.write(t);
count ; //每次只读取一个字节
if(num>0){
if (count % num == 0 && index < 100) {
progressBar.setValue( index);
}
lblNewLabel.setText("上传进度:" count "/"
size " 整体" index
"%");
}else{
lblNewLabel.setText("上传进度:" count "/"
size " 整体:" new Double(new Double(count).doubleValue()/new Double(size).doubleValue()*100).intValue() "%"
);
if(count==size){
progressBar.setValue(100);
}
}
}
dos.flush();
dis.close();
//读取目标客户的提示保存完毕的信息...
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
textArea.append( br.readLine() "\r\n");
isSendFile = false;
br.close();
s.close();
} catch (Exception ex) {
ex.printStackTrace();
}
};
}.start();
break;
}
case 4: {
textArea.append(bean.getInfo() "\r\n");
break;
}
default: {
break;
}
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (clientSocket != null) {
try {
clientSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.exit(0);
}
}
}
private void sendMessage(CatBean clientBean) {
try {
oos = new ObjectOutputStream(clientSocket.getOutputStream());
oos.writeObject(clientBean);
oos.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}