想跟你要一套jsp聊天室源代码的源码

  语音聊天室,或多人语音聊天,是即时通信应用中常见的功能之一,比如,QQ的语音讨论组就是我们用得比较多的。
& & & &这篇文章将实现一个简单的语音聊天室,让多个人可以进入同一个房间进行语音沟通。先看运行效果截图:
   & && &
&   从左到右的三张图分别是:登录界面、语音聊天室的主界面、标注了各个控件的主界面。
  (如果觉得界面太丑,没关系,后面下载源码后,你可以自己美化~~)
一. C/S结构
  很明显,我这个语音聊天室采用的是C/S结构,整个项目结构相对比较简单,如下所示:
   该项目的底层是基于构建的。这样,服务端就基本没写代码,直接把OMCS服务端拿过来用;客户端就比较麻烦些,下面我就重点讲客户端的开发。
二. 客户端控件式开发
  客户端开发了多个自定义控件,然后将它们组装到一起,以完成语音聊天室的功能。为了便于讲解,我主界面的图做了标注,以指示出各个自定义控件。  
  现在我们分别介绍各个控件:
1. 分贝显示器&
  分贝显示器用于显示声音的大小,比如麦克风采集到的声音的大小,或扬声器播放的声音的大小。如上图中3标注的。
(1)傅立叶变换
  将声音数据转换成分贝强度使用的是傅立叶变换。其对应的是客户端项目中的FourierTransformer静态类。源码比较简单,就不贴出来了,大家自己去看。
(2)声音强度显示控件 DecibelDisplayer
  DecibelDisplayer 使用的是PrograssBar来显示声音强度的大小。
  每当有声音数据交给DecibelDisplayer显示时,首先,DecibelDisplayer会调用上面的傅立叶变换将其转换为分贝,然后,将其映射为PrograssBar的对应的Value。
2.发言者控件&SpeakerPanel
  SpeakerPanel 用于表示聊天室中的一个成员,如上图中1所示。它显示了成员的ID,成员的声音的强度(使用DecibelDisplayer控件),以及其麦克风的状态(启用、引用)。
  这个控件很重要,我将其源码贴出来:
public partial class SpeakerPanel : UserControl ,IDisposable
private ChatUnit chatU
public SpeakerPanel()
InitializeComponent();
this.SetStyle(ControlStyles.ResizeRedraw, true);//调整大小时重绘
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);// 双缓冲
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);// 禁止擦除背景.
this.SetStyle(ControlStyles.UserPaint, true);//自行绘制
this.UpdateStyles();
public string MemberID
if (this.chatUnit == null)
return null;
return this.chatUnit.MemberID;
public void Initialize(ChatUnit unit)
this.chatUnit =
this.skinLabel_name.Text = unit.MemberID;
this.chatUnit.MicrophoneConnector.ConnectEnded += new CbGeneric&OMCS.Passive.ConnectResult&(MicrophoneConnector_ConnectEnded);
this.chatUnit.MicrophoneConnector.OwnerOutputChanged += new CbGeneric(MicrophoneConnector_OwnerOutputChanged);
this.chatUnit.MicrophoneConnector.AudioDataReceived += new CbGeneric&byte[]&(MicrophoneConnector_AudioDataReceived);
this.chatUnit.MicrophoneConnector.BeginConnect(unit.MemberID);
public void Initialize(string curUserID)
this.skinLabel_name.Text = curUserID;
this.skinLabel_name.ForeColor = Color.R
this.pictureBox_Mic.Visible = false;
this.decibelDisplayer1.Visible = false;
void MicrophoneConnector_AudioDataReceived(byte[] data)
this.decibelDisplayer1.DisplayAudioData(data);
void MicrophoneConnector_OwnerOutputChanged()
if (this.InvokeRequired)
this.BeginInvoke(new CbGeneric(this.MicrophoneConnector_OwnerOutputChanged));
this.ShowMicState();
private ConnectResult connectR
void MicrophoneConnector_ConnectEnded(ConnectResult res)
if (this.InvokeRequired)
this.BeginInvoke(new CbGeneric&ConnectResult&(this.MicrophoneConnector_ConnectEnded), res);
this.connectResult =
this.ShowMicState();
public void Dispose()
this.chatUnit.Close();
private void ShowMicState()
if (this.connectResult != OMCS.Passive.ConnectResult.Succeed)
this.pictureBox_Mic.BackgroundImage = this.imageList1.Images[2];
this.toolTip1.SetToolTip(this.pictureBox_Mic, this.connectResult.ToString());
this.decibelDisplayer1.Working = false;
if (!this.chatUnit.MicrophoneConnector.OwnerOutput)
this.pictureBox_Mic.BackgroundImage = this.imageList1.Images[1];
this.toolTip1.SetToolTip(this.pictureBox_Mic, "好友禁用了麦克风");
if (this.chatUnit.MicrophoneConnector.Mute)
this.pictureBox_Mic.BackgroundImage = this.imageList1.Images[1];
this.toolTip1.SetToolTip(this.pictureBox_Mic, "静音");
this.pictureBox_Mic.BackgroundImage = this.imageList1.Images[0];
this.toolTip1.SetToolTip(this.pictureBox_Mic, "正常");
this.decibelDisplayer1.Working = true;
private void pictureBox_Mic_Click(object sender, EventArgs e)
if (!this.chatUnit.MicrophoneConnector.OwnerOutput)
this.chatUnit.MicrophoneConnector.Mute = !this.chatUnit.MicrophoneConnector.M
this.ShowMicState();
(1)在代码中,ChatUnit就代表当前这个聊天室中的成员。我们使用其MicrophoneConnector连接到目标成员的麦克风。
(2)预定MicrophoneConnector的AudioDataReceived事件,当收到语音数据时,将其交给DecibelDisplayer去显示声音的大小。
(3)预定MicrophoneConnector的ConnectEnded和OwnerOutputChanged事件,根据其结果来显示SpeakerPanel空间上麦克风图标的状态(对应ShowMicState方法)。
3.&MultiAudioChatContainer 控件
  MultiAudioChatContainer对应上图中2标注的控件,它主要做了以下几件事情:
