Bài giảng Lập trình mạng - Chương 7: Chương trình chat trên nhiều máy

Chương 7: Chương trình chat trên nhiều máy  
Chương 1  
1. Giới thiệu  
ꢀ Chức năng  
– Cho phép nhiều user đăng ký vào các nhóm để trò chuyện với nhau.  
ꢀ Mô hình lựa chọn  
– Client/server  
ꢀ Server  
– Quản lý các nhóm và các user của từng nhóm.  
– phân phốuser khác.  
ꢀ Client  
– Giao tiếp với các user.  
– Cho phép họ đăng ký nhóm; gởi/nhận thông tin cho nhau.  
Chương 1  
1. Giới thiệu  
Giao thức dùng cho hệ thống MiniChat  
– Lệnh GLIST <CRLF>  
– Lệnh ULIST <CRLF>  
– Lệnh LOGIN <tên group>,<tên user> <CRLF>  
– Lệnh SEND <string> <CRLF>  
– Lệnh LOGOU <CRLF>  
ꢀ Dạng reply cho tất cả các request  
– N <chuỗi dữ liệu phụ kèm theo>  
– N = 1: Thành công, N = 0: Thất bại  
Mô hình 7 tầng OSI  
Chương 1  
2. Giao diện  
Chương 1  
2. Hàm xử lý biến cố  
ꢀ Tạo hàm xử lý biến  
cố cho từng button  
bằng cách chọn  
từng button, chọn  
mục event trong  
cửa sổ Properties,  
cửa sổ sau xuất  
hiện:  
Chương 1  
2. Hàm xử lý biến cố  
Phương pháp chính  
quy  
để khai báo biến và  
hàm  
xử lý biến cố với các  
phần tử giao diện là  
dùng menu  
View.ClassWizard, cửa  
sổ ClassWizard xuất  
hiện, trang  
MessageMap  
cho phép khai báo các  
hàm xử lý biến cố:  
Chương 1  
2. Hàm xử lý biến cố  
Để tạo các biến dữ liệu  
kết hợp với các control,  
chọn project, class chứa  
biến, trang Member  
variables, sau đó c
từng ID phần tử rồi ấn  
nút button “Add  
variable”, cửa sổ sau  
xuất hiện:  
Chương 1  
2. Hàm xử lý biến cố  
Kết quả tạo 4  
biến kết hợp với  
4 phần tử giao  
diện.  
Chương 1  
2. Hàm xử lý biến cố  
BOOL CMiniChatServerDlg::OnInitDialog() {  
…
// Tao socket moi, neu that bai bao sai  
ser_sock=socket(AF_INET,SOCK_STREAM,0);  
if(ser_sock==INVALID_SOCKET) {  
MessageBox("Khong tao duoc socket");  
return TRUE;  
}
// Thiet lap dia chi diem dau mut va bind no voi socket  
SOCKADDR_IN local_addr;  
local_addr.sin_family=AF_INET;  
local_addr.sin_port=256;  
local_addr.sin_addr.s_addr=INADDR_ANY;  
CKET_ERROR) {  
MessageBox("Khong bind socket duoc");  
return TRUE;  
}
Chương 1  
2. Hàm xử lý biến cố  
// Khai bao so yeu cau ket noi dong thoi  
if(listen(ser_sock,10)==SOCKET_ERROR) {  
MessageBox("Khong listen duoc");  
return TRUE;  
}
// Khai bao nhan du lieu bat dong bo + dong cau noi bat dong bo  
if (WSAAsyncSelect(ser_sock, m_hWnd, WSA_ACCEPT,  
FD_ACCEPT) > 0) {  
MessageBox("Error on WSAAsyncSelect()");  
closesocket(ser_sock);  
}
…}}  
Chương 1  
2. Hàm xử lý biến cố  
// Accept 1 yeu cau noi ket  
void CMiniChatServerDlg::OnAccept(void) {  
SOCKADDR_IN remote_addr;  
SOCKET sock;  
// Cho ket noi  
int len=sizeof(remote_addr);  
sock=accept(ser_sock,(LPSOCKADDR)&remote_addr,&len);  
if(sock==INVALID_SOCKET) {  
MessageBox("Khong
return;  
}
T_UserRec *puser = new(T_UserRec);  
puser->sock = sock;  
puser->next = sock_no_user;  
sock_no_user = puser;  
// Khai bao nhan du lieu bat dong bo + dong cau noi bat dong bo  
if (WSAAsyncSelect(sock, m_hWnd, WSA_RDCLOSE
FD_READ|FD_CLOSE) > 0) {  
MessageBox("Error on WSAAsyncSelect()");  
closesocket(sock);  
}
}
Chương 1  
2. Hàm xử lý biến cố  
// Doc vao request va xu ly  
void CMiniChatServerDlg::Request_Process(SOCKET sock) {  
int status;  
char mesg[MSG_LENGTH];  
status = recv(sock, mesg, MSG_LENGTH, 0);  
if (status==0) return;  
mesg[status] = 0;  
if (strncmp(mesg,"LOGIN",5)==0) { // login  
Do_login(sock,mesg);  
} else if (strncmp(mesg,"LOGOU",5)==0) { // logout  
Do_logout(sock);  
} else if (strncmp(mesg,"GLIST",5)==0) { // group list  
Do_glist(sock);  
} else if (strncmp(mesg,"ULIST",5)==0) { // user list  
Do_ulist(sock);  
} else { // broadcast message  
Do_broadcastMesg(sock,mesg);  
}
}}  
Chương 1  
3. Kỹ thuật xử lý Multithread với Java  
Thread  
– Một luồng thực thi trong một chương trình.  
– Máy ảo JVM cho phép một ứng dụng có nhiều luồng thực  
thi đồng thời.  
ꢀ Có 2 cách dùng Java multithread (đa luồng):  
– Khai báo một lớp kế thừa từ lớp Thread và override method  
Thread.run().  
– Khai báo một lớp hiện thực interface Runnable và method  
Runnable.run()  
Chương 1  
3. Kỹ thuật xử lý Multithread với Java  
1. class PrimeThread extends Thread {  
2.  
3.  
4.  
5.  
long minPrime;  
PrimeThread( long minPrime ) {  
this.minPrime = minPrime;  
}
6. public void run( ) {  
7.  
8.  
// compute
. . .  
9.  
}
10.  
11.  
12.  
}
PrimeThread p = new PrimeThread(143);  
p.start();  
Chương 1  
3. Kỹ thuật xử lý Multithread với Java  
1.  
class PrimeRun implements Runnable {  
2.  
long minPrime;  
3.  
PrimeRun ( long minPrime ) {  
4.  
this.minPrime = minPrime;  
5.  
}
6.  
public void run() {  
7.  
// compute
8.  
. . .  
9.  
}
10.  
11.  
12.  
}
PrimeRun p = new PrimeRun(143);  
new Thread(p).start();  
Chương 1  
3. Kỹ thuật xử lý Multithread với Java  
//Constructor của frame  
public MiniChatServerDlg() {  
…
// Tao sersersocket lang nghe cho server  
try {  
serverSocket = new ServerSocket( SERVER_PORT, 100 );  
DefaultListModel lmContent =  
(DefaultListModel)jlbContent.getModel();  
lmContent.addElement("Server listening on port " +  
SERVER_PORT + "  
...");  
// tạo thread con để chờ  
new ServerAcceptThread(this,serverSocket).start();  
} // end try  
// handle exception creating server and connecting clients  
catch ( IOException ioException ) {  
ioException.printStackTrace();  
}
…
}
Chương 1  
3. Kỹ thuật xử lý Multithread với Java  
public class ServerAcceptThread extends Thread {  
ServerSocket serverSocket;  
MiniChatServerDlg serverChat;  
public ServerAcceptThread(MiniChatServerDlg server,  
ServerSocket sock) {  
serverSocket = sock;  
serverChat = serve
}
public void run() {  
T_UserRec puser;  
try {  
// listen for clients constantly  
while (true) {  
// accept new clien
Socket clientSocket = serverSocket.accept();  
puser = new T_UserRec();  
puser.sock = clientSocket;  
puser.next = serverChat.m_sock_no_user;  
serverChat.m_sock_no_user = puser;  
Chương 1  
3. Kỹ thuật xử lý Multithread với Java  
// create new ReceivingThread for receiving messages from client  
new ReceivingThread(serverChat, clientSocket).start();  
// print connection information  
DefaultListModel lmContent =  
(DefaultListModel)serverChat.jlbContent.getModel();  
lmContent.addElement("Connection received from: " +  
clientSocket.getInetAddress());  
serverChat.SendMessage(clientSocket,"Request accepted");  
} // end while  
}
// handle exception creating server and connecting clients  
catch ( IOException ioException ) {  
ioException.printStackTrace();  
}
}}  
Chương 1  
3. Kỹ thuật xử lý Multithread với Java  
// create new ReceivingThread for receiving messages from client  
new ReceivingThread(serverChat, clientSocket).start();  
// print connection information  
DefaultListModel lmContent =  
(DefaultListModel)serverChat.jlbContent.getModel();  
lmContent.addElement("Connection received from: " +  
clientSocket.getInetAddress());  
serverChat.SendMessage(clientSocket,"Request accepted");  
} // end while  
}
// handle exception creating server and connecting clients  
catch ( IOException ioException ) {  
ioException.printStackTrace();  
}
}}  
pdf 19 trang yennguyen 40160 Free
Bạn đang xem tài liệu "Bài giảng Lập trình mạng - Chương 7: Chương trình chat trên nhiều máy", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfbai_giang_lap_trinh_mang_chuong_7_chuong_trinh_chat_tren_nhi.pdf