1. Trang chủ
  2. » Công Nghệ Thông Tin

TÀI LIỆU Đồ án Chat ClientServer, Client Server java

73 2,9K 36

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 73
Dung lượng 0,95 MB

Nội dung

Yêu cầu bài toán: Xây dựng chương trình Chát theo mô hình Client – Server sử dụng Java Socket Phân tích:  Xây dựng chương trình bên Server • Tạo một TCP Socket và gắn vào một cổng • Kết nối Database để lưu trữ dữ liệu người dùng như: username, password • Xây dựng một chương trình Server đa tuyến (Thread Server) để cho phép nhiều Client kết nối đến Server • Luôn luôn chờ và lắng nghe yêu cầu kết nối từ Client • Chấp nhận kết nối và tạo ra các Thread (Socket) tương ứng • Truyền nhận thông tin qua các luồng nhậngửi dữ liệu của socket • Cập nhật trạng thái đăng nhập, đăng xuất của các Client và gửi về các Client • Thiết kế giao diện Server • Xử lý 1 số công việc khác …  Xây dựng chương trình bên Client • Tạo một TCP Socket với địa chỉ IP và số cổng mà chương trình Server đang chạy • Thiết lập kết nối và trao đổi với Server: đăng nhập, đăng xuất …; • Gửi, Nhận thông điệp với tất cả mọi người trong phòng chát • Chức năng xem lại lịch sử đã chát • Chức năng upload, Download File • Thiết kế giao diện Client

Trang 1

TRƯỜNG ĐẠI HỌC MỎ - ĐỊA CHẤT HÀ NỘI

KHOA CÔNG NGHỆ THÔNG TIN

Đồ án lập trình mạng Xây dựng ứng dụng Chat Client – Server

Giảng Viên Hướng Dẫn: Phan Mạnh Tiến

Nguyễn Thị Thanh Huệ 1121050218 Nguyễn Thanh Hương 1121050228 Nguyễn Thế Phong 1121050073 Phạm Văn Thực 1121050103

Hà Nội, Ngày 18 Tháng 5 Năm 2014

Trang 2

2.1 Phân tích yêu cầu bài toán

Yêu cầu bài toán: Xây dựng chương trình Chát theo mô hình Client – Server sử dụng Java Socket

Phân tích:

 Xây dựng chương trình bên Server

• Tạo một TCP Socket và gắn vào một cổng

• Kết nối Database để lưu trữ dữ liệu người dùng như: username, password

• Xây dựng một chương trình Server đa tuyến (Thread Server) để cho phép nhiều Client kết nối đến Server

• Luôn luôn chờ và lắng nghe yêu cầu kết nối từ Client

• Chấp nhận kết nối và tạo ra các Thread (Socket) tương ứng

• Truyền nhận thông tin qua các luồng nhận/gửi dữ liệu của socket

• Cập nhật trạng thái đăng nhập, đăng xuất của các Client và gửi về các Client

• Thiết kế giao diện Server

• Xử lý 1 số công việc khác …

 Xây dựng chương trình bên Client

• Tạo một TCP Socket với địa chỉ IP và số cổng mà chương trình Server đang chạy

• Thiết lập kết nối và trao đổi với Server: đăng nhập, đăng xuất …;

• Gửi, Nhận thông điệp với tất cả mọi người trong phòng chát

• Chức năng xem lại lịch sử đã chát

• Chức năng upload, Download File

• Thiết kế giao diện Client

2.2 Thiết kế chương trình

2.2.1 Thiết kế giao diện

Giao diện của Server

Trang 3

Giao diện của Server hết sức đơn giản Thiết kế cơ bản gồm nút Start Phần Port, select Database đã được mặc định chọn sẵn trong code

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.1: Server đang hoạt động

• Giao diện bên Client

Giao diện bên Client được tách ra làm 2 form: ChatFram (phần chát chính) và

HistoryFram (nhật ký chát)

Trang 4

Hình 2.2 Client đã kết nối đến Server