(1)在初始化时,加入聊天室:通过调用IMultimediaManager的ChatGroupEntrance属性的Join方法。
(2)使用FlowLayoutPanel将聊天室中每个成员对应的SpeakerPanel罗列出来。
(3)当有成员加入或退出聊天室时(对应ChatGroup的SomeoneJoin和SomeoneExit事件),动态添加或移除对应的SpeakerPanel实例。
(4)通过CheckBox将自己设备(麦克风和扬声器)的控制权暴露出来。我们可以启用或禁用我们自己的麦克风或扬声器。
(5)注意,其提供了Close方法,这意味着,在关闭包含了该控件的宿主窗体时,要调用其Close方法以释放其内部持有的麦克风连接器等资源。
  在完成MultiAudioChatContainer后,我们这个聊天室的核心就差不多了。接下来就是弄个主窗体,然后把MultiAudioChatContainer拖上去,初始化IMultimediaManager,并传递给MultiAudioChatContainer就大功告成了。
三. 源码下载
  上面只是讲了实现多人语音聊天室中的几个重点,并不全面,大家下载下面的源码可以更深入的研究。
  最后,跟大家说说部署的步骤:
(1)将服务端部署在一台机器上,启动服务端。
(2)修改客户端配置文件中的ServerIP为刚才服务器的IP。
(3)在多台机器上运行客户端,以不同的帐号登录到同一个房间(如默认的R1000)。
(4)如此,多个用户就处于同一个聊天室进行语音聊天了。
阅读(...) 评论()很好的一个聊天室源码,分享给大家
==================================================================================================
客户端:5个类
&1.Client_chatFrame 2.Client_enterFrame
3.Client_singleFrame 4.Client 5.WinCenter
1.==============================================================================================
package com.
import java.awt.F
import java.awt.T
import java.awt.event.ActionE
import java.awt.event.ActionL
import java.awt.event.KeyE
import java.awt.event.KeyL
import java.awt.event.WindowA
import java.awt.event.WindowE
import java.util.ArrayL
import java.util.L
import javax.swing.BorderF
import javax.swing.JB
import javax.swing.JF
import javax.swing.JL
import javax.swing.JOptionP
import javax.swing.JScrollP
import javax.swing.JTextA
import javax.swing.JTextF
import javax.swing.ListM
import javax.swing.ListSelectionM
import javax.swing.UIM
import javax.swing.UnsupportedLookAndFeelEx
import javax.swing.event.ListSelectionE
import javax.swing.event.ListSelectionL
public class Client_chatFrame extends JFrame implements
ActionListener,
KeyListener, ListSelectionListener {
public Client_chatFrame(Client client, String title) {
this.client =
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (UnsupportedLookAndFeelException e) {
e.printStackTrace();
setIconImage(Toolkit.getDefaultToolkit().getImage("Images/socket.jpg"));
setTitle("\u804A\u" + " &" +
setSize(450, 325);
WinCenter.center(this);
setResizable(false);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent arg0) {
jbt_exit.doClick();
getContentPane().setLayout(null);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setBorder(BorderFactory.createTitledBorder("聊天消息"));
scrollPane.setBounds(10, 10, 283, 167);
scrollPane.setWheelScrollingEnabled(true);
getContentPane().add(scrollPane);
jta_disMess = new JTextArea();
jta_disMess.setEditable(false);
scrollPane.setViewportView(jta_disMess);
jtf_inputMess = new JTextField();
jtf_inputMess.addKeyListener(this);
jtf_inputMess.setBounds(10, 242, 192, 32);
getContentPane().add(jtf_inputMess);
jtf_inputMess.setColumns(10);
jbt_trans = new JButton("\u53D1
&\u9001");
jbt_trans.setFont(new Font("宋体", Font.PLAIN, 14));
jbt_trans.setBounds(212, 241, 93, 32);
jbt_trans.addActionListener(this);
getContentPane().add(jbt_trans);
jbt_clear = new
JButton("\u6E05\uA\u\u5F55");
jbt_clear.setFont(new Font("宋体", Font.PLAIN, 14));
jbt_clear.setBounds(158, 187, 135, 37);
jbt_clear.addActionListener(this);
getContentPane().add(jbt_clear);
jbt_exit = new
JButton("\u9000\u51FA\u804A\u");
jbt_exit.setFont(new Font("宋体", Font.PLAIN, 14));
jbt_exit.setBounds(20, 189, 128, 37);
jbt_exit.addActionListener(this);
getContentPane().add(jbt_exit);
scrollPane_1 = new JScrollPane();
scrollPane_1.setBorder(BorderFactory.createTitledBorder("在线用户"));
scrollPane_1.setBounds(303, 10, 128, 214);
getContentPane().add(scrollPane_1);
jlt_disUsers = new JList();
jlt_disUsers.setVisibleRowCount(4);
jlt_disUsers.setSelectedIndex(0);
jlt_disUsers
.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
jlt_disUsers.addListSelectionListener(this);
scrollPane_1.setViewportView(jlt_disUsers);
jbt_singlChat = new JButton("\u5355\u4EBA\u804A\u5929");
jbt_singlChat.setBounds(315, 241, 116, 32);
jbt_singlChat.addActionListener(this);
getContentPane().add(jbt_singlChat);
private static final long serialVersionUID = 1L;
private JTextField jtf_inputM
private JTextArea jta_disM
private JButton jbt_
private JButton jbt_
private JButton jbt_
private JList jlt_disU
private JButton jbt_singlC
private JScrollPane scrollPane_1;
public void actionPerformed(ActionEvent e) {
if (e.getSource() == jbt_clear) {
jta_disMess.setText("");
if (e.getSource() == jbt_trans) {
String mess = jtf_inputMess.getText();
mess.trim();
jtf_inputMess.setText("");
if (mess.equals("")) {
JOptionPane.showMessageDialog(this, "不能发送空消息");
jtf_inputMess.setText("");
client.transMess(mess);
if (e.getSource() == jbt_exit) {
if (JOptionPane.OK_OPTION ==
JOptionPane.showConfirmDialog(this,
"是否确定要退出聊天室?", "提示", JOptionPane.OK_CANCEL_OPTION)) {
this.setVisible(false);
client.exitChat();
System.exit(0);
if (e.getSource() == jbt_singlChat) {
String user_names = (String)
jlt_disUsers.getSelectedValue();
if (user_names == null) {
JOptionPane.showMessageDialog(this,
"您未选择聊天对象\n请选择要单独聊天的对象");
if (!client.c_singleFrames.containsKey(user_names)) {
createSingleChatFrame(user_names);
client.c_singleFrames.get(user_names)
.setFocusableWindowState(true);
public void keyPressed(KeyEvent arg0) {
if (arg0.getKeyCode() == KeyEvent.VK_ENTER) {
if (arg0.getSource() == jtf_inputMess) {
jbt_trans.doClick();
public void keyReleased(KeyEvent arg0) {
public void keyTyped(KeyEvent arg0) {
public void setDisMess(String substring) {
int local = substring.indexOf("@chat");
jta_disMess.append(substring.substring(0, local) +
jta_disMess.setCaretPosition(jta_disMess.getText().length());
public void setDisUsers(String chat_re) {
String[] infos = chat_re.split("@userlist");
String[] info = new String[infos.length / 2];
for (int i = 1; i & infos. i++) {
int id_user = 0;
id_user = Integer.parseInt(infos[i]);
if (client.getThreadID() == id_user) {
if (!client.username.equals(infos[i - 1])) {
JOptionPane.showMessageDialog(this,
"由于有同名的用户登录,所以您的用户名后面加上了编号");
client.username = infos[i - 1];
this.setTitle("聊天室 & &" +
client.username);
} catch (Exception e) {
if (infos.length == 2) {
String[] s = new String[] {};
if (!client.c_singleFrames.isEmpty()) {
ListModel list = jlt_disUsers.getModel();
for (int i = 0; i & list.getSize(); i++)
if (client.c_singleFrames.get(list.getElementAt(i)) != null)
client.c_singleFrames.get(list.getElementAt(i))
.setExitNotify();
jlt_disUsers.removeAll();
jlt_disUsers.setListData(s);
if ((infos.length / 2 - 1) &
client.username_online.size()) {
// 有人下线
List rec = new ArrayList();
int i = 0;
for (; i & infos. i++) {
rec.add(0, infos[i++]);
for (i = 0; i & client.username_online.size();
if (!rec.contains(client.username_online.get(i))) {
String name = client.username_online.get(i);
client.username_online.remove(i);
client.clientuserid.remove(i);
} catch (Exception e) {
e.printStackTrace();
if (client.c_singleFrames.containsKey(name)) {
client.c_singleFrames.get(name).closeSingleFrame();
client.c_singleFrames.remove(name);
List online = new ArrayList();
for (int i = 0; i &
client.username_online.size(); i++) {
online.add(0, client.clientuserid.get(i));
if (online.isEmpty()) {
for (int i = 1; i & infos. i++) {
if ((int) Integer.parseInt(infos[i]) != client
.getThreadID()) {
client.username_online.add(0, infos[i - 1]);
client.clientuserid.add(0,
Integer.parseInt(infos[i]));
for (int i = 1; i & infos. i++) {
if (Integer.parseInt(infos[i]) != client.getThreadID())
if (!online.contains(Integer.parseInt(infos[i]))) {
client.username_online.add(0, infos[i - 1]);
client.clientuserid.add(0,
Integer.parseInt(infos[i]));
String name = client.username_online
.get(client.clientuserid
.indexOf(Integer
.parseInt(infos[i])));
if (!name.equals(infos[i - 1])) {
if (client.c_singleFrames.containsKey(name)) {
Client_singleFrame cf = client.c_singleFrames
.get(name);
cf.setTitle(name);
client.c_singleFrames.remove(name);
client.c_singleFrames.put(name, cf);
cf.setVisible(false);
client.username_online.remove(name);
client.clientuserid.remove(new Integer(
Integer.parseInt(infos[i])));
client.username_online.add(0, infos[i - 1]);
client.clientuserid.add(0,
Integer.parseInt(infos[i]));
for (int i = 0; i &
client.username_online.size(); i++) {
info[i] = client.username_online.get(i);
} catch (Exception e) {
jlt_disUsers.removeAll();
jlt_disUsers.setListData(info);
public void closeClient() {
JOptionPane.showMessageDialog(this, "服务器已关闭", "提示",
JOptionPane.OK_OPTION);
client.exitClient();
setVisible(false);
public void valueChanged(ListSelectionEvent e) {
if (e.getSource() == jlt_disUsers) {
public void createSingleChatFrame(String name) {
Client_singleFrame c_singlFrame = new
Client_singleFrame(client, name);
client.c_singleFrames.put(name, c_singlFrame);
c_singlFrame.userThreadID = client.clientuserid
.get(client.username_online.indexOf(name));
} catch (Exception e) {
c_singlFrame.setVisible(true);
public void setSingleFrame(String chat_re) {
String[] infos = chat_re.split("@single");
if (client.c_singleFrames.containsKey(infos[0])) {
client.c_singleFrames.get(infos[0]).setDisMess(infos[3]);
createSingleChatFrame(infos[0]);
client.c_singleFrames.get(infos[0]).setDisMess(infos[3]);
} catch (Exception e) {
2=======================================================================================
package com.
import javax.swing.JF
import javax.swing.JL
import javax.swing.JOptionP
import javax.swing.UIM
import javax.swing.UnsupportedLookAndFeelEx
import java.awt.F
import java.awt.T
import java.awt.event.ActionE
import java.awt.event.ActionL
import java.awt.event.KeyE
import java.awt.event.KeyL
import java.awt.event.WindowA
import java.awt.event.WindowE
import java.net.Inet4A
import java.net.UnknownHostE
import javax.swing.JTextF
import javax.swing.JB
public class Client_enterFrame extends JFrame implements
ActionListener, KeyListener{
public Client_enterFrame(Client client) {
this.client =
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
} catch (InstantiationException e1) {
e1.printStackTrace();
} catch (IllegalAccessException e1) {
e1.printStackTrace();
} catch (UnsupportedLookAndFeelException e1) {
e1.printStackTrace();
setIconImage(Toolkit.getDefaultToolkit().getImage("Images/socket.jpg"));
setTitle("\u804A\u");
getContentPane().setLayout(null);
setSize(296, 249);
WinCenter.center(this);
setResizable(false);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
jbt_exit.doClick();
JLabel lblNewLabel = new JLabel("\u\u540D");
lblNewLabel.setFont(new Font("宋体", Font.PLAIN, 14));
lblNewLabel.setBounds(23, 30, 81, 34);
getContentPane().add(lblNewLabel);
jtf_username = new JTextField();
jtf_username.addKeyListener(this);
jtf_username.setBounds(114, 30, 143, 34);
getContentPane().add(jtf_username);
jtf_username.setColumns(10);
JLabel lblNewLabel_1 = new
JLabel("\u670D\u52A1\u\u5740");
lblNewLabel_1.setFont(new Font("宋体", Font.PLAIN, 14));
lblNewLabel_1.setBounds(23, 74, 81, 34);
getContentPane().add(lblNewLabel_1);
jtf_hostIp = new JTextField();
jtf_hostIp.setBounds(114, 74, 143, 34);
jtf_hostIp.addKeyListener(this);
getContentPane().add(jtf_hostIp);
String ip =
(String)Inet4Address.getLocalHost().getHostAddress();
jtf_hostIp.setText(ip);
} catch (UnknownHostException e) {
e.printStackTrace();
jtf_hostIp.setColumns(10);
JLabel lblNewLabel_2 = new JLabel("\u7AEF\u53E3\u53F7");
lblNewLabel_2.setFont(new Font("宋体", Font.PLAIN, 14));
lblNewLabel_2.setBounds(23, 118, 81, 34);
getContentPane().add(lblNewLabel_2);
jtf_hostPort = new JTextField();
jtf_hostPort.addKeyListener(this);
jtf_hostPort.setBounds(114, 118, 143, 34);
getContentPane().add(jtf_hostPort);
jtf_hostPort.setText("5000");
jtf_hostPort.setColumns(10);
jbt_enter = new
JButton("\u8FDB\uA\u");
jbt_enter.addActionListener(this);
jbt_enter.addKeyListener(this);
jbt_enter.setFont(new Font("宋体", Font.PLAIN, 14));
jbt_enter.setBounds(23, 162, 108, 39);
getContentPane().add(jbt_enter);
jbt_exit = new
JButton("\u9000\u51FA\u804A\u");
jbt_exit.setFont(new Font("宋体", Font.PLAIN, 14));
jbt_exit.setBounds(144, 162, 113, 39);
jbt_exit.addActionListener(this);
getContentPane().add(jbt_exit);
private static final long serialVersionUID = 1L;
private JTextField jtf_
private JTextField jtf_hostIp;
private JTextField jtf_hostP
private JButton jbt_
private JButton jbt_
public void actionPerformed(ActionEvent e) {
if(e.getSource() == jbt_exit){
setVisible(false);
client.exitLogin();
if(e.getSource() == jbt_enter){
String username = jtf_username.getText();
username.trim();
String hostIp = jtf_hostIp.getText();
hostIp.trim();
String hostPort = jtf_hostPort.getText();
hostPort.trim();
if(!username.equals("")){
if(!hostIp.equals("")){
if(!hostPort.equals("")){
String login_mess = client.login(username, hostIp,
hostPort);
if(login_mess.equals("true")){
this.setVisible(false);
client.showChatFrame(username);
JOptionPane.showMessageDialog(this, login_mess);
JOptionPane.showMessageDialog(this, "服务器连接端口号不能为空!");
JOptionPane.showMessageDialog(this, "服务器地址不能为空!");
JOptionPane.showMessageDialog(this, "用户名不能为空!");
public void keyPressed(KeyEvent arg0) {
if(arg0.getKeyCode() == KeyEvent.VK_ENTER){
jbt_enter.doClick();
public void keyReleased(KeyEvent arg0) {}
public void keyTyped(KeyEvent arg0) {}
3=====================================================================================
package com.
import java.awt.BorderL
import java.awt.C
import java.awt.T
import java.awt.event.ActionE
import java.awt.event.ActionL
import java.awt.event.KeyE
import java.awt.event.KeyL
import java.awt.event.WindowA
import java.awt.event.WindowE
import java.io.IOE
import java.text.SimpleDateF
import java.util.D
import javax.swing.BorderF
import javax.swing.JB
import javax.swing.JF
import javax.swing.JOptionP
import javax.swing.JP
import javax.swing.JScrollP
import javax.swing.JTextA
import javax.swing.JTextF
import javax.swing.UIM
import javax.swing.UnsupportedLookAndFeelEx
public class Client_singleFrame extends JFrame implements
ActionListener, KeyListener{
private static final long serialVersionUID = 1L;
private static JTextArea jta_disM
private JTextField jtf_inputM
private JButton jbt_
public int userThreadID = 0;
public Client_singleFrame(Client client, String title) {
this.client =
init(title);
private void init(String title) {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
} catch (InstantiationException e1) {
e1.printStackTrace();
} catch (IllegalAccessException e1) {
e1.printStackTrace();
} catch (UnsupportedLookAndFeelException e1) {
e1.printStackTrace();
setIconImage(Toolkit.getDefaultToolkit().getImage("Images/socket.jpg"));
WinCenter.center(this);
setTitle(title);
setSize(400, 400);
setResizable(false);
setContentPane(createContentPanel());
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
closeSingleFrame();
private Container createContentPanel() {
JPanel jp = new JPanel();
jp.setBorder(BorderFactory.createTitledBorder("聊天消息"));
jp.setLayout(new BorderLayout());
jta_disMess = new JTextArea();
jta_disMess.setEditable(false);
jp.add(BorderLayout.CENTER, new
JScrollPane(jta_disMess));
jp.add(BorderLayout.SOUTH, createInput());
private Component createInput() {
JPanel jp = new JPanel();
jp.setBorder(BorderFactory.createTitledBorder("发送消息"));
jp.setLayout(new BorderLayout());
jtf_inputMess = new JTextField();
jtf_inputMess.addKeyListener(this);
jbt_trans = new JButton("发送");
jbt_trans.addActionListener(this);
jp.add(jtf_inputMess, BorderLayout.CENTER);
jp.add(jbt_trans, BorderLayout.EAST);
public void keyPressed(KeyEvent arg0) {
if(arg0.getKeyCode() == KeyEvent.VK_ENTER){
if(arg0.getSource() == jtf_inputMess){
jbt_trans.doClick();
public void keyReleased(KeyEvent arg0) {}
public void keyTyped(KeyEvent arg0) {}
public void actionPerformed(ActionEvent e) {
if(e.getSource() == jbt_trans){
String str = jtf_inputMess.getText();
str.trim();
jtf_inputMess.setText("");
if(str.equals("")){
JOptionPane.showMessageDialog(this, "信息不能为空");
SimpleDateFormat form = new SimpleDateFormat("yyyy-MM-dd
String date = form.format(new Date());
String mess = client.username + " &" + date +
jta_disMess.append(mess + "\n");
jta_disMess.setCaretPosition(jta_disMess.getText().length());
int index =
client.username_online.indexOf(this.getTitle());
String info = client.username + "@single" +
client.getThreadID() + "@single" +
(int)client.clientuserid.get(index) + "@single"
mess + "@single";
client.dos.writeUTF(info);
} catch (IOException e1) {
e1.printStackTrace();
public void setDisMess(String chat_re) {
jta_disMess.append(chat_re + "\n");
jta_disMess.setCaretPosition(jta_disMess.getText().length());
public void closeSingleFrame(){
client.c_singleFrames.remove(this.getTitle());
setVisible(false);
public void setExitNotify() {
jta_disMess.append(this.getTitle() + "已下线.....");
jbt_trans.setEnabled(false);
4=======================================================================================
package com.
import java.io.DataInputS
import java.io.DataOutputS
import java.io.IOE
import java.net.S
import java.net.UnknownHostE
import java.util.ArrayL
import java.util.HashM
import java.util.L
import java.util.M
public class Client extends Thread{
public Socket c_
private Client_chatFrame c_chatF
private Client_enterFrame c_enterF
private Client_singleFrame c_singleF
public &DataInputStream dis =
public DataOutputStream dos =
private boolean flag_exit =
private int threadID;
public Map c_singleF
public &List username_
public String username =
public String chat_
//getter, setter方法
public Client_chatFrame getC_chatFrame() {
return c_chatF
public Client_singleFrame getC_singlFrame() {
return c_singleF
public void setC_singlFrame(Client_singleFrame c_singlFrame)
this.c_singleFrame = c_singlF
public void setC_chatFrame(Client_chatFrame c_chatFrame)
this.c_chatFrame = c_chatF
public Client_enterFrame getC_enterFrame() {
return c_enterF
public void setC_enterFrame(Client_enterFrame c_enterFrame)
this.c_enterFrame = c_enterF
public int getThreadID() {
return threadID;
public void setThreadID(int threadID) {
this.threadID = threadID;
public Client(){
c_singleFrames = new HashMap();
username_online = new ArrayList();
clientuserid = new ArrayList();
// signlechatuse = new ArrayList();
public static void main(String[] args) {
Client client = new Client();
Client_enterFrame c_enterFrame = new
Client_enterFrame(client);
client.setC_enterFrame(c_enterFrame);
c_enterFrame.setVisible(true);
public String login(String username, String hostIp, String
hostPort) {
this.username =
String login_mess =
c_socket = new Socket(hostIp,
Integer.parseInt(hostPort));
} catch (NumberFormatException e) {
login_mess = "连接的服务器端口号port为整数,取值范围为:1024
return login_
} catch (UnknownHostException e) {
login_mess = "主机地址错误";
return login_
} catch (IOException e) {
login_mess = "连接服务其失败,请稍后再试";
return login_
return "true";
public void showChatFrame(String username) {
getDataInit();
c_chatFrame = new Client_chatFrame(this,username);
c_chatFrame.setVisible(true);
flag_exit =
this.start();
private void getDataInit() {
dis = new DataInputStream(c_socket.getInputStream());
dos = new DataOutputStream(c_socket.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
public void run() {
while(flag_exit){
chat_re = dis.readUTF();
} catch (IOException e) {
flag_exit =
if(!chat_re.contains("@serverexit")){
if(chat_re != null){
if(chat_re.contains("@clientThread")){
int local = chat_re.indexOf("@clientThread");
setThreadID(Integer.parseInt(chat_re.substring(0,
dos.writeUTF(username + "@login" + getThreadID() +
"@login");
} catch (IOException e) {
e.printStackTrace();
if(chat_re.contains("@userlist")){
c_chatFrame.setDisUsers(chat_re);
if(chat_re.contains("@chat")){
c_chatFrame.setDisMess(chat_re);
if(chat_re.contains("@serverexit")){
c_chatFrame.closeClient();
if(chat_re.contains("@single")){
c_chatFrame.setSingleFrame(chat_re);
public void transMess(String mess) {
dos.writeUTF(username &+ "@chat" +
getThreadID() + "@chat"+ mess + "@chat");
} catch (IOException e) {
e.printStackTrace();
public void exitChat() {
dos.writeUTF(username + "@exit" + getThreadID() +
flag_exit =
System.exit(0);
} catch (IOException e) {
e.printStackTrace();
public void exitLogin() {
System.exit(0);
public void exitClient() {
flag_exit =
System.exit(0);
5.=========================================================================================
package com.
import java.awt.D
import java.awt.T
import java.awt.W
public class WinCenter {
public static void center(Window win){
Toolkit tkit = Toolkit.getDefaultToolkit();
Dimension sSize = tkit.getScreenSize();
Dimension wSize = win.getSize();
if(wSize.height & sSize.height){
wSize.height = sSize.
if(wSize.width & sSize.width){
wSize.width = sSize.
win.setLocation((sSize.width - wSize.width)/ 2, (sSize.height
- wSize.height)/ 2);
==================================================================================================服务器端
6个类:1.BroadCast 2.ClientThread 3.Server 4.ServerFrame
5.ServerThread 6.WinCenter
1=============================================================================================
package com.
import java.io.IOE
public class BroadCast extends Thread {
ClientThread clientT
ServerThread serverT
private boolean flag_exit =
public BroadCast(ServerThread serverThread){
this.serverThread = serverT
public void run() {
boolean flag =
while(flag_exit){
synchronized (serverThread.messages) {
if(serverThread.messages.isEmpty()){
str = (String)serverThread.messages.firstElement();
serverThread.messages.removeElement(str);
if(str.contains("@clientThread")){
synchronized (serverThread.clients) {
for(int i=0; i & serverThread.clients.size();
& clientThread =
serverThread.clients.elementAt(i);
& if(flag){
//向纪录的每一个客户端发送数据信息
if(str.contains("@exit")){
serverThread.clients.remove(i);
clientThread.closeClienthread(clientThread);
clientThread.dos.writeUTF(str);
& & if(str.contains("@chat") ||
str.contains("@userlist") || str.contains("@serverexit")){
clientThread.dos.writeUTF(str);
if(str.contains("@single")){
& & String[] info =
str.split("@single");
& & int id_thread =
Integer.parseInt(info[2]);
& & for(int j = 0; j
& serverThread.clients.size(); j++){
& & if(id_thread ==
serverThread.clients.get(j).getId()){
serverThread.clients.get(j).dos.writeUTF(str);
serverThread.clients.size();
catch(IOException E){}
& String value =
serverThread.users.get((int)clientThread.getId());
& if(value.equals("@login@")){
& & //向纪录的每一个客户端发送数据信息
& clientThread.dos.writeUTF(str);
& if(str.contains("@exit")){
& serverThread.clients.remove(i);
clientThread.closeClienthread(clientThread);
& & catch(IOException E){}
if(str.contains("@serverexit")){
serverThread.users.clear();
flag_exit =
public void setFlag_exit(boolean b) {
flag_exit =
public void stopBroadCase() {
flag_exit &=
2===============================================================================================
package com.
import java.io.DataInputS
import java.io.DataOutputS
import java.io.IOE
import java.net.S
import java.text.SimpleDateF
import java.util.D
public class ClientThread extends Thread {
public Socket clientS
public ServerThread serverT
public DataInputS
public DataOutputS
public String client_userID;
private boolean flag_exit =
public ClientThread(Socket socket, ServerThread
serverThread){
clientSocket =
this.serverThread = serverT
DataInputStream(clientSocket.getInputStream());
DataOutputStream(clientSocket.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
public void run() {
while(flag_exit){
String Message = dis.readUTF();
if(Message.contains("@login")){
String [] userInfo = Message.split("@login");
int userID = Integer.parseInt(userInfo[1]);
serverThread.users.remove(userID);
if(serverThread.users.containsValue(userInfo[0])){
for(int i = 0; i & serverThread.clients.size();
int id = (int)serverThread.clients.get(i).getId();
if(serverThread.users.get(id).equals(userInfo[0])){
serverThread.users.remove(id);
serverThread.users.put(id, userInfo[0] + "_" + id);
serverThread.users.put(Integer.parseInt(userInfo[1]),
userInfo[0] + "_" + userInfo[1]);
serverThread.users.put(userID, userInfo[0]);
StringBuffer sb = new StringBuffer();
synchronized (serverThread.clients) {
for(int i = 0; i & serverThread.clients.size();
int threadID = (int)
serverThread.clients.elementAt(i).getId();
sb.append((String)serverThread.users.get(new
Integer(threadID)) + "@userlist");
sb.append(threadID + "@userlist");
String userNames = new String(sb);
serverThread.serverFrame.setDisUsers(userNames);
Message = userN
if(Message.contains("@exit")){
String [] userInfo = Message.split("@exit");
int userID = Integer.parseInt(userInfo[1]);
serverThread.users.remove(userID);
StringBuffer sb = new StringBuffer();
synchronized (serverThread.clients) {
for(int i = 0; i & serverThread.clients.size();
int threadID = (int)
serverThread.clients.elementAt(i).getId();
if(userID == threadID){
serverThread.clients.removeElementAt(i);
sb.append((String)serverThread.users.get(new
Integer(threadID)) + "@userlist");
sb.append(threadID + "@userlist");
String userNames = new String(sb);
if(userNames.equals("")){
serverThread.serverFrame.setDisUsers("@userlist");
serverThread.serverFrame.setDisUsers(userNames);
Message = userN
if(Message.contains("@chat")){
String[] chat = Message.split("@chat");
StringBuffer sb = new StringBuffer();
SimpleDateFormat form = new SimpleDateFormat("yyyy-MM-dd
&HH:mm:ss");
String date = form.format(new Date());
sb.append(chat[0] + " &" + date +
sb.append(chat[2] + "@chat");
String str = new String(sb);
serverThread.serverFrame.setDisMess(Message);
if(Message.contains("@single")){
synchronized (serverThread.messages) {
if(Message != null){
serverThread.messages.addElement(Message);
if(Message.contains("@exit")){
this.clientSocket.close();
flag_exit =
} catch (IOException e) {}
public void closeClienthread(ClientThread clientThread)
if(clientThread.clientSocket != null){
clientThread.clientSocket.close();
} catch (IOException e) {
System.out.println("server's clientSocket is null");
setFlag_exit(false);
} catch (Throwable e) {
e.printStackTrace();
public void setFlag_exit(boolean b) {
flag_exit =
3.============================================================================================
package com.
public class Server {
private ServerFrame serverF
private ServerThread serverT
public ServerFrame getServerFrame() {
return serverF
public void setServerFrame(ServerFrame serverFrame) {
this.serverFrame = serverF
public Server(){}
public void startServer() {
serverThread = new ServerThread(serverFrame);
}catch(Exception e){
System.exit(0);
serverThread.setFlag_exit(true);
serverThread.start();
public void stopServer(){
synchronized (serverThread.messages) {
String str = "@serverexit";
serverThread.messages.add(str);
serverThread.serverFrame.setDisMess("@exit");
serverThread.serverFrame.setDisUsers("@exit");
serverThread.stopServer();
public static void main(String[] args) {
Server server = new Server();
ServerFrame serverFrame = new ServerFrame(server);
server.setServerFrame(serverFrame);
serverFrame.setVisible(true);
public void close() {
if(serverThread != null){
if(serverThread.isAlive()){
serverThread.stopServer();
System.exit(0);
4============================================================================================
package com.
import java.awt.T
import java.awt.event.ActionE
import java.awt.event.ActionL
import java.awt.event.WindowA
import java.awt.event.WindowE
import java.util.ArrayL
import java.util.L
import javax.swing.BorderF
import javax.swing.JF
import javax.swing.JB
import javax.swing.JOptionP
import javax.swing.JScrollP
import javax.swing.JTextA
import javax.swing.JL
import javax.swing.UIM
import javax.swing.UnsupportedLookAndFeelEx
public class ServerFrame extends JFrame implements
ActionListener {
private JButton jbt_
private JButton jbt_
private JButton jbt_
private JTextArea jta_disM
private JList jlt_disU
public List&String&
public List&Integer&
public ServerFrame(Server server) {
this.server =
online_usernames = new
ArrayList&String&();
online_usernameids = new
ArrayList&Integer&();
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (UnsupportedLookAndFeelException e) {
e.printStackTrace();
setTitle("\u670D\u52A1\u5668");
setIconImage(Toolkit.getDefaultToolkit().getImage("Images/socket.jpg"));
setSize(449, 301);
setResizable(false);
WinCenter.center(this);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent arg0) {
jbt_exit.doClick();
getContentPane().setLayout(null);
jbt_start = new
JButton("\u542F\u52A8\u670D\u52A1\u5668");
jbt_start.setBounds(32, 23, 103, 34);
jbt_start.addActionListener(this);
getContentPane().add(jbt_start);
jbt_stop = new
JButton("\u505C\u6B62\u670D\u52A1\u5668");
jbt_stop.setBounds(145, 23, 103, 34);
jbt_stop.setEnabled(false);
jbt_stop.addActionListener(this);
getContentPane().add(jbt_stop);
jbt_exit = new
JButton("\u9000\u51FA\u670D\u52A1\u5668");
jbt_exit.setBounds(258, 23, 103, 34);
jbt_exit.addActionListener(this);
getContentPane().add(jbt_exit);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(10, 64, 221, 192);
scrollPane.setWheelScrollingEnabled(true);
scrollPane.setBorder(BorderFactory.createTitledBorder("聊天消息"));
getContentPane().add(scrollPane);
jta_disMess = new JTextArea();
scrollPane.setViewportView(jta_disMess);
JScrollPane scrollPane_1 = new JScrollPane();
scrollPane_1.setBounds(258, 65, 157, 191);
scrollPane_1.setBorder(BorderFactory.createTitledBorder("在线用户"));
getContentPane().add(scrollPane_1);
jlt_disUsers = new JList();
jlt_disUsers.setVisibleRowCount(4);
scrollPane_1.setViewportView(jlt_disUsers);
private static final long serialVersionUID = 1L;
public void actionPerformed(ActionEvent arg0) {
if(arg0.getSource() == jbt_start){
jbt_start.setEnabled(false);
jbt_stop.setEnabled(true);
server.startServer();
if(arg0.getSource() == jbt_stop){
int flag = JOptionPane.showConfirmDialog(this, "是否要停止服务器?",
JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
& & & if(flag ==
JOptionPane.OK_OPTION){
server.stopServer();
jbt_start.setEnabled(true);
jbt_stop.setEnabled(false);
if(arg0.getSource() == jbt_exit){
if(jbt_stop.isEnabled()){
jbt_stop.doClick();
server.close();
public void setDisUsers(String userNames) {
if(userNames.equals("@userlist")){
jlt_disUsers.removeAll();
String[] user_null = new String[]{};
jlt_disUsers.setListData(user_null);
if(userNames.contains("@userlist")){
String[] dis = userNames.split("@userlist");
String [] disUsernames = new String[dis.length / 2];
int j = 0;
for(int i = 0; i & dis. i++){
disUsernames[j++] = dis[i++];
jlt_disUsers.removeAll();
jlt_disUsers.setListData(disUsernames);
if(userNames.contains("@exit")){
String[] dis = {};
jlt_disUsers.setListData(dis);
public void setDisMess(String message) {
if(message.contains("@chat")){
int local = message.indexOf("@chat");
jta_disMess.append(message.substring(0, local) + "\n");
jta_disMess.setCaretPosition(jta_disMess.getText().length());
if(message.contains("@exit")){
jta_disMess.setText("");
public void setStartAndStopUnable() {
JOptionPane.showMessageDialog(this, "不能同时开启两个服务器");
jbt_start.setEnabled(false);
jbt_stop.setEnabled(false);
5============================================================================================
package com.
import java.io.IOE
import java.net.ServerS
import java.net.S
import java.net.SocketE
import java.util.HashM
import java.util.M
import java.util.V
public class ServerThread extends Thread {
public ServerSocket serverS
public Vector&String&
public Vector&ClientThread&
public Map&Integer, String&
public BroadC
public int Port = 5000;
public boolean login =
public ServerFrame serverF
private boolean flag_exit =
public ServerThread(ServerFrame serverFrame){
this.serverFrame = serverF
messages = new
Vector&String&();
clients = new
Vector&ClientThread&();
users = new HashMap&Integer,
String&();
serverSocket = new ServerSocket(Port);
} catch (IOException e) {
this.serverFrame.setStartAndStopUnable();
System.exit(0);
broadcast = new BroadCast(this);
broadcast.setFlag_exit(true);
broadcast.start();
public void run() {
while(flag_exit){
if(serverSocket.isClosed()){
flag_exit =
socket = serverSocket.accept();
}catch(SocketException e){
flag_exit =
if(socket != null){
ClientThread clientThread = new ClientThread(socket,
clientThread.setFlag_exit(true);
clientThread.start();
synchronized (clients) {
clients.addElement(clientThread);
synchronized (messages) {
users.put((int) clientThread.getId(), "@login@");
messages.add(clientThread.getId() + "@clientThread");
} catch (IOException e) {
e.printStackTrace();
public void stopServer() {
if(this.isAlive()){
serverSocket.close();
setFlag_exit(false);
} catch (Throwable e) {}
public void setFlag_exit(boolean b) {
flag_exit =
6==============================================================================================
package com.
import java.awt.D
import java.awt.T
import java.awt.W
public class WinCenter {
public static void center(Window win){
Toolkit tkit = Toolkit.getDefaultToolkit();
Dimension sSize = tkit.getScreenSize();
Dimension wSize = win.getSize();
if(wSize.height & sSize.height){
wSize.height = sSize.
if(wSize.width & sSize.width){
wSize.width = sSize.
win.setLocation((sSize.width - wSize.width)/ 2, (sSize.height
- wSize.height)/ 2);
================================================================================================
以上的为聊天室的源码,希望对大家有帮助!!!
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 java web聊天室源代码 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信