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.
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. 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();
}
}}
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:
- bai_giang_lap_trinh_mang_chuong_7_chuong_trinh_chat_tren_nhi.pdf