• ChatFram là giao diện tổng hợp của việc kết nối, đăng nhập và Chát

• Host Address và Port của Server mặc định

• Phần List Online: để hiển thị các nick đang online

• Khung chát chính: tất cả thông báo đến từ Server, chương trình và các tin nhắn

từ thành viên khác đều được hiển thị ở đây

• Gửi tin nhắn: Có thể chát Room qua List Online chọn thuộc tính All Và chát riêng khi chọn thành viên muốn chát

• Nhật ký: hiển thị lịch sử đã chát qua 1 form mới là HistoryFram

• Upload File: cho phép gửi tập tin cho người dùng # Cấm gửi lên cho tất cả mọi người (tránh tắc nghẽn)

Trang 5

Hình 2.3 Nhật ký chát

2.2.2 Các lớp xử lý của chương trình

Phía bên Server

Phía bên Client

Trang 6

II Hướng dẫn cài đặt và chạy Demo chương trình

1 Hướng dẫn cài đặt

Chương trình gồm 2 phần chính là : Client và Server Muốn chương trình chạy được thì ta phải chạy Server trước để lắng nghe các Client Sau đó chạy các Client

Chạy Server ta Run File ServerFrame là Main

Chạy Client ta Run File ChatFramme là Main

2 Chạy Demo Chương trình

Thử nghiệm chạy chương trình lần lượt theo các bước  kết quả được hiển thị qua các hình

Hình 2.1 Kết nối lỗi khi Server chưa chạy

Trang 7

Hình 2.2 Chạy chương trình Server

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

Trang 8

Hình 2.4 Chát Room và chat Private

• Chát Room thì tại List Online ta chọn All và tiến hành chát với mọi người

• Chát Private thì tại List Online ta chọn người muốn chát và tiến hành chát Nhưtrong hình thì Đỗ Thanh chát private đến Thanh Huệ Và Thanh Huệ, Văn Thực chát Private cho Đỗ Thanh

Trang 9

Hình 2.5 Hiển thị nhật ký chát của Thế Phong

Hình 2.6 Thông báo đến các Client khi có Nick đăng xuất

Trang 10

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

Trang 11

• 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

Trang 12

Hình 2.11 Đỗ Thanh chấp nhận Download và thông báo đến 2 người đó

III Kết Luận và hướng phát triển

1 Những kết quả đạt được

 Mô phỏng thành công mô hình Client – Server trong mạng LAN

 Thực hiện đầy đủ yêu cầu bài ra: Đăng nhập, đăng xuất, List OnLine, Chat Room, Chat Private

 Một số chức năng thực hiện thêm: Select Database dạng XML, Nhật ký Chat, UpLoad File và Download File

2 Những vấn đề tồn tại

 Chương trình còn đơn giản

 Giao diện sơ sài

3 Hướng phát triển

 Hoàn thiện giao diện đẹp phù hợp với người dùng

 Phát triển trên mạng rộng ngoài mạng LAN

Trang 13

IV Source code

1 Chương trình bên Server

