Tải bản đầy đủ (.docx) (23 trang)

Bài tập lập trình mạng: Xây dựng chương trình chat room docx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (464.4 KB, 23 trang )

TRƯỜNG ĐẠI HỌC BÁCH KHOA
KHOA CÔNG NGHỆ THÔNG TIN
BỘ MÔN MẠNG VÀ TRUYỀN THÔNG

BÀI TẬP LỚN LẬP TRÌNH MẠNG
Đề tài
Xây dựng chương trình chat room
Sinh viên : Võ Quang Hòa
Lớp : 07T4
Mã số sinh viên : 102114071123
Cán bộ hướng dẫn : Huỳnh Công Pháp
Đà Nẵng 2011
Tạo chương trình chát room Trang 2
Võ Quang Hòa – Lớp 07T4
Tạo chương trình chát room Trang 3
Mục lục
Võ Quang Hòa – Lớp 07T4
Tạo chương trình chát room Trang 4
CHƯƠNG 1. MỞ ĐẦU
Phần 1. Bối cảnh, lý do thực hiện đề tài
Hiện nay mạng internet toàn cầu đã phát triển rất mạnh, đáp ứng rất tốt các nhu
cầu về thông tin khoa học, giải trí, liên lạc, mua bán, quảng cáo v.v của con người.
Internet đã trở thành một thành phần không thể thiếu với cuộc sống hiện đại. Về bản
chất, Internet chẳng qua là một hệ thống mạng, liên kết các máy tính trên toàn thế giới lại
theo những chuẩn chung của nó. Với phạm vi nhỏ hơn nhưng cũng rất tương tự, có
những mạng khác đó là WAN, LAN , mỗi mô hình đó đều được ứng dụng rất nhiều tiện
ích khác nhau.
Với mục tiêu để cho các sinh viên ra trường với một kiến thức tốt về mạng, về lập
trình ứng dụng trên mạng để có thể làm được nhiều việc khác nhau, bộ môn lập trình
mạng ra đời. Vì vậy, ngày hôm nay, lúc em đang học về lập trình mạng, thầy Huỳnh
Công Pháp đã giao bài tập lớn “Xây dựng chương trình chat room”, điều đó giúp em thực


hành để có cơ hội hiểu rõ hơn về mạng, về lập trình mạng – một lĩnh vực lập trình rất thú
vị này.
Phần 2 : Cơ sở lập trình
Ứng dụng hoạt động dựa vào giao thức IP/TCP để truyền dữ liệu giữa hai máy
khác nhau, cụ thể ở đây là một máy server để cung cấp dịch vụ và nhiều máy client sử
dụng dịch vụ do máy server cung cấp để cho người dùng sử dụng.
Ngôn ngữ lập trình ở đây là ngôn ngữ Java (Phiên bản J2SE 1.6) vì Java là ngôn
ngữ có thể được sử dụng để viết ứng dụng chạy trên hầu hết các thiết bị (ở đây ta quan
tâm tới thiết bị có hỗ trợ mạng). Trọng điểm, có mấy khả năng nổi trội do Java cung cấp
mà ta có thể sử dụng là :
- Lập trình đa tuyến trình (Cùng 1 ứng dụng nhưng có thể chạy nhiều tiến trình
song song với nhau thay vì cứ phải tiến trình này đợi tiến trình kia kết thúc mới có
thể thực hiện)
- Java là một nền tảng có thể chạy trên nhiều loại thiết bị với nhiều hệ điều hành
khác nhau nên có phạm vi ứng dụng rất rộng rãi.
- Lập trình mạng. Lớp quan trọng nhất mà ta sử dụng là lớp Socket và
ServerSocket.
Võ Quang Hòa – Lớp 07T4
Tạo chương trình chát room Trang 5
CHƯƠNG 2. CƠ SỞ LÝ THUYẾT
Phần 1 : Yêu cầu của đề tài
Viết chương trình Client/Server cho phép nhiều người sử dụng có thể gửi tin nhắn
cho nhau dưới dạng một phòng chat room.
Phần 2 : Giới thiệu mô hình Client/Server
Server hiểu nôm na là máy chủ, thường là một hệ thống máy lớn, có bộ xử lý
mạnh, có khả năng hoạt động đáng tin cậy, có khả năng lưu trữ dữ liệu lớn, nó chuyên
quản lý tài nguyên (chủ yếu là cơ sở dữ liệu), cung cấp các dịch vụ mạng cho các máy
khách (client) sử dụng. Bình thường nó chạy suốt thời gian thực và sẵn sàng chấp nhận
các yêu cầu kết nối và các yêu cầu dịch vụ khác từ máy khách.
Client là máy khách, nó thường được sử dụng bởi người dùng cuối. Nó hoạt động

