Professional Documents
Culture Documents
(123doc) - Tai-Lieu-Do-An-Chat-Clientserver-Client-Server-Java
(123doc) - Tai-Lieu-Do-An-Chat-Clientserver-Client-Server-Java
Mục Lục
I. Tổng quan về đề tài ..................................................................................................... 3
1. Cơ sở lý thuyết ....................................................................................................... 3
2. Phân tích và thiết kế hệ thống ................................................................................ 3
2.1 Phân tích yêu cầu bài toán .................................................................................. 3
2.2 Thiết kế chương trình ......................................................................................... 3
II. Hướng dẫn cài đặt và chạy Demo chương trình .......................................................... 7
1. Hướng dẫn cài đặt .................................................................................................. 7
2. Chạy Demo Chương trình ...................................................................................... 7
III. Kết Luận và hướng phát triển .................................................................................. 13
1. Những kết quả đạt được ....................................................................................... 13
2. Những vấn đề tồn tại ............................................................................................ 13
3. Hướng phát triển .................................................................................................. 13
IV. Source code ............................................................................................................. 14
1. Chương trình bên Server ...................................................................................... 14
1.1 Database class ................................................................................................... 14
1.2 Message class ................................................................................................... 19
1.3 ServerFrame class ............................................................................................. 19
1.4 SocketServer class ............................................................................................ 23
2. Chương trình bên Client....................................................................................... 35
2.1 Download class ................................................................................................. 35
2.2 History class ..................................................................................................... 37
2.3 Message class ................................................................................................... 40
2.4 SocketClient class ............................................................................................. 40
2.5 Upload class ...................................................................................................... 48
2.6 ChatFrame class ................................................................................................ 50
2.7 HistoryFrame class ........................................................................................... 69
Tài Liệu tham khảo ............................................................................................................ 74
Server cập nhật trạng thái của các Client và in thông tin ngay tại trên Server và đồng
thời gửi xuống cho các Client
Hính 2.3 Chạy Client Kết nối và đăng nhập thành công
Sau khi Server đã được bật thì đã kết nối được thành công
Tiến hành kết nối và đăng nhập thêm nhiều Client khác
Hình 2.6 Thông báo đến các Client khi có Nick đăng xuất
Hình 2.7 Thông báo trên Server khi có Client thoát, tiến hành giải phóng tài nguyên
và tiếp tục chờ đợi các Client
Hình 2.8 Server gửi thông báo cho Thế Phong không cho phép gửi tập tin cho tất cả
mọi người
Tiếp theo sẽ sử dụng kịch bản: Thế Phong gửi File cho Đỗ Thanh. TH1 Đỗ Thanh
từ chối Download, TH2 Đỗ Thanh Download
Hình 2.9 Thông báo khi Thế Phong gửi cho Đỗ Thanh tệp tin.
Hình 2.10 Thông báo Đỗ Thanh không chấp nhận tập tin
Hình 2.11 Đỗ Thanh chấp nhận Download và thông báo đến 2 người đó
import java.io.*;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.*;
try {
File fXmlFile = new File(filePath);
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
// Bình thường hóa văn bản
doc.getDocumentElement().normalize();
return false;
}
}
if (!userExists(username))
{
return false;
}
try {
File fXmlFile = new File(filePath);
DocumentBuilderFactory db = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = db.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
doc.getDocumentElement().normalize();
try {
DocumentBuilderFactory db = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = db.newDocumentBuilder();
Document doc = dBuilder.parse(filePath);
// Tạo 1 node
Node data = doc.getFirstChild();
// Thêm 1 user
import java.io.Serializable;
@Override
public String toString(){
return "{type='"+type+"', sender='"+sender+"', content='"+content+"',
recipient='"+recipient+"'}";
}
}
1.3 ServerFrame class
package com.socket;
import javax.swing.UIManager;
public ServerFrame() {
initComponents();
this.setTitle("Server Chat");
txtThongBao.setEditable(false);
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("jServer");
btnStart.setText("Start Server");
btnStart.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnStartActionPerformed(evt);
}
});
txtThongBao.setColumns(20);
txtThongBao.setFont(new java.awt.Font("Consolas", 0, 12)); // NOI18N
txtThongBao.setRows(5);
jScrollPane1.setViewportView(txtThongBao);
pack();
}// </editor-fold>
try{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch(Exception ex){
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new ServerFrame().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton btnStart;
private javax.swing.JScrollPane jScrollPane1;
public javax.swing.JTextArea txtThongBao;
// End of variables declaration
}
1.4 SocketServer class
package com.socket;
import java.io.*;
import java.net.*;
@SuppressWarnings("deprecation")
@Override
// Mỗi Thread khởi động ==> không phải viết lại pt Stream
public void open() throws IOException {
Out = new ObjectOutputStream(socket.getOutputStream());
Out.flush();
In = new ObjectInputStream(socket.getInputStream());
}
}
if (In != null) {
In.close();
}
if (Out != null) {
Out.close();
}
}
}
try {
try {
server = new ServerSocket(port);
port = server.getLocalPort();
ui.txtThongBao.append("Server bắt đầu hoạt động... IP : " +
InetAddress.getLocalHost() + ", Port : " + server.getLocalPort());
start();
} catch (IOException ioe) {
@SuppressWarnings("deprecation")
public void stop() {
if (thread != null) {
thread = null;
}
}
if (db.checkLogin(msg.sender, msg.content))
{
clients[findClient(ID)].username = msg.sender;
clients[findClient(ID)].send(new Message("login", "SERVER", "TRUE",
msg.sender));
ThongBao("newuser", "SERVER", msg.sender);
SendUserList(msg.sender);
} else
{
clients[findClient(ID)].send(new Message("login", "SERVER", "FALSE",
msg.sender));
}
} else
{
clients[findClient(ID)].send(new Message("login", "SERVER", "FALSE",
msg.sender));
}
} else if (msg.type.equals("message"))
{
if (msg.recipient.equals("All")) {
ThongBao("message", msg.sender, msg.content);
} else {
findUserThread(msg.recipient).send(new Message(msg.type, msg.sender,
msg.content, msg.recipient));
clients[findClient(ID)].send(new Message(msg.type, msg.sender,
msg.content, msg.recipient));
}
} else if (msg.type.equals("test"))
{
clients[findClient(ID)].send(new Message("test", "SERVER", "OK",
msg.sender));
} else if (msg.type.equals("signup"))
{
if (findUserThread(msg.sender) == null)
{
if (!db.userExists(msg.sender)) {
db.addUser(msg.sender, msg.content);
clients[findClient(ID)].username = msg.sender;
clients[findClient(ID)].send(new Message("signup", "SERVER",
"TRUE", msg.sender));
clients[findClient(ID)].send(new Message("login", "SERVER", "TRUE",
msg.sender));
ThongBao("newuser", "SERVER", msg.sender);
SendUserList(msg.sender);
} else {
clients[findClient(ID)].send(new Message("signup", "SERVER",
"FALSE", msg.sender));
}
} else
{
clients[findClient(ID)].send(new Message("signup", "SERVER", "FALSE",
msg.sender));
}
} else if (msg.type.equals("upload_req")) {
if (msg.recipient.equals("All")) {
}
}
@SuppressWarnings("deprecation")
public synchronized void remove(int ID) {
int pos = findClient(ID);
if (pos >= 0) {
ServerThread toTerminate = clients[pos];
ui.txtThongBao.append("\nXóa bỏ Client: " + ID + " at " + pos);
if (pos < clientCount - 1) {
import com.ui.ChatFrame;
import java.io.*;
import java.net.*;
this.saveTo = saveTo;
this.ui = ui;
}
catch (IOException ex) {
}
}
@Override
public void run() {
try {
socket = server.accept();
System.out.println("Download : "+socket.getRemoteSocketAddress());
In = socket.getInputStream();
Out = new FileOutputStream(saveTo);
Out.flush();
import java.io.*;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.*;
import com.ui.HistoryFrame;
import javax.swing.table.DefaultTableModel;
try {
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.parse(filePath);
message.appendChild(_sender); message.appendChild(_content);
message.appendChild(_recipient); message.appendChild(_time);
data.appendChild(message);
}
catch(Exception ex){
System.out.println("Exceptionmodify xml");
}
}
try{
File fXmlFile = new File(filePath);
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
doc.getDocumentElement().normalize();
import com.ui.ChatFrame;
import java.io.*;
import java.net.*;
import java.util.Date;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;
hist = ui.hist;
@Override
public void run() {
while (true) {
try {
Message msg = (Message) In.readObject();
System.out.println("Nhận vào : " + msg.toString());
//Gửi tin nhắn dưới loại message
if (msg.type.equals("message")) {
if (msg.recipient.equals(ui.username)) {
ui.txtAreaChat.append("[" + msg.sender + " > Me] : " + msg.content +
"\n");
} else {
ui.txtAreaChat.append("[" + msg.sender + " > " + msg.recipient + "] : " +
msg.content + "\n");
}
// Lưu vào lịch sử
if (!msg.content.equals(".bye") && !msg.sender.equals(ui.username)) {
String msgTime = (new Date()).toString();
try {
hist.addMessage(msg, msgTime);
DefaultTableModel table = (DefaultTableModel)
ui.historyFrame.jTable1.getModel();
table.addRow(new Object[]{msg.sender, msg.content, "Me",
msgTime});
} catch (Exception ex) {
}
}
// Đăng nhập tk với loại login
} else if (msg.type.equals("login")) {
if (msg.content.equals("TRUE")) {
ui.btnNhatKy.setEnabled(true);
ui.btnDangNhap.setEnabled(false);
ui.btnDangKy.setEnabled(false);
ui.btnChat.setEnabled(true);
ui.btnFile.setEnabled(true);
ui.txtAreaChat.append("[Thông Báo] : Đăng nhập thành công!\n");
ui.txtname.setEnabled(false);
ui.txtPass.setEnabled(false);
} else {
ui.txtAreaChat.append("[Thông Báo] : Lỗi đăng nhập.\n");
}
// Kết nối vào server loại test
} else if (msg.type.equals("test")) {
ui.btnKetNoi.setEnabled(false);
ui.btnDangNhap.setEnabled(true);
ui.btnDangKy.setEnabled(true);
ui.txtname.setEnabled(true);
ui.txtPass.setEnabled(true);
ui.txtAddress.setEditable(false);
ui.txtPort.setEditable(false);
} else if (msg.type.equals("newuser")) {
if (!msg.content.equals(ui.username)) {
boolean exists = false;
for (int i = 0; i < ui.model.getSize(); i++) {
if (ui.model.getElementAt(i).equals(msg.content)) {
exists = true;
break;
}
}
if (!exists) {
ui.model.addElement(msg.content);
}
}
} else if (msg.type.equals("signup")) {
if (msg.content.equals("TRUE")) {
ui.btnNhatKy.setEnabled(true);
ui.btnDangNhap.setEnabled(false);
ui.btnDangKy.setEnabled(false);
ui.btnChat.setEnabled(true);
ui.btnFile.setEnabled(true);
ui.txtAreaChat.append("[Thông Báo] : Đăng ký thành công!\n");
} else {
ui.txtAreaChat.append("[Thông Báo] : Lỗi đăng ký.\n");
}
} else if (msg.type.equals("signout")) {
if (msg.content.equals(ui.username)) {
ui.txtAreaChat.append("[" + msg.sender + " > Me] : Tạm biệt\n");
ui.btnKetNoi.setEnabled(true);
ui.btnChat.setEnabled(false);
ui.txtAddress.setEditable(true);
ui.txtPort.setEditable(true);
ui.clientThread.stop();
} else {
ui.model.removeElement(msg.content);
ui.txtAreaChat.append("[Thông Báo] : thành viên " + msg.content + " đã
đăng xuất\n");
}
} else if (msg.type.equals("upload_req")) {
ui.btnFile.setEnabled(false);
ui.btnGuiFile.setEnabled(false);
Upload upl = new Upload(addr, port, ui.file, ui);
Thread t = new Thread(upl);
t.start();
} else {
ui.txtAreaChat.append("[Thông Báo] : " + msg.sender + " đã từ chối
Download\n");
}
} else {
ui.txtAreaChat.append("[Thông Báo] : Lỗi \n");
}
} catch (Exception ex) {
ui.txtAreaChat.append("[Thông Báo] : Không có kết nối\n");
ui.btnKetNoi.setEnabled(true);
ui.txtAddress.setEditable(true);
ui.txtPort.setEditable(true);
ui.btnChat.setEnabled(false);
ui.btnFile.setEnabled(false);
ui.btnFile.setEnabled(false);
ui.clientThread.stop();
ex.printStackTrace();
}
}
}
import com.ui.ChatFrame;
import java.io.*;
import java.net.*;
@Override
public void run() {
try {
byte[] buffer = new byte[1024];
int count;
}
2.6 ChatFrame class
package com.ui;
import com.socket.History;
import com.socket.Message;
import com.socket.SocketClient;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.File;
import java.io.IOException;
import javax.swing.DefaultListModel;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.UIManager;
public ChatFrame() {
initComponents();
this.setTitle("Chương Trình Chát");
model.addElement("All");
listOnline.setSelectedIndex(0);
this.addWindowListener(new WindowListener() {
@Override
public void windowOpened(WindowEvent e) {
}
@Override
public void windowClosing(WindowEvent e) {
try {
client.send(new Message("message", username, ".bye", "SERVER"));
clientThread.stop();
} catch (Exception ex) {
}
}
@Override
public void windowClosed(WindowEvent e) {
}
@Override
public void windowIconified(WindowEvent e) {
}
@Override
public void windowDeiconified(WindowEvent e) {
@Override
public void windowActivated(WindowEvent e) {
}
@Override
public void windowDeactivated(WindowEvent e) {
}
});
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
txtAddress.setText("localhost");
txtPort.setText("9999");
txtPort.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
txtPortActionPerformed(evt);
}
});
btnKetNoi.setText("Kết Nối");
btnKetNoi.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnKetNoiActionPerformed(evt);
}
});
txtname.setEnabled(false);
jLabel3.setText("Password :");
jLabel4.setText("Nick Name");
btnDangKy.setText("Đăng Ký");
btnDangKy.setEnabled(false);
btnDangKy.addActionListener(new java.awt.event.ActionListener() {
txtPass.setEnabled(false);
txtAreaChat.setEditable(false);
txtAreaChat.setColumns(20);
txtAreaChat.setFont(new java.awt.Font("Consolas", 0, 12)); // NOI18N
txtAreaChat.setRows(5);
jScrollPane1.setViewportView(txtAreaChat);
jLabel5.setText("Message : ");
txtChat.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
txtChatActionPerformed(evt);
}
});
btnChat.setText("Gửi");
btnChat.setEnabled(false);
btnChat.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnChatActionPerformed(evt);
}
});
btnDangNhap.setText("Đăng nhập");
btnDangNhap.setEnabled(false);
btnDangNhap.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnDangNhapActionPerformed(evt);
}
});
btnFile.setText("...");
btnFile.setEnabled(false);
btnFile.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnFileActionPerformed(evt);
}
});
btnGuiFile.setText("Up File");
btnGuiFile.setEnabled(false);
btnGuiFile.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnGuiFileActionPerformed(evt);
}
});
jLabel6.setText("File :");
btnNhatKy.setText("Nhật Ký");
btnNhatKy.setEnabled(false);
btnNhatKy.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnNhatKyActionPerformed(evt);
}
});
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jSeparator2)
.addComponent(jSeparator1,
javax.swing.GroupLayout.Alignment.TRAILING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING,
layout.createSequentialGroup()
.addComponent(jScrollPane1)
.addGap(18, 18, 18)
.addComponent(jScrollPane2,
javax.swing.GroupLayout.PREFERRED_SIZE, 108,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(layout.createSequentialGroup()
.addGap(23, 23, 23)
.addComponent(jLabel6)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(txtUpFile,
javax.swing.GroupLayout.PREFERRED_SIZE, 378,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18, 18)
.addComponent(btnFile,
javax.swing.GroupLayout.PREFERRED_SIZE, 27,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(btnGuiFile,
javax.swing.GroupLayout.PREFERRED_SIZE, 77,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(0, 0, Short.MAX_VALUE))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING,
layout.createSequentialGroup()
.addComponent(jLabel5)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(txtChat)
.addGap(18, 18, 18)
.addComponent(btnChat,
javax.swing.GroupLayout.PREFERRED_SIZE, 108,
javax.swing.GroupLayout.PREFERRED_SIZE))))
.addGroup(layout.createSequentialGroup()
.addGap(23, 23, 23)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addGroup(layout.createSequentialGroup()
.addGap(453, 453, 453)
.addComponent(btnNhatKy,
javax.swing.GroupLayout.PREFERRED_SIZE, 81,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(javax.swing.GroupLayout.Alignment.LEADING,
layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jLabel1)
.addComponent(jLabel4))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(txtname)
.addComponent(txtAddress))
.addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(jLabel2)
.addComponent(jLabel3))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(txtPort)
.addComponent(txtPass))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING,
false)
.addComponent(btnKetNoi,
javax.swing.GroupLayout.Alignment.TRAILING,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING,
layout.createSequentialGroup()
.addComponent(btnDangNhap)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(btnDangKy,
javax.swing.GroupLayout.PREFERRED_SIZE, 81,
javax.swing.GroupLayout.PREFERRED_SIZE)))))))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE
)
.addComponent(jLabel1)
.addComponent(txtAddress, javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel2)
.addComponent(txtPort, javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(btnKetNoi))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE
)
.addComponent(txtname, javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel3)
.addComponent(jLabel4)
.addComponent(btnDangKy)
.addComponent(txtPass, javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(btnDangNhap))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED,
11, Short.MAX_VALUE)
.addComponent(btnNhatKy)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE,
10, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING,
false)
.addComponent(jScrollPane1)
.addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE,
264, Short.MAX_VALUE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE
)
.addComponent(btnChat)
.addComponent(jLabel5)
.addComponent(txtChat, javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jSeparator2, javax.swing.GroupLayout.PREFERRED_SIZE,
10, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE,
false)
.addComponent(btnGuiFile, javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(btnFile, javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jLabel6)
.addComponent(txtUpFile, javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap())
);
pack();
}// </editor-fold>
if (file != null) {
if (!file.getName().isEmpty()) {
btnGuiFile.setEnabled(true);
String str;
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception ex) {
}
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new ChatFrame().setVisible(true);
}
});
}
// Variables declaration - do not modify
public javax.swing.JButton btnChat;
public javax.swing.JButton btnDangKy;
public javax.swing.JButton btnDangNhap;
public javax.swing.JButton btnFile;
public javax.swing.JButton btnGuiFile;
public javax.swing.JButton btnKetNoi;
public javax.swing.JButton btnNhatKy;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel6;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
import com.socket.History;
public HistoryFrame() {
initComponents();
}
this.hist = hist;
hist.FillTable(this);
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("Chat History");
jLabel1.setText("History : ");
jTable1.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
},
new String [] {
"Sender", "Message", "To", "Time"
}
){
Class[] types = new Class [] {
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel1)
.addGap(0, 0, Short.MAX_VALUE))
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE,
485, Short.MAX_VALUE))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jLabel1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE,
289, Short.MAX_VALUE)
.addContainerGap())
);
pack();
}// </editor-fold>
java.util.logging.Logger.getLogger(HistoryFrame.class.getName()).log(java.util.logging.
Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(HistoryFrame.class.getName()).log(java.util.logging.
Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(HistoryFrame.class.getName()).log(java.util.logging.
Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(HistoryFrame.class.getName()).log(java.util.logging.
Level.SEVERE, null, ex);
}
//</editor-fold>