public class Database {

public String filePath="";

public Database(String filePath) {

this.filePath = filePath;

}

Trang 14

public boolean userExists(String username) {

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

Trang 15

DocumentBuilder dBuilder = db.newDocumentBuilder();

Document doc = dBuilder.parse(fXmlFile);

doc.getDocumentElement().normalize();

NodeList nList = doc.getElementsByTagName("user");

for (int i = 0; i < nList.getLength(); i++)

Trang 16

Node nNode = nList.item(i);

if (nNode.getNodeType() == Node.ELEMENT_NODE) {

Element eElement = (Element) nNode;

if (getTagValue("username", eElement).equals(username) &&

DocumentBuilder dBuilder = db.newDocumentBuilder();

Document doc = dBuilder.parse(filePath);

Trang 17

Element newusername = doc.createElement("username");

//Tạo vào file xml

TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer();

DOMSource source = new DOMSource(doc);

StreamResult result = new StreamResult(new File(filePath));

Trang 18

private static final long serialVersionUID = 1L;

//Loại , người gửi, nội dung, người nhận

public String type, sender, content, recipient;

public Message(String type, String sender, String content, String recipient){

this.type = type; this.sender = sender; this.content = content; this.recipient =

recipient;

}

@Override

public String toString(){

return "{type='"+type+"', sender='"+sender+"', content='"+content+"',

Trang 19

public SocketServer server;

public Thread serverThread;

public String filePath = "src\\com\\data\\Data.xml";

btnStart = new javax.swing.JButton();

jScrollPane1 = new javax.swing.JScrollPane();

txtThongBao = new javax.swing.JTextArea();

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);

Trang 21

addGap(16, 16, 16)

addComponent(btnStart)

addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE,

public void RetryStart(int port){

if(server != null){ server.stop(); }

server = new SocketServer(this, port);

catch(Exception ex){

Trang 22

// Variables declaration - do not modify

private javax.swing.JButton btnStart;

private javax.swing.JScrollPane jScrollPane1;

public javax.swing.JTextArea txtThongBao;

// End of variables declaration

class ServerThread extends Thread {

public SocketServer server = null;

public Socket socket = null;

public int ID = -1;

public String username = "";

Trang 23

public ObjectInputStream In = null;

public ObjectOutputStream Out = null;

public ServerFrame ui;

public ServerThread(SocketServer _server, Socket _socket) {

Trang 24

public void run() {

ui.txtThongBao.append("\nServer Thread " + ID + " đang chạy ");

while (true) {

try {

Message msg = (Message) In.readObject();

server.handle(ID, msg);

} catch (IOException ioe) {

System.out.println(ID + " Lỗi: " + ioe.getMessage());

server.remove(ID);

} catch (ClassNotFoundException ioe) {

System.out.println(ID + " Lỗi: " + ioe.getMessage());

server.remove(ID);

}

}

}

// 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());

Trang 25

public final class SocketServer implements Runnable {

public ServerThread clients[];

public ServerSocket server = null;

public Thread thread = null;

public int clientCount = 0, port = 9999;

public ServerFrame ui;

public Database db;

public SocketServer(ServerFrame frame) {

clients = new ServerThread[50];

ui = frame;

db = new Database(ui.filePath);

try {

Trang 26

server = new ServerSocket(port);

port = server.getLocalPort();

ui.txtThongBao.append("Server bắt đầu hoạt động IP : " +

InetAddress.getLocalHost() + ", Port : " + server.getLocalPort());

// Viết lại pt thêm tham số Port

public SocketServer(ServerFrame frame, int Port) {

clients = new ServerThread[50];

ui.txtThongBao.append("Server bắt đầu hoạt động IP : " +

InetAddress.getLocalHost() + ", Port : " + server.getLocalPort());

start();

} catch (IOException ioe) {

Trang 27

ui.txtThongBao.append("\nKhông thể kết nối cổng " + port + ": " +

Trang 28

if (thread != null) {

thread = null;

}

}

private int findClient(int ID) {

for (int i = 0; i < clientCount; i++) {

public synchronized void handle(int ID, Message msg) {

// Thông báo đến các Client có máy out

Trang 31

clients[findClient(ID)].send(new Message("message", "SERVER", "Không cho phép tải lên cho tất cả mọi người!", msg.sender));

public void ThongBao(String type, String sender, String content) {

Message msg = new Message(type, sender, content, "All");

for (int i = 0; i < clientCount; i++) {

clients[i].send(msg);

Trang 32

}

}

public void SendUserList(String toWhom) {

for (int i = 0; i < clientCount; i++) {

findUserThread(toWhom).send(new Message("newuser", "SERVER",

clients[i].username, toWhom));

}

}

public ServerThread findUserThread(String usr) {

for (int i = 0; i < clientCount; i++)

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) {

Trang 33

for (int i = pos + 1; i < clientCount; i++) {

ui.txtThongBao.append("\nThêm Client: " + socket);

clients[clientCount] = new ServerThread(this, socket);

Trang 34

ui.txtThongBao.append("\nĐã vượt quá số Client cho phép đăng nhập: " +

public ServerSocket server;

public Socket socket;

public int port;

public String saveTo = "";

public InputStream In;

public FileOutputStream Out;

public ChatFrame ui;

Trang 36

if(Out != null){ Out.close(); }

if(In != null){ In.close(); }

if(socket != null){ socket.close(); }

Trang 37

public History(String filePath){

Document doc = docBuilder.parse(filePath);

Node data = doc.getFirstChild();

Element message = doc.createElement("message");

Element _sender = doc.createElement("sender");

Trang 38

DOMSource source = new DOMSource(doc);

StreamResult result = new StreamResult(new File(filePath));

File fXmlFile = new File(filePath);

DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();

Document doc = dBuilder.parse(fXmlFile);

doc.getDocumentElement().normalize();

NodeList nList = doc.getElementsByTagName("message");

for (int temp = 0; temp < nList.getLength(); temp++) {

Node nNode = nList.item(temp);

if (nNode.getNodeType() == Node.ELEMENT_NODE) {

Trang 39

Element eElement = (Element) nNode;

model.addRow(new Object[]{getTagValue("sender", eElement),

getTagValue("content", eElement), getTagValue("recipient", eElement),

Trang 40

import java.util.Date;

import javax.swing.JFileChooser;

import javax.swing.JOptionPane;

import javax.swing.table.DefaultTableModel;

public class SocketClient implements Runnable {

public int port;

public String serverAddr;

public Socket socket;

public ChatFrame ui;

public ObjectInputStream In;

public ObjectOutputStream Out;

public History hist;

public SocketClient(ChatFrame frame) throws IOException {

ui = frame;

this.serverAddr = ui.serverAddr;

this.port = ui.port;

socket = new Socket(InetAddress.getByName(serverAddr), port);

Out = new ObjectOutputStream(socket.getOutputStream());

Out.flush();

In = new ObjectInputStream(socket.getInputStream());

hist = ui.hist;

Trang 41

Message msg = (Message) In.readObject();

System.out.println("Nhận vào : " + msg.toString());

//Gửi tin nhắn dưới loại message

Trang 43

if (!msg.content.equals(ui.username)) {

boolean exists = false;

for (int i = 0; i < ui.model.getSize(); i++) {

Trang 44

{

JFileChooser jf = new JFileChooser();

jf.setSelectedFile(new File(msg.content));

int returnVal = jf.showSaveDialog(ui);

String saveTo = jf.getSelectedFile().getPath();

if (saveTo != null && returnVal == JFileChooser.APPROVE_OPTION) {

Trang 45

Download dwn = new Download(saveTo, ui);

Thread t = new Thread(dwn);

t.start();

//send(new Message("upload_res",

(""+InetAddress.getLocalHost().getHostAddress()), (""+dwn.port), msg.sender));

send(new Message("upload_res", ui.username, ("" + dwn.port),

int port = Integer.parseInt(msg.content);

String addr = msg.sender;

ui.btnFile.setEnabled(false);

ui.btnGuiFile.setEnabled(false);

Upload upl = new Upload(addr, port, ui.file, ui);

Thread t = new Thread(upl);

Trang 46

} 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");

Trang 47

System.out.println("Gửi đi : " + msg.toString());

if (msg.type.equals("message") && !msg.content.equals(".bye")) {

String msgTime = (new Date()).toString();

Trang 48

public class Upload implements Runnable{

public String addr;

public int port;

public Socket socket;

public FileInputStream In;

public OutputStream Out;

public File file;

public ChatFrame ui;

public Upload(String addr, int port, File filepath, ChatFrame frame){

super();

try {

file = filepath; ui = frame;

socket = new Socket(InetAddress.getByName(addr), port);

Ngày đăng: 27/02/2015, 15:29

TỪ KHÓA LIÊN QUAN

w