dựa trên việc sử dụng dịch vụ mà máy server cung cấp để thực hiện các công việc mà
người dùng cuối mong muốn.
Quy trình hoạt động của mô hình này lặp đi lặp lại 2 quá trình như sau :
- Client gửi yêu cầu lên server.
- Server nhận được yêu cầu thì sẻ xử lý thích hợp và trả lời lại client.
-
o Mô hình Client/Server
Võ Quang Hòa – Lớp 07T4
Tạo chương trình chát room Trang 6
Phần 3 : Giới thiệu giao thức IP/TCP
1. Giới thiệu về TCP
Giao thức TCP (Transmission Control Protocol) là giao thức hướng kết nối (connection-oriented), nó đòi
hỏi thiết lập kết nối trước khi bắt đầu gửi dữ liệu và kết thúc kết nối khi việc gửi dữ liệu hoàn tất theo đúng thứ
tự: thiết lập kết nối, truyền dữ liệu và kết thúc kết nối.
2. Giới thiệu về IP.
IP là địa chỉ của một máy tính trên mạng, dựa vào địa chỉ IP giao thức TCP có thể truyền dữ liệu chính xác
từ một máy này qua máy kia thông qua hệ thống mạng. Ở trên mạng, một máy tính sẻ có một địa chỉ IP khác
nhau, từ địa chỉ IP có thể biết được máy nào trên mạng và ngược lại.
3. Giới thiệu về cổng Port.
Với IP, giao thức TCP chỉ mới có thể truyền dữ liệu chính xác từ máy này qua máy kia mà chưa thể truyền
chính xác đến từng ứng dụng trên máy được. Hiện nay, các hệ thống máy thông thường hoạt động theo chế độ
đa nhiệm, nghĩa là có nhiều ứng dụng chạy cùng một lúc và trong đó có thể có nhiều ứng dụng sử dụng dịch vụ
mạng. Yêu cầu, khi máy chủ A truyền dữ liệu cho một ứng dụng u trên máy B thì trên máy B phải đảm bảo dữ
liệu đó phải đến được ứng dụng u, chứ không phải ứng dụng v.
Để thực hiện điều đó thì máy chủ A khi truyền dữ liệu đi thì trên dữ liệu đó có một thành phần thông tin
giúp máy B xác định được đúng ứng dụng u. Phần thông tin đó chính là địa chỉ port trên máy B, nó có thể hiểu
là lỗ cắm ảo trên máy B mà ứng dụng u đã đăng ký để độc quyền sử dụng nhằn nhận dữ liệu từ máy chủ A.
Trên thực tế, địa chỉ port là một số nguyên 2 byte có giá trị từ 0 đến 65535. Nó có đặc điểm :
- Giá trị từ 0 đến 1023 là các cổng phổ biến dành cho các ứng dụng thông dụng như http: 80, mail : 25, fpt :
21, Telnet 23 Các giá trị còn lại có thể được sử dụng linh hoạt.

- Mỗi cổng trong mỗi thời điểm được sử dụng cho tối đa là 1 ứng dụng. Ví dụ như một ứng dụng nào đó đã
sử dụng cổng 55 thì ứng dụng khác không thể sử dụng cổng 55 đó nữa chừng nào ứng dụng trước đó chưa
có đóng cổng 55 lại.
4. Giới thiệu về Socket.
- Socket là một khái niệm để định vị một dịch vụ của một máy tính trên mạng khi kết hợp hai khái niệm IP
và Port lại.
- Socket có những nhiệm vụ như sau :
• Gắn một cổng trên máy
• Lắng nghe các kết nổi.
• Kết nối/Đóng kết nối đến máy tính ở xa qua cổng đã gắn
• Gửi/nhận dữ liệu
• Lắng nghe dữ liệu đến
Thực chất, Socket chẳng qua là sự kết hợp giữa địa chỉ IP của máy tính và cổng Port mà ứng dụng sử dụng.
Chính vì sự kết hợp đó mà nó trở thành một khái niệm mà từ đó, các ngôn ngữ lập trình có chứa các gói, các giao
diện lập trình (API) để hỗ trợ các nhà lập trình dễ dàng trong việc lâp trình liên quan đến mạng qua giao thức TCP.
Điển hình là ngôn ngữ Java mà em sẻ giới thiệu ngay sau đây.
Võ Quang Hòa – Lớp 07T4
Tạo chương trình chát room Trang 7
Phần 4 : Lập trình mạng trong Java.
1. Giói ServerSocket
Nhiệm vụ chính :
 Mở một cổng kết nối trên server, sẵn sàng hoạt động trên cổng đó.
