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 nhiu máy  
Chương 1  
1. Gii thiu  
Chc năng  
– Cho phép nhiu user đăng ký vào các nhóm để trò chuyn vi nhau.  
Mô hình la chn  
– Client/server  
Server  
– Qun lý các nhóm và các user ca tng nhóm.  
– phân phuser khác.  
Client  
– Giao tiếp vi các user.  
– Cho phép họ đăng ký nhóm; gi/nhn thông tin cho nhau.  
Chương 1  
1. Gii thiu  
Giao thc dùng cho hthng MiniChat  
– Lnh GLIST <CRLF>  
– Lnh ULIST <CRLF>  
– Lnh LOGIN <tên group>,<tên user> <CRLF>  
– Lnh SEND <string> <CRLF>  
– Lnh LOGOU <CRLF>  
Dng reply cho tt ccác request  
– N <chui dliu phkèm theo>  
– N = 1: Thành công, N = 0: Tht bi  
Mô hình 7 tng OSI  
Chương 1  
2. Giao din  
Chương 1  
2. Hàm xlý biến cố  
To hàm xlý biến  
ccho tng button  
bng cách chn  
tng button, chn  
mc event trong  
ca sProperties,  
ca ssau xut  
hin:  
Chương 1  
2. Hàm xlý biến cố  
Phương pháp chính  
quy  
để khai báo biến và  
hàm  
xlý biến cvi các  
phn tgiao din là  
dùng menu  
View.ClassWizard, ca  
sClassWizard xut  
hin, trang  
MessageMap  
cho phép khai báo các  
hàm xlý biến c:  
Chương 1  
2. Hàm xlý biến cố  
Để to các biến dliu  
kết hp vi các control,  
chn project, class cha  
biến, trang Member  
variables, sau đó c
tng ID phn tri n  
nút button “Add  
variable”, ca ssau  
xut hin:  
Chương 1  
2. Hàm xlý biến cố  
Kết quto 4  
biến kết hp vi  
4 phn tgiao  
din.  
Chương 1  
2. Hàm xlý 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 xlý 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 xlý 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 xlý 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. Kthut xlý Multithread vi Java  
Thread  
– Mt lung thc thi trong mt chương trình.  
– Máy o JVM cho phép mt ng dng có nhiu lung thc  
thi đồng thi.  
Có 2 cách dùng Java multithread (đa lung):  
– Khai báo mt lp kế tha tlp Thread và override method  
Thread.run().  
– Khai báo mt lp hin thc interface Runnable và method  
Runnable.run()  
Chương 1  
3. Kthut xlý Multithread vi 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. Kthut xlý Multithread vi 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. Kthut xlý Multithread vi Java  
//Constructor ca 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 + "  
...");  
// to 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. Kthut xlý Multithread vi 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. Kthut xlý Multithread vi 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. Kthut xlý Multithread vi 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 08/04/2022 20060
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