Lập Trình Mạng
ĐẠI HỌC ĐÀ NẴNG
TRƯỜNG ĐẠI HỌC BÁCH KHOA
TIỂU LUẬN MÔN
LẬP TRÌNH MẠNG
LẬP TRÌNH MẠNG
Đề tài :
ĐỒNG BỘ HÓA VÀ GẮN BÓ DỮ LIỆU THÔNG
QUA MỘT BÀI TOÁN CỤ THỂ
GV hướng dẫn : PGS TS. LÊ VĂN SƠN
Chuyên ngành : Khoa Học Máy Tính
Khóa : K24
Học viên : Lê Quang Vũ
HVTH: Lê Quang Vũ
1
ĐÀ NẴNG, 05/2012
Lập Trình Mạng
LỜI MỞ ĐẦU
Sự bùng nổ của mạng Internet toàn cầu cùng với các ứng dụng của nó đã đem lại
cho xã hội một cuộc sống tiện nghi và hiện đại. Mạng internet đã giúp cho con người
bước vào một kỷ nguyên công nghệ thông tin và tri thức, mang lại khả năng kết nối
gần nhau hơn và giải quyết các vấn đề lớn một cách gọn gàng và có hợp tác.
Trong thời điểm này lĩnh vực hệ phân tán trong tin học đóng một vai trò hết sức
quan trọng. Vận dụng các kiến thức của hệ phân tán ta có thể giải quyết các bài toán
lớn một cách dễ dàng bằng cách chia sẻ cách thức giải quyết thông qua các máy con
nhằm tiết kiệm thời gian và công sức hơn khi giải quyết trên hệ tập trung.
Trong phạm vi của tiểu luận này tôi chỉ đề cập đến một khía cạnh nhỏ trong hệ
lập trình mạng đó là “Đồng bộ hóa và gắn bó dữ liệu thông qua một bài toán cụ
thể”. Thông qua chương trình ta sẽ thấy rõ bài toán đồng bộ hóa và gắn bó dữ liệu là
bài toán có ứng dụng hữu ích và thiết thực trong đời sống và trong các sản phẩm của
lập trình mạng.
Tôi cũng xin chân thành cảm ơn PGS.TS Lê Văn Sơn và các bạn đồng môn đã
giúp tôi hoàn thành tiểu luận này.
HVTH: Lê Quang Vũ
2
Lập Trình Mạng
YÊU CẦU ĐỀ TÀI
1. Ta cài đặt trên N trạm một “ảnh” của công tơ sự kiện phân tán, được tăng một
số gia truyền cho mỗi lần sự kiện đến. Bạn hãy cho biết các vấn đề gì sẽ đặt ra
khi ta sử dụng phương pháp này.
2. Đây là bài toán đồng bộ hóa và gắn bó dữ liệu.
3. Hãy viết chương trình cho biết giá trị “ảnh” của các công tơ.
HVTH: Lê Quang Vũ
3
Lập Trình Mạng
PHẦN I: CƠ SỞ LÝ THUYẾT
CHƯƠNG I: TỔNG QUAN VỀ HỆ PHÂN TÁN VÀ LẬP TRÌNH MẠNG
1. Hệ phân tán (Distributed System):
Hệ tin học phân tán là một hệ thống đa dạng, nhiều thành phần và phức tạp về
mặt cấu trúc, là vùng tri thức hiện đại đang được các chuyên gia công nghệ thông tin
đặc biệt quan tâm nghiên cứu và phát triển ứng dụng hiện nay.
Hình 1. Các lĩnh vực có hệ thống phân tán
Hay hệ phân tán là một tập hợp các máy tính độc lập mà xuất hiện đối với các
người sử dụng như một máy tính đơn. Với các đặc điểm:
Nhiều bộ phận.
Kết nối thông qua mạng truyền thông.
Chia xẻ các tài nguyên.
(Theo Andrew Tanenbanum)
HVTH: Lê Quang Vũ
4
Lập Trình Mạng
Hình 2. Một phần của mạng Internet
Nói chung, một định nghĩa phổ biến và khá đầy đủ về hệ phân tán được trình bày
như sau:
“Hệ tin học phân tán hay nói ngắn gọn là hệ phân tán (Distributed System) là hệ
thống xử lý thông tin bao gồm nhiều bộ xử lý hoặc bộ vi xử lý nằm các tại các vị trí
khác nhau và được liên kết với nhau thông qua phương tiện viễn thông dưới sự điều
khiển thống nhất của một hệ điều hành.”
Mục tiêu của hệ phân tán:
Tăng tốc độ bình quân trong tính toán, xử lý.
Cải thiện tình trạng luôn luôn sẵn sàng của các loại tài nguyên.
Tăng độ an toàn cho dữ liệu.
Đa dạng hóa các loại hình dịch vụ tin học
Đảm bảo tính toàn vẹn của thông tin.
HVTH: Lê Quang Vũ
5
Lập Trình Mạng
2. Các mô hình hệ phân tán và ứng dụng mạng:
Các lớp phần mềm:
Kiến trúc phần mềm: cấu trúc của phần mềm như là các lớp và các module trong
các thuật ngữ của các dịch vụ đưa ra và yêu cầu giữa các tiến trình trên cùng hoặc
trên các máy tính khác nhau.
Platform (hệ nền): phần cứng mức thấp nhất và các lớp phần mềm (hệ điều hành).
Middleware: một lớp của phần mềm mà mục đích của nó là đánh dấu
heterogeneity và để cung cấp một mô hình lập trình cho các ứng dụng, như: CORBA,
RMI (Remote Method Invocation), DCOM (Distributed Component Object
Model),
3. Kiến trúc hệ thống:
3.1.Mô hình Client/Server:
Hình 3- Mô hình Client/Server
Một WebServer thường là một client của một File Server cục bộ.
HVTH: Lê Quang Vũ
6
Lập Trình Mạng
Các WebServer và các Server của Internet khác là các client của một DNS Server
cái mà dịch các tên miền Internet thành các địa chỉ mạng.
Một máy tìm kiếm là một Server, nhưng nó chạy chương trình được gọi là Web
Crawlers cái mà truy cập các Web server thông qua Internet cho thông tin yêu cầu.
Dịch vụ cung cấp bởi nhiều server:
Hình 4- Dịch vụ được cung cấp bởi nhiều server
Nhiều Server có thể:
Mỗi phần là một tập hợp các đối tượng.
Duy trì các bản sao của toàn bộ tập hợp các đối tượng trên một vài máy.
Ví dụ Web Proxy Server:
Hình 5. Proxy Server
Web Proxy Server cung cấp một bộ nhớ cache chia xẻ cho các máy client tại một
site hoặc băng qua một vài site khác nhau.
3.2.Mô hình tương tác trong hệ phân tán:
Thực hiện truyền thông:
o Sự tiềm ẩn (Latency):
HVTH: Lê Quang Vũ
7
Lập Trình Mạng
Sự trì hoãn lan truyền: thời gian cần thiết để một bit đầu tiên của
một thông điệp truyền đến được đích.
Sự trì hoãn truyền: là khoảng thời gian giữa sự truyền bit đầu
tiên và bit sau cùng của một thông điệp.
Sự trì hoãn xử lý: là thời gian cần để hệ điều hành xử lý/gửi/nhận
thông điệp.
Sự trì hoãn xếp hàng: thời gian cần để một thông điệp xếp hàng
ở cuối máy chủ hoặc ở các node trung gian đợi để truyền đi.
o Băng thông (bandwidth): Tổng số thông tin có thể được truyền đi trong
một thời gian đã cho.
o Sự biến đống tạp (Jitter): thời gian khác nhau giữa các sự trì hoãn ảnh
hưởng bởi các thông điệp khác nhau.
Đồng hồ và thứ tự các sự kiện:
o Không có khái niệm toàn cục của thời gian.
o Nhịp độ đồng hồ trôi: nhịp độ tương đối ở một đồng hồ máy tính trôi
dạt ra khỏi từ một đồng hồ tham chiếu hoàn hảo.
Đồng bộ hóa đồng hồ:
o Hệ thống định vị toàn cầu (GPS): một ít máy tính có thể sử dụng máy
thu radio để nhận thời gian đọc từ GPS với độ chính xác là 1 micro-
giây. Chúng có thể gửi các thông điệp thời gian đến các máy tính khác
trong mạng tương ứng của chúng.
o Các đồng hồ logic: mỗi thông điệp là thời gian đóng dấu lên với một số
nối tiếp mà phản chiếu thứ tự lôgic của chúng.
HVTH: Lê Quang Vũ
8
Lập Trình Mạng
CHƯƠNG II: CÁC VẤN ĐỀ ĐẶT RA VÀ CÁCH GIẢI QUYẾT
1. Đặt vấn đề
Xét bài tóan quen thuộc người sản xuất – người tiêu thụ, trong đó khả năng tiêu
thụ là nguyên nhân chính hạn chế số lượng hàng hóa sản xuất để nó không vượt qúa
số lượng tiêu thụ một giá trị lớn hơn N. Người sản xuất P và người tiêu thụ C là hai
người nằm trên hai trạm cách xa nhau.
Giả sử rằng NP là số lượng sản xuất ra và NC là số lượng tiêu thụ tại thời
điểm khởi sự. C chỉ tiêu thụ được một sản phẩm, nếu sản xuất sản phẩm đó đã diễn
ra, có nghĩa là, nếu:
NP-NC>0 (1)
Tương tự, P chỉ sản xuất một thông tin, nếu
NP-NC <N (2)
Hai quan hệ này thể hiện các điều kiện của việc đồng bộ hóa và có thể mô tả
trong hình sau:
HVTH: Lê Quang Vũ
9
P
1
C
1
P
2
C
2
P
i
C
i
P
i+N
C
i+1
P
i+N+1
P
i
: Sản xuất thứ i
C
i
: Tiêu thụ thứ i
Lập Trình Mạng
Trong hệ thống phân tán, người ta có thể vận dụng hợp lực này theo kiểu như sau:
1. Ta đưa vào:
STT Diễn giải
1 Trên trạm P một biến NP thể hiện số lượng chính xác sản xuất đã có
2 Trên trạm C một biến NC thể hiện số lượng chính xác tiêu thụ đã thực
hiện
2. Ta đưa vào
STT Diễn giải
1 Trên trạm P một biến NC’ ảnh của NC mà P gia tăng mỗi một lần
nó nhận được thông điệp từ C báo cho nó biết là tiêu thụ mới đã
diển ra.
2 Trên trạm C một biến NP’ ảnh của NP mà C gia tăng mỗi một lần
nó nhận thông điệp từ P báo cho nó biết một sản xuất mới đã diễn
ra.
Một sự đồng bộ hóa chính xác được đảm bảo bằng việc xác nhận trên mỗi trạm
các điều kiện sau đây:
1. Trên trạm sản xuất: NP’-NC > 0 (3)
2. Trên trạm tiêu thụ: NP-NC’ < N (4)
Thực tế ta có thể viết
NP=NP’+np, với np ≥ 0, (5)
Trong đó, np số lượng thông tin đã sản xuất bởi P mà C không biết,
NC = NC’ + nc, với nc ≥ 0 (6)
Trong đó nc số lượng thông tin đã tiêu thụ bởi C mà P không biết.
Không cần tính đến (5) và (6), các điều kiện (3) và (4) bao hàm các điều kiện
ban đầu nêu trong (1) và (2).
* Ta có thể khái quát hóa phương pháp này cho điều kiện đồng bộ hóa bằng công
thức:
∑ C
i
X
i
> K (theo i)
Trong đó, C
i
và K là các hằng số. Ta hoàn toàn có khả năng và điều kiện mạnh
hơn bằng cách thay thế tất cả các X
i
mà hệ số của nó là đại lượng dương bằng các
ảnh của nó X’
i
nếu và chỉ nếu các X
i
là các biến không lùi.
HVTH: Lê Quang Vũ
10
Lập Trình Mạng
Việc vận dụng thông thường của vấn đề này trên hệ thống tập trung sử dụng loại
trừ tương hỗ để truy cập đến các biến trạng thái chia sẽ đượcbiểu hiện chính xác số
lượng sản xuất và tiêu thụ. Điều đó cho ta một trật tự tổng quát giữa các sự kiện phối
hợp ngay từ đầu sản xuất và tiêu thụ.
Vì nguyên nhân xa cách giữa người sản xuất và người tiêu thụ mà trật tự tổng
quát này không cần thiết và chỉ cần sử dụng để đồng bộ hóa các bản sao các biến
trạng thái gần đúng là đủ.
*Trong hệ thống người sản xuất – người tiêu thụ, nếu N=1 thì có sự liên kết chặt
chẽ giữa hai tiến trình cho phép xác định một trật tự chặt chẽ giữa các sự kiện.
2. Các công tơ sự kiện
Trong bài tóan người sản xuất – người tiêu thụ vấn đề sử dụng các biến trạng thái
không lùi cho phép sử dụng các bản sao gần đúng của các biến loại này. Cơ chế đồng
bộ gọi là các công tơ sự kiện thích hợp với các vấn đề đặt ra.
Mỗi một công tơ, biến nguyên không lùi, được kết hợp với một nhóm đặc biệt các
sự kiện.
Trên một công tơ sự kiện nào đó có phối hợp với nhóm E được xác định bởi ba
hàm nguyên thủy.
STT Tên hàm Giải thích
1 Tang_len(E) Tăng nội dung công tơ lên một đơn vị có nghĩa
là một sự kiện nhóm E đến.
2 Truy_van(E) Cung cấp giá trị hiện hành của công tơ phối
hợp với E.
3 Cho(E,n) Theo tiến trình gọi chừng nào giá trị công tơ
còn nhỏ hơn n.
Mỗi công tơ được khởi động ngay khi thành lập nó.
Để thể hiện bài tóan người sản xuất – người tiêu thụ, với cùng các tên của biến, ta
định nghĩa:
1. Hai công tơ sự kiện NP’ và NC’, được khởi động bằng giá trị 0.
2. Hai biến nguyên NP và NC, khởi sự là 0, là cục bộ đối với tiến trình người sản
xuất P và người tiêu thụ C.
Trong trường hợp này, ta viết các tiến trình như sau:
HVTH: Lê Quang Vũ
11
Lập Trình Mạng
Người sản xuất
Vòng lặp
Cho (NC’,NP-N+1)
{chuyển khi NP-NC’<N}
San_xuat
Tang(NP’)
NP:=NP+1
Kết thúc vòng lặp
Người tiêu thụ
Vòng lặp
Cho (NP’,NC+1)
{chuyển khi NP’-NC>0}
Tieu_thu
Tang(NC’)
NC’:=NC’+1
Kết thúc vòng lặp
HVTH: Lê Quang Vũ
12
Lập Trình Mạng
PHẦN HAI: GIẢI QUYẾT BÀI TOÁN
a. Nội dung bài toán
Xây dựng hệ thống phân tán 3 server thể hiện khả năng phát – nhận thông điệp:
Dịch vụ từ máy chủ và khái niệm cổng, Khi kết nối vào máy chủ ta có thể yêu
cầu từ máy chủ nhiều dịch vụ khác nhau như: tìm và đọc các trang web trên Internet;
gởi – nhận thông điệp; dò tìm hệ thống tên miền DNS;…Mỗi dịch vụ đều có cách gởi
– nhận dữ liệu theo quy ước riêng. Mỗi chương trình dịch vụ sẽ sử dụng một cổng
khác nhau để truy xuất thông tin. Cổng là một số nguyên dương có giá trị từ 1 đến
16383.
Trên nguyên tắc của Server, xây dựng giao diện Demo của 03 sever như hình sau:
HVTH: Lê Quang Vũ
13
Lập Trình Mạng
Trong đó:
(1),(2): Khai báo Hostname và Port của Server để kết nối vào hệ thống
(3): Thông tin về Server
(4): Gởi thông điệp
(5): Thông tin về thông điệp
(6): Hiển thị giá trị số gia của công tơ sự kiện.
Chương trình dùng để cài đặt Server
// Môi trường làm việc của Java
import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
import java.util.*;
public class SetServer extends JFrame{
// Variables declaration - GEN-BEGIN:variables
//tao cac nut giao dien
private JPanel pnLookupServer;
private JLabel lblHost;
private JComboBox cboHost;
private JLabel lblPort;
private JComboBox cboPort;
private JButton btnLookup;
private JButton btnReset;
private JButton btnAbout;
HVTH: Lê Quang Vũ
14
3
1
2
5
4
6
Lập Trình Mạng
private JScrollPane srpListServer;
private JList lstServers;
private JPanel pnServerInfo;
private JLabel lblAddress;
private JTextField txtAddress;
private JLabel lblLocalPort;
private JTextField txtLocalPort;
private JTextField txtHostname;
private JPanel pnClock;
private JLabel lblClock;
private JLabel lblReceive;
private JScrollPane srpReceive;
private JTextArea txtReceive;
private JPanel pnMessage;
private JPanel pnDeliverMessage;
private JButton btnSend;
private JTextField txtMessage;
private JComboBox cboSendto;
//Vector Chứa các Server trong hệ thống
Vector vtServers = new Vector();
//Khai báo các biến; Server ket noi tren conMaster co ten la strMaster
String strMaster;
int intNumOfClientConnected = 0;
int intLocalPort;
int intRemotePort;
String strLocalHost;
String strRemoteHost;
InetAddress inetAddr;
ServerSocket server;
Socket client;
//con chua cac ket noi tu cac may client trong mang (ket noi den)
Congto con[] = new Congto[10];
//conMaster dung de chua mot ket noi tu mot server trong he den tren
ServerSocket (Ket noi den)
Congto conMaster;
//Da co conMaster trong he ket noi chua
boolean bConMaster = false;
//conSlave dung de chua ket noi voi mot server trong he (ket noi di)
Congto conSlave;
// Phương thức khởi dựng server sử dụng intLocalPort
HVTH: Lê Quang Vũ
15
Lập Trình Mạng
public SetServer(int port) {
try{
intLocalPort = port;
initialize();
}catch(Exception e){
}
}
//Gắn thuộc tính cho các đối tượng trên form
private void initialize() throws Exception{
pnLookupServer = new JPanel();
lblHost = new JLabel();
cboHost = new JComboBox();
lblPort = new JLabel();
cboPort = new JComboBox();
btnLookup = new JButton();
btnReset = new JButton();
btnAbout = new JButton();
srpListServer = new JScrollPane();
lstServers = new JList();
pnServerInfo = new JPanel();
lblAddress = new JLabel();
txtAddress = new JTextField();
label5 = new JLabel();
txtHostname = new JTextField();
lblLocalPort = new JLabel();
txtLocalPort = new JTextField();
label6 = new JLabel();
txtStateServer = new JTextField();
splitMain = new JSplitPane();
tabPaneInfo = new JTabbedPane();
pnClock = new JPanel();
lblClock = new JLabel();
lblReceive = new JLabel();
srpReceive = new JScrollPane();
txtReceive = new JTextArea();
pnMessage = new JPanel();
lblExample = new JLabel();
pnExample = new JPanel();
pnDeliverMessage = new JPanel();
label1 = new JLabel();
btnSend = new JButton();
HVTH: Lê Quang Vũ
16
Lập Trình Mạng
label2 = new JLabel();
txtMessage = new JTextField();
label3 = new JLabel();
cboSendto = new JComboBox();
// this
this.setTitle("Server");
this.setSize(new Dimension(600, 400));
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = getContentPane();
contentPane.setLayout(new BorderLayout());
// pnLookupServer
{
pnLookupServer.setBorder(new TitledBorder(null, "Ket noi servers",
TitledBorder.LEADING, TitledBorder.TOP, null, Color.blue));
pnLookupServer.setLayout(new FlowLayout(FlowLayout.LEFT));
// lblHost
lblHost.setText("Hostname: ");
pnLookupServer.add(lblHost);
// cboHost
cboHost.setEditable(true);
cboHost.setModel(new DefaultComboBoxModel(new String[] {
"localhost",
"127.0.0.1", //mặc định
"172.16.0.1",
"172.16.0.2", //giả lập
"172.16.0.3"
}));
pnLookupServer.add(cboHost);
// lblPort
lblPort.setText("Port :");
pnLookupServer.add(lblPort);
// cboPort
cboPort.setModel(new DefaultComboBoxModel(new String[] {
"60",
"70", //giả lập: có thể đặt giá trị từ 1 đến 16383
"80",
"90"
}));
cboPort.setEditable(true);
pnLookupServer.add(cboPort);
// btnLookup
HVTH: Lê Quang Vũ
17
Lập Trình Mạng
btnLookup.setText("Ket noi");
btnLookup.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
btnLookupActionPerformed(e);
}
});
pnLookupServer.add(btnLookup);
// btnAbout
btnAbout.setText("Info ");
btnAbout.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
btnAboutActionPerformed(e);
}
});
pnLookupServer.add(btnAbout);
}
contentPane.add(pnLookupServer, BorderLayout.NORTH);
// srpListServer
{
srpListServer.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_S
CROLLBAR_ALWAYS);
srpListServer.setViewportBorder(new TitledBorder("List Servers :"));
srpListServer.setMinimumSize(new Dimension(50, 51));
srpListServer.setPreferredSize(new Dimension(200, 392));
// lstServers
lstServers.setFont(new Font("Dialog", Font.BOLD, 14));
lstServers.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
lstServers.setBackground(new Color(247, 247, 214));
srpListServer.setViewportView(lstServers);
}
contentPane.add(srpListServer, BorderLayout.WEST);
// pnServerInfo
{
pnServerInfo.setBorder(new TitledBorder(null, "Server info",
TitledBorder.LEADING, TitledBorder.TOP, null, Color.blue));
pnServerInfo.setLayout(new FlowLayout());
// lblAddress
lblAddress.setText("IP Address :");
pnServerInfo.add(lblAddress);
// txtAddress
HVTH: Lê Quang Vũ
18
Lập Trình Mạng
txtAddress.setColumns(10);
txtAddress.setEditable(false);
txtAddress.setForeground(new Color(153, 0, 153));
txtAddress.setFont(new Font("Dialog", Font.BOLD, 12));
pnServerInfo.add(txtAddress);
// label5
label5.setText("Hostname :");
pnServerInfo.add(label5);
// txtHostname
txtHostname.setColumns(10);
txtHostname.setEditable(false);
txtHostname.setForeground(new Color(153, 0, 153));
txtHostname.setFont(new Font("Dialog", Font.BOLD, 12));
pnServerInfo.add(txtHostname);
// lblLocalPort
lblLocalPort.setText("LocalPort :");
pnServerInfo.add(lblLocalPort);
// txtLocalPort
txtLocalPort.setColumns(6);
txtLocalPort.setEditable(false);
txtLocalPort.setForeground(new Color(153, 0, 153));
txtLocalPort.setFont(new Font("Dialog", Font.BOLD, 12));
pnServerInfo.add(txtLocalPort);
}
// pnMessage
{
pnMessage.setLayout(new BorderLayout());
// lblReceive
lblReceive.setText("Info of Msg ");
pnMessage.add(lblReceive, BorderLayout.NORTH);
// srpReceive
{
// txtReceive
txtReceive.setEditable(false);
txtReceive.setForeground(Color.blue);
txtReceive.setText("");
txtReceive.setFont(new Font("Dialog", Font.BOLD, 12));
srpReceive.setViewportView(txtReceive);
}
pnMessage.add(srpReceive, BorderLayout.CENTER);
}
HVTH: Lê Quang Vũ
19
Lập Trình Mạng
// Cong to su kien
{
pnClock.setLayout(new FlowLayout());
// lblClock
lblClock.setText("0");
pnClock.add(new JLabel("So gia: "));
pnClock.add(lblClock);
}
tabPaneInfo.addTab("Messages", pnMessage);
tabPaneInfo.addTab("Cong to su kien", pnClock);
}
splitMain.setTopComponent(tabPaneInfo);
// pnDeliverMessage
{
pnDeliverMessage.setBorder(new TitledBorder("Deliver message:"));
pnDeliverMessage.setLayout(new GridBagLayout());
((GridBagLayout)pnDeliverMessage.getLayout()).columnWidths = new
int[] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
((GridBagLayout)pnDeliverMessage.getLayout()).rowHeights =
new int[] {0, 0, 0, 0};
((GridBagLayout)pnDeliverMessage.getLayout()).columnWeights
= new double[] {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0E-4};
((GridBagLayout)pnDeliverMessage.getLayout()).rowWeights =
new double[] {0.0, 0.0, 0.0, 1.0E-4};
// btnSend
btnSend.setText("Send");
btnSend.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
btnSendActionPerformed(e);
}
});
pnDeliverMessage.add(btnSend, new GridBagConstraints(1, 0,
1, 1, 0.0, 0.0,
GridBagConstraints.CENTER, GridBagConstraints.BOTH,
new Insets(5, 0, 5, 5), 0, 0));
// label2
label2.setText("Message :");
pnDeliverMessage.add(label2, new GridBagConstraints(0, 1,
1, 1, 0.0, 0.0,
GridBagConstraints.CENTER, GridBagConstraints.BOTH,
new Insets(0, 0, 5, 5), 0, 0));
HVTH: Lê Quang Vũ
20
Lập Trình Mạng
// txtMessage
txtMessage.setColumns(30);
txtMessage.setHorizontalAlignment(SwingConstants.LEFT);
txtMessage.setFont(new Font("Tahoma", Font.BOLD, 12));
pnDeliverMessage.add(txtMessage, new GridBagConstraints(1,
1, 7, 1, 0.0, 0.0,
GridBagConstraints.CENTER, GridBagConstraints.BOTH,
new Insets(0, 0, 5, 5), 0, 0));
// label3
label3.setText("Send to :");
pnDeliverMessage.add(label3, new GridBagConstraints(0, 2,
1, 1, 0.0, 0.0,
GridBagConstraints.CENTER, GridBagConstraints.BOTH,
new Insets(0, 0, 0, 5), 0, 0));
// cboSendto
cboSendto.setModel(new DefaultComboBoxModel(new String[] {
"All servers",
"Selected"
}));
pnDeliverMessage.add(cboSendto, new GridBagConstraints(1, 2, 1,
1, 0.0, 0.0,
GridBagConstraints.CENTER, GridBagConstraints.BOTH,
new Insets(0, 0, 0, 5), 0, 0));
}
splitMain.setBottomComponent(pnDeliverMessage);
}
contentPane.add(splitMain, BorderLayout.CENTER);
// End of initialization //GEN-END:initialize
//Show frame
this.show();
// Information about host
inetAddr = InetAddress.getByName("localhost");
strLocalHost = inetAddr.getHostName();
txtHostname.setText(strLocalHost);
txtAddress.setText(inetAddr.getHostAddress());
txtLocalPort.setText(Integer.toString(intLocalPort));
//nghe ket noi tu cac server khac
txtStateServer.setText("Listenning ");
this.setTitle("Server (" + strLocalHost + ") is listenning on
port " + intLocalPort+".");
HVTH: Lê Quang Vũ
21
Lập Trình Mạng
//Them muc vao list servers - this servers
String strItem1 = strLocalHost +"("+ intLocalPort+ ")"+".";
vtServers.addElement(strItem1);
lstServers.setListData(vtServers);
//tao doi tuong Server Socket de lang nghe ket noi tu cac may khac
goi den cong intLocalPort
server = new ServerSocket(intLocalPort);
int intLocalPort = server.getLocalPort();
//Tiếp tục tìm để kết nối với server khác
while(true){
Socket skConnect = server.accept();
//Neu la server trong he ket noi - chi cho phep mot server
trong he ket noi
//Va chuyen ket noi cho mot luong xu ly
if(!bConMaster){
bConMaster = true;
conMaster = new Congto(skConnect,1,txtReceive,lblClock);
conMaster.start();
strMaster = conMaster.getInfoClient();
String strMaster = strLocalHost +"("+ intLocalPort+ ")"+".";
vtServers.addElement(strMaster);
lstServers.setListData(vtServers);
//hiển thị Server được kết nối này vào danh sách server
}else{
//Cac client tren mang ket noi toi
intNumOfClientConnected = intNumOfClientConnected +1;
con[intNumOfClientConnected] = new
Congto(skConnect,0,txtReceive,lblClock);
con[intNumOfClientConnected].start();
}
} //end While
}
//Click chuot va nhan nut Ket noi
private void btnLookupActionPerformed(ActionEvent e) {
try{
intRemotePort =
Integer.parseInt(cboPort.getSelectedItem().toString());
strRemoteHost = cboHost.getSelectedItem().toString();
JOptionPane.showMessageDialog(null,"Lookup and connect to: " +
strRemoteHost + " on port: " + Integer.toString(intRemotePort));
//Slave ket noi voi server trong he
HVTH: Lê Quang Vũ
22
Lập Trình Mạng
client = new
Socket(strRemoteHost,intRemotePort,inetAddr,intLocalPort+1);
conSlave = new Congto(client,0,txtReceive,lblClock);
conSlave.start();
vtServers.addElement(conSlave.getInfoClient());
lstServers.setListData(vtServers);
JOptionPane.showMessageDialog(null,"Connect successfully !");
cboHost.setEnabled(false);
cboPort.setEnabled(false);
btnLookup.setEnabled(false);
}catch(Exception ex){
JOptionPane.showMessageDialog(null,"Error ! " + ex.getMessage());
}
}
//Click chuot va nhan nut Info….
private void btnAboutActionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null,"Bai tap mon Lap Trinh Mang!\nHoc
vien: Nguyen Nhat Tan\nLop Cao hoc K9\n\nGV huong dan: PGS.TS Le Van
Son\n12,2008\n");
}
//Click chuot va nhan nut btnSend
private void btnSendActionPerformed(ActionEvent e) {
try{
String strContent = txtMessage.getText();
//Tang gia tri cua cong to truoc khi goi thong diep
int intClock = Integer.parseInt(lblClock.getText())+1;
String strMes = Integer.toString(intClock) + strContent;
int intTo = cboSendto.getSelectedIndex();
//Xem thu gui cho ai
switch(intTo){
case 0: //"All Servers"
if(conMaster!=null){
conMaster.sendMessage(strMes);
}
if(conSlave!=null){
conSlave.sendMessage(strMes);
}
//Them text vao text area
String strTo = cboSendto.getSelectedItem().toString();
if((conMaster!=null)||(conSlave!=null)){
HVTH: Lê Quang Vũ
23
Lập Trình Mạng
addTextArea(Integer.toString(intClock),strContent,str
To);
}
break;
case 1:
break; //"All Clients": dự phòng
case 2: //"Selected" - Gui cho server duoc chon trong danh sach
String item = (String)lstServers.getSelectedValue();
if(lstServers.getSelectedIndex()==0){
JOptionPane.showMessageDialog(null,"Can't send to yourself !");
break;
}
if(item.equals(strMaster)){
if(conMaster!=null){
conMaster.sendMessage(strMes);
addTextArea(Integer.toString(intClock),strContent,item);
}
}else{
if(conSlave!=null){
conSlave.sendMessage(strMes);
addTextArea(Integer.toString(intClock),strContent,item);
}
}
break;
}
}catch(Exception ex){
JOptionPane.showMessageDialog(null,"Error ! " + ex.getMessage());
//System.exit(0);
}
}
//Them thong diep nhan hoac gui vao hop textarea
public void addTextArea(String time, String content, String to){
txtReceive.append("*Send to: " + to +"\n");
txtReceive.append(" Lan goi thu: " + time + "\n");
txtReceive.append(" Noi dung: " + content +"\n");
//Cap nhat gia tri cong to len form
lblClock.setText(time);
}
///////////////////////////////////////////////////////////////////////
///// Main Program
HVTH: Lê Quang Vũ
24
Lập Trình Mạng
public static void main(String args[])
{
if(args.length!=1){
System.out.print("Useage: SetServer [port number]\n");
return;
}
////
SetServer ser = new SetServer(Integer.parseInt(args[0]));
}
}
HVTH: Lê Quang Vũ
25