public Socket(int port) : Tạo cổng kết nối trên cổng port.
 Lắng nghe, chờ đợi các yêu cầu kết nối trên cổng đó và kết nối khi có yêu cầu.
public accept():Chấp nhận một kết nối và trả về một đối tượng Socket mô tả nguồn
đã được kết nối đến.
 Tạo luồng dữ liệu vào ra để có thể truyền dữ liệu trên cổng đến một socket ở máy khách. (Đây là
chức năng quan trọng nhất).
getInputStream() : Trả về một luồng mà có thể nhập dữ liệu vào.
getOutputStream() : Trả về một luồng ghi dữ liệu.

 Đóng kết nối lúc không sử dụng.
close() : Đóng kết nối khi không cần
2. Gói Socket.
Nhiệm vụ chính
 Kết nối tới một máy chủ thông qua địa chỉ IP và số hiệu cổng trên máy chủ đó.
Public Socket(InetAddress address, int port)
 Tạo luồng dữ liệu vào ra
Public OutputStream getOutputStream() ;
Public InputStream getInputStream() ;
 Đóng kết nối.
Public void Close(); Đóng kết nối
3. Một số gói, lớp bổ trợ khác.
Võ Quang Hòa – Lớp 07T4
Tạo chương trình chát room Trang 8
a. Gói Swing, awt.event : tạo giao diện người dùng
b. Gói Runnable, Thread : Hỗ trợ đa tiến trình
c. Gói java.io : Cung cấp các lớp vào ra dữ liệu
Võ Quang Hòa – Lớp 07T4
Tạo chương trình chát room Trang 9
CHƯƠNG 3 : PHÂN TÍCH THIẾT KẾ CHƯƠNG TRÌNH
Phần 1 : Phân tích yêu cầu
Viết chương trình cho phép chat room giữa nhiều người qua mạng.
Phần 2 : Phân tích chức năng.
1. Trên Client:
 Đăng nhập vào server với một cái nickname do người dùng tự chọn
 Nhận danh sách các nick đang online trên server.
 Gửi tin nhắn tới một người, nhiều người hoặc tất cả mọi người online khác
trên server.
 Nhận tin nhắn từ nickname khác gửi tới.
 Đăng xuất tài khoản.

2. Trên Server:
 Tạo cổng kết nối và sẵn sàng đón nhận các sự kết nối từ client
 Xử lý yêu cầu đăng nhập từ client
• Nếu nickname chưa có đăng nhập từ trước thì cho đăng nhập
• Nếu đã có một ai đó đăng nhập từ trước với nickname đó thì cho người
đăng nhập trước đó phải đăng xuất và cho người mới đăng nhập vào.
 Trả về danh sách các nickname online cho nickname có yêu cầu.
 Nhận tin nhắn từ một nickname và chuyển tiếp tới các nickname khác
tương ứng theo yêu cầu của nickname gửi.
 Loại nickname khi nickname yêu cầu đăng xuất.
 Cho phép người sử dụng theo dõi các thành viên đăng nhập, đăng xuất.
Võ Quang Hòa – Lớp 07T4
Tạo chương trình chát room Trang 10
CHƯƠNG 4 : TRIỂN KHAI THỰC HIỆN VÀ KẾT QUẢ
Phần 1 : Môi trường triển khai
- Hệ điều hành : Microsoft Window 7, Microsoft Window XP (Chạy máy ảo)
- IDE : Eclipse Helios Service Release 2. Tải miễn phí tại />Phần 2 : Kết quả thực hiện.
- Về cơ bản, chương trình thực hiện được các chức năng là tạo kết nối, chat qua lại
giữa các thành viên online.
- Với phạm vi nhỏ của đề tài, chưa có thực hiện một số chức năng mà có thể triển
khai được như truyền file, gửi tin nhắn có định dạng giống như các ứng dụng
chat thực sự đang có.
- Các thao tác trên giao diện cũng chưa thực sự tiện lợi. Việc thử nghiệm chỉ mới
dừng lại trên máy ở mạng lan (Giữa máy thật và máy ảo) và trên máy cục bộ (Sử
dụng địa chỉ localhost).
Một số hình ảnh minh họa

Chức năng quản lý của chương trình trên server.
Võ Quang Hòa – Lớp 07T4
Tạo chương trình chát room Trang 11

Các chức năng trên chương trình client
Minh họa việc chat trên hệ thống
Võ Quang Hòa – Lớp 07T4
Tạo chương trình chát room Trang 12
Phần 3 : Chương trình
1. Chương trình trên máy server.
a.File Command.java
b. File NewSocket.java
Võ Quang Hòa – Lớp 07T4
package server;
public class Command {
/**
* Request sign out of user
*/
public static final int SIGN_OUT=0x0;
/**
* Message from user to server
*/
public static final int RECEIVE_MESSAGE=0x1;
/**
* Message from server to user
*/
public static final int SEND_MESSAGE=0x2;
/**
* User request contacts list
*/
public static final int REQUEST_CONTACT=0x3;
/**
* User send a message to all another active user
*/

public static final int SEND_MESSAGE_TO_ALL=0x4;
/**
* Code respond message send successfully
*/
public static final int SEND_MESSAGE_SUCCESSFULLY=0x11;
/**
* Code respond message send failed
*/
public static final int SEND_MESSAGE_FAILED=0x12;
/**
* Code server shutdown
*/
public static final int STATE_SHUTDOWN=0x25;
}
package server;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
public class NewSocket extends Thread{
private static final String obj = "CHAT";
private String NickName;
private DataOutputStream dos;
private DataInputStream dis;
private boolean ok=true;
private Socket soc;
private Server server;
Tạo chương trình chát room Trang 13
Võ Quang Hòa – Lớp 07T4
public NewSocket(Server _server,Socket _soc){

try {
dos=new DataOutputStream(_soc.getOutputStream());
dis=new DataInputStream(_soc.getInputStream());
this.soc=_soc;
this.server=_server;
this.start();
} catch (IOException e) {
e.printStackTrace();
}
}
public void run(){
int command;
String arg0,arg1;
try {
NickName=dis.readUTF();
if(server.hash.containsKey(NickName)){
server.hash.get(NickName).shutDown("You must
logoff because you have just signed in at another place");
}
server.hash.put(NickName, this);
server.apendLog("Nick name "+NickName+" signed in");
while(ok){
command=dis.read();
synchronized(obj){
switch(command){
case Command.SEND_MESSAGE:
arg0=dis.readUTF();//To
arg1=dis.readUTF();//Message
server.sendMany(this.NickName,
arg0, arg1);

break;
case Command.SEND_MESSAGE_TO_ALL:
arg0=dis.readUTF();
server.sendAll(this.NickName,
arg0);
break;
case Command.SIGN_OUT:
ok=false;
server.hash.remove(this.NickName);
soc.close();
break;
case Command.REQUEST_CONTACT:
dos.write(Command.REQUEST_CONTACT);
dos.writeUTF(server.GetListContacts(NickName));
dos.flush();break;
case Command.STATE_SHUTDOWN:
shutDown("");
}
}
}
} catch (Exception e){server.hash.remove(this.NickName);}
}
Tạo chương trình chát room Trang 14
c. File Server.java
Võ Quang Hòa – Lớp 07T4
package server;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.net.ServerSocket;
import java.util.Enumeration;
import java.util.Hashtable;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
@SuppressWarnings("serial")
public class Server extends JFrame{
public Hashtable<String,NewSocket> hash;
private JPanel panel1=new JPanel(new FlowLayout());
private JPanel panel3=new JPanel(new FlowLayout());
private JTextArea tbLog=new JTextArea();
private JButton btClear=new JButton("Clear Log");
private JButton btStart=new JButton("Start Service");
private JScrollPane jsp=new JScrollPane(tbLog);
private ServerSocket socket;
/**
* Load GUI (Graphics User Interface)
*/
private void loadGui(){
this.setLayout(new BorderLayout());
this.add(panel1,BorderLayout.NORTH);
panel1.add(new JLabel("View log"));
this.add(jsp,BorderLayout.CENTER);
panel3.add(btStart);

panel3.add(btClear);
this.add(panel3,BorderLayout.SOUTH);
this.setSize(500,500);
this.setLocation(400, 100);
btStart.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
if(btStart.getText().equals("Start
Service")){
startService();
btStart.setText("Stop Service");
}else{
stopService();
btStart.setText("Start Service");
}
}
});
Tạo chương trình chát room Trang 15
Võ Quang Hòa – Lớp 07T4
btClear.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
tbLog.setText("");
}
});
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent we){
System.exit(0);
}
});
}
/**

* Start service with default configuration
*/
public void startService(){
hash=new Hashtable<String,NewSocket>();
try {
socket=new ServerSocket(3508);
new Thread(new Runnable(){
public void run() {
do{
try {
new
NewSocket(Server.this,socket.accept());
} catch (Exception e){}
}while(true);
}
}).start();
tbLog.append("Server started \n");
}catch (Exception e) {}
}
/**
* Send a message to all active account notify server will be
shutdown.
* Stop the service in server.
*/
public void stopService(){
try{
Enumeration<String>e = hash.keys();
String to;
while(e. hasMoreElements() ){
to=e.nextElement();

hash.get(to).shutDown("Sorry, server have to
shutdown.");
}
tbLog.append("Server stopped \n");
}catch(Exception ex){
tbLog.append("Server stopped failed \n");
}
}
Tạo chương trình chát room Trang 16
Võ Quang Hòa – Lớp 07T4
/**
* Create the window
*/
public Server(){
super("CHAT SERVICE - SERVER MANAGER");
loadGui();
}
/**
* Start main application
* @param args arguments to application
*/
public static void main(String[] args) {
new Server().setVisible(true);
}
/**
* Send a message to all active accounts
* @param from The account send the message
* @param message The message to send
*/
public void sendAll(String from, String message){

Enumeration<String> e = hash.keys();
String to;
while(e. hasMoreElements() ){
to=e.nextElement();
if(!to.equals(from))
try{
hash.get(to).pushMessage(from,
message);
hash.get(from).pushNotifyRetval(Command.SEND_MESSAGE_SUCCESSFULLY,
"NULL");
}catch(Exception ex){
}
}
}
/**
* Send a message to a special active account from another active
account
* @param from Sender
* @param to The recipient
* @param message The message to send
*/
public void sendMany(String from, String tos, String message){
StringBuffer sbfailed=new StringBuffer();
StringBuffer sbNick=new StringBuffer();
String to;
for(int i=0;i<=tos.length();i++){
if(i==tos.length() || tos.charAt(i)==','){
to=sbNick.toString();
if(!hash.containsKey(to)){
sbfailed.append(","+to);

}else try{
hash.get(to).pushMessage(from, message);
hash.get(from).pushNotifyRetval(Command.SEND_MESSAGE_SUCCESSFULLY,
"NULL");
}catch(Exception ex){
}
sbNick=new StringBuffer();
}else{
sbNick.append(tos.charAt(i));
}
}
hash.get(from).pushNotifyRetval(Command.SEND_MESSAGE_FAILED,
sbfailed.substring(1)+
" is not availabe, may be them had been sign out. ");
}
/**
* Get list of all contacts to send to client
* @param exceptionNick The requester
* @return list in string form. For example "Alias,Mary,Peter";
*/
public String GetListContacts(String exceptionNick){
StringBuffer sb=new StringBuffer();
Enumeration<String> e = hash.keys();
String nick;
while(e. hasMoreElements() ){
nick=e.nextElement();
if(!nick.equals(exceptionNick))
sb.append(","+nick);
}
if(!sb.toString().isEmpty())return sb.substring(1);

return sb.toString();
}
public void apendLog(String mess){
this.tbLog.append(mess+"\n");
}
}
Tạo chương trình chát room Trang 17
2. Chương trình trên máy Client
a. Command.java
Võ Quang Hòa – Lớp 07T4
/** package client;
public class Command {
/**
* Request sign out of user
*/
public static final int SIGN_OUT=0x0;
/**
* Message from user to server
*/
public static final int RECEIVE_MESSAGE=0x1;
/**
* Message from server to user
*/
public static final int SEND_MESSAGE=0x2;
/**
* User request contacts list
*/
public static final int REQUEST_CONTACT=0x3;
/**
* User send a message to all another active user

*/
public static final int SEND_MESSAGE_TO_ALL=0x4;
/**
* Code respond message send successfully
*/
public static final int SEND_MESSAGE_SUCCESSFULLY=0x11;
/**
* Code respond message send failed
*/
public static final int SEND_MESSAGE_FAILED=0x12;
/**
* Code server shutdown
*/
public static final int STATE_SHUTDOWN=0x25;
}
Tạo chương trình chát room Trang 18
b. Transport.java

Võ Quang Hòa – Lớp 07T4
package client;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
public class Transport extends Thread{
Client client;
Socket socket;
boolean ok=true;
DataInputStream dis;
DataOutputStream dos;

/**
* Create Class
* @param _client client owner
* @param _socket socket connection
*/
public Transport(Client _client,Socket _socket){
this.client=_client;
this.socket=_socket;
try {
dis=new DataInputStream(_socket.getInputStream());
dos=new DataOutputStream(_socket.getOutputStream());
this.start();
} catch (IOException e) {
client.appendLog("Error when create DataInputStream\n");
e.printStackTrace();
}
}
public void run(){
int command;
String arg0,arg1;
Object o="CHAT";
while(ok){
try {
command=dis.read();
switch(command){
case Command.RECEIVE_MESSAGE:
synchronized(o){
arg0=dis.readUTF();
arg1=dis.readUTF();
client.appendLog(arg0+" : "+arg1+"\n");

}
break;
case Command.SEND_MESSAGE_FAILED:
client.appendLog(dis.readUTF());
break;
case Command.REQUEST_CONTACT:
client.jtfTo.setText(dis.readUTF());
break;
}
}catch (IOException e) {
client.appendLog("Error when read data");
client.createOfflineStatus();
ok=false;
}
}
}
Tạo chương trình chát room Trang 19
Võ Quang Hòa – Lớp 07T4
public synchronized void signin(String nick){
try {
dos.writeUTF(nick);
dos.flush();
} catch (Exception e) {
}
}
public void shutDown(){
ok=false;
try {
dos.write(Command.STATE_SHUTDOWN);
dis.close();

} catch (IOException e) {
}
}
/**
* Request the active user list
*/
public synchronized void requestContact(){
try {
dos.write(Command.REQUEST_CONTACT);
dos.flush();
} catch (Exception e) {
}
}
/**
* Send a message to another active account through server
* @param to list account to send
* @param message the message to send
*/
public synchronized void sendMessage(String to,String message){
Object e="CHat";
try{
synchronized(e){
dos.write(Command.SEND_MESSAGE);
dos.writeUTF(to);
dos.writeUTF(message);
dos.flush();
}
}catch(Exception xe){
client.appendLog("Could not send message.\n");
}

}
/**
* Send a message to all active accounts
* @param message the message to send
*/
public synchronized void sendAll(String message){
Object e="CHat";
try{
synchronized(e){
dos.write(Command.SEND_MESSAGE_TO_ALL);
dos.writeUTF(message);
dos.flush();
}
}catch(Exception xe){
client.appendLog("Could not send message.\n");
}
}
}
Tạo chương trình chát room Trang 20
c. File Client.java
Võ Quang Hòa – Lớp 07T4
package client;
import java.awt.BorderLayout;
import java.awt.event.*;
import java.net.Socket;
import javax.swing.*;
@SuppressWarnings("serial")
public class Client extends JFrame{
private JButton btSignin=new JButton("Sign in");
private JButton btSend=new JButton("Send");

private JButton btClear=new JButton("Clear");
private JButton btRequestContact=new JButton("Get list contacts");
private JPanel panel0=new JPanel(new BorderLayout());
private JPanel panel0a=new JPanel();
private JPanel panel0b=new JPanel(new BorderLayout());
private JPanel panel1=new JPanel();
private JPanel panel2=new JPanel();
JTextField jtfFrom=new JTextField(10);
JTextField jtfTo=new JTextField(30);
JTextField jtfMs=new JTextField(30);
JTextArea jtaLog=new JTextArea(10,10);
private JScrollPane jsb=new JScrollPane(jtaLog);
private JRadioButton jrbSendAll=new JRadioButton("All online
members",true);
private JRadioButton jrbSendList=new JRadioButton("Only all members in
the list");
private Transport tran;
private Socket socket;
private void loadGui(){
setLayout(new BorderLayout());
panel0a.add(new JLabel("Your nickname"));
panel0a.add(jtfFrom);
panel0a.add(btSignin);
ButtonGroup group=new ButtonGroup();
JPanel select=new JPanel();
group.add(jrbSendAll);
group.add(jrbSendList);
select.add(new JLabel("Send to :"));
select.add(jrbSendAll);
select.add(jrbSendList);

JPanel list=new JPanel();
list.add(new JLabel("List : "));
list.add(jtfTo);
list.add(btRequestContact);
panel0b.add(select,BorderLayout.NORTH);
panel0b.add(list,BorderLayout.SOUTH);
panel0.add(panel0a,BorderLayout.NORTH);
panel0.add(panel0b,BorderLayout.SOUTH);
this.add(panel0,BorderLayout.NORTH);
panel1.setLayout(new BorderLayout());
panel1.add(jsb,BorderLayout.CENTER);
this.add(panel1,BorderLayout.CENTER);
Tạo chương trình chát room Trang 21
Võ Quang Hòa – Lớp 07T4
panel2.add(new JLabel("Message"));
panel2.add(jtfMs);
panel2.add(btSend);
panel2.add(btClear);
this.add(panel2,BorderLayout.SOUTH);
this.setVisible(true);
this.setSize(550, 400);
this.setLocation(200,100);
}
private void addListener(){
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent we){
if(tran!=null)tran.shutDown();
System.exit(0);
}
});

btSignin.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
if(btSignin.getText().equals("Sign in")){
createOnlineStatus();
}else{
createOfflineStatus();
}
}
});
btClear.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
jtaLog.setText("");
}
});
btSend.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
sendMessage();
}
});
jtfMs.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
sendMessage();
}
});
btRequestContact.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
if(tran!=null)tran.requestContact();
else
JOptionPane.showMessageDialog(Client.this, "You
must sign in first","Chat client",JOptionPane.OK_OPTION);

}
});
}
Tạo chương trình chát room Trang 22
Võ Quang Hòa – Lớp 07T4
private void sendMessage(){
if(tran==null){
appendLog("Please login first\n");
}else{
if(jtfMs.getText().isEmpty())return;
if(jrbSendAll.isSelected()){
tran.sendAll(jtfMs.getText());
appendLog("Me to all : "+jtfMs.getText()+"\n");
jtfMs.setText("");
}
else{
if(jtfTo.getText().isEmpty()){
appendLog("Please enter your friend\n");
return;
}else{
tran.sendMessage(jtfTo.getText(),
jtfMs.getText());
appendLog("Me to "+jtfTo.getText()+ " :
"+jtfMs.getText()+"\n");
jtfMs.setText("");
}
}
}
}
public void createOfflineStatus(){

tran.shutDown();
this.setTitle("CHAT CLIENT - NO SIGN IN");
btSignin.setText("Sign in");
btSend.setEnabled(false);
jtfFrom.setEnabled(true);
}
/**
* Sign in user
*/
public void createOnlineStatus(){
if(jtfFrom.getText().isEmpty()){
appendLog("Please enter your name\n");
return;
}
try {
socket=new Socket("127.0.0.1",3508);
tran=new Transport(this,socket);
tran.signin(jtfFrom.getText());
btSignin.setText("Sign off");
this.setTitle("CHAT CLIENT - SIGNED IN AS "+jtfFrom.getText());
}catch(Exception e){
this.appendLog("Server not availble or your network connection
is having some problems.\n");
return;
}
btSignin.setText("Sign off");
btSend.setEnabled(true);
jtfFrom.setEnabled(false);
}
Tạo chương trình chát room Trang 23

Võ Quang Hòa – Lớp 07T4
protected Client(){
super("CHAT _ SERVICE");
loadGui();
addListener();
}
/**
* Append a string into textare
* @param text
*/
public void appendLog(String text){
jtaLog.append(text);
}
public static void main(String[] args) {
new Client();
}
}

×