You are on page 1of 12

Khoa Công Nghệ Thông Tin – Đại học Khoa Học Tự Nhiên

Bộ môn Mạng Máy Tính và Viễn Thông

BÀI TẬP 2 – LẬP TRÌNH SOCKET


Môn Mạng Máy Tính - Lớp TH2009 – HK2, Năm học 2010 – 2011

[Quy định]
Deadline: 23h55 phút ngày 15/05/2011
Quy định chung
- Thang điểm: 50% điểm thực hành.
- Đồ án được làm theo nhóm: mỗi nhóm gồm 2 sinh viên theo danh sách đã đăng ký.
- Bài làm giống nhau giữa các nhóm, tất các các nhóm liên quan đều bị điểm 0 phần
thực hành bất kể lý do gì và xem như không hoàn thành môn học dù điểm lý
thuyết>5.
- Ngôn ngữ sử dụng: C++, C#, Java
o Winsock
o C++: CSocket
o C#: Socket
o Java: Socket, ServerSocket
- Môi trường lập trình: Microsoft Visual C++ 6.0, Microsoft Visual Studio 2003 
2010, Netbean, Eclipse

Cách thức nộp bài


- Một sinh viên trong nhóm đại diện nhóm nộp bài trực tiếp trên moodle theo link của lớp
mình.
- Sinh viên nén bài làm của nhóm mình thành file nén có tên
<ĐỀ>_<Lớp>_MSSV1_MSSV2.[zip|rar]
Ví dụ: Nhóm gồm 2 sv 0951001 và 0951002 làm đề tài 1 học lớp TH2009/01, thì tên file đặt
là: 01_TH2009_01_0951001_0951002.zip và link nộp bài là “TH2009_01_Link nộp bài
Bài tập 2 – Deadline 23h55’ ngày 15/05/2011”
- Sinh viên tổ chức bài làm theo cấu trúc sau:
o Bao Cao: chứa báo cáo về bài làm của mình
o Release: chứa file thực thi của chương trình (*.exe)
o Source: chứ source code của chương trình , yêu cầu nộp cả project và bỏ thư
mục Debug
Nếu làm không đúng những yêu cầu trên, bài làm sẽ không được chấm.

1
Khoa Công Nghệ Thông Tin – Đại học Khoa Học Tự Nhiên
Bộ môn Mạng Máy Tính và Viễn Thông

[Tiêu chí đánh giá]


Các nhóm Xây dựng chương trình (8đ) và viết Báo cáo (2đ) theo phân công trong danh
sách “TH2009-[01|02|03]-Phân đề tài lập trình Socket”.

Về chương trình:
- Mục tiêu của đồ án này tập trung chủ yếu vào 2 vấn đề: lập trình socket, xây dựng giao
thức trao đổi giữa client và server.
- Lưu ý: Không đòi hỏi giao diện, tuy nhiên vẫn khuyến khích giao diện đẹp và dễ sử dụng
(có các ghi chú hay thông báo cho người dùng biết chương trình đang làm gì và người
dùng cần phải làm gì)

Về báo cáo:
- Thông tin của nhóm và mức độ đóng góp của từng thành viên trong nhóm.
- Ngôn ngữ và môi trường sử dụng trong bài làm.
- Sơ đồ hoạt động của Client và Server.
- Format của gói tin truyền giữa client và server
- Mức độ hoàn thành bài tập (trình bày rõ các lỗi còn xuất hiện trong chương trình).
- Các nguồn tài liệu tham khảo.
- Lưu ý: không dán các đoạn source code của chương trình vào báo cáo. Mã chương trình
chỉ trình bày nếu thật sự cần thiết và nếu cần minh họa cho các mô hình cài đặt hay các
cơ chế đồng bộ và minh họa dưới dạng mã giả.

2
Khoa Công Nghệ Thông Tin – Đại học Khoa Học Tự Nhiên
Bộ môn Mạng Máy Tính và Viễn Thông

DANH SÁCH ĐỀ TÀI ĐỒ ÁN THỰC HÀNH

Đề 1: CHIẾC NÓN KỲ DIỆU ONLINE

Viết chương trình cho phép Server đóng vai trò quản trò trong trò chơi “Chiếc nón kỳ
diệu” và client là người chơi. Số người chơi trong 1 lượt chơi là N, do Server quy định
khi bắt đầu 1 lượt chơi mới. Mỗi lượt chơi diễn ra như sau:

1. Người chơi kết nối vào server để đăng ký nickname của mình. Nickname giữa các
người chơi không được trùng nhau và được tạo thành từ các ký tự ‘a’…’z’,
‘A’…’Z’, ‘0’..’9’. Server phản hồi cho người chơi biết có bị trùng Nickname hay
không khi tiếp nhận đăng ký nickname từ 1 người chơi. Người chơi phải đăng ký
lại nickname của mình nếu nhận thông tin phản hồi bị trùng nickname từ server.
2. Sau khi tiếp nhận đăng ký từ N người chơi, Server khởi tạo điểm số cho mỗi người
chơi là 0.
3. Server chọn 1 ô chữ trong file dữ liệu lưu sẵn tại Server.
4. Server gửi cho các người chơi: số người tham gia đoán ô chữ, thứ tự đoán của
người chơi, số ký tự trong ô chữ và gợi ý về ô chữ đó. VD: có 2 người chơi, người
chơi có thứ tự đoán là 2, số ký tự trong ô chữ là 3, gợi ý: “ten cua mot mo hinh
mang”. Lưu ý: server có thể random thứ tự đoán của mỗi người chơi.
5. Lặp lại các lần đoán từ người thứ nhất đến người thứ N (và quay ngược lại người
thứ nhất) đến khi nào lượt chơi kết thúc. Mỗi lần đoán của 1 người chơi thực hiện
như sau:
a. Server gởi thông báo cho người chơi biết đến lượt người chơi đó đoán.
b. Người chơi quay vòng quay (dùng hàm random từ 0..100) để chọn số điểm
thưởng D khi đoán đúng và gởi về cho server.
c. Nếu điểm thưởng của người chơi là 0 thì server thông báo cho tất cả các
client biết client đó bị mất lượt đoán. Và lần đoán này không tính vào tổng
số lần đoán của ô chữ. Server chuyển quyền đoán ô chữ sang người chơi kế
tiếp.
d. Ngược lại, người chơi nhập vào ký tự mình đoán và gởi về cho server. Nếu
người chơi muốn đoán ô chữ, người chơi gởi về ô chữ mà mình đoán.
e. Server thông báo cho tất cả các người chơi ký tự mà người chơi đó vừa
đoán và vị trí ký tự đó xuất hiện trong ô chữ. Trong trường hợp người chơi
đoán nguyên ô chữ, server thông báo ô chữ mà người chơi đoán và kết quả
đoán đúng hay sai

3
Khoa Công Nghệ Thông Tin – Đại học Khoa Học Tự Nhiên
Bộ môn Mạng Máy Tính và Viễn Thông

f. Nếu người chơi đoán đúng ký tự thì được cộng D điểm vào tổng điểm của
người chơi đó. Nếu người chơi đoán đúng ô chữ thì được cộng 3xD điểm
thưởng.
g. Server chuyển quyền đoán sang người chơi kế tiếp.
6. Khi lượt chơi kết thúc, Server thông báo tổng số điểm của từng người chơi về cho
tất cả các người chơi và người thắng cuộc (nếu có).
7. Server chuyển sang một lượt chơi mới.

Mỗi ô chữ gồm 3 thông tin: từ/cụm từ trong ô chữ, gợi ý về ô chữ và số lần đoán tối đa
cho ô chữ đó.

Lượt chơi kết thúc nếu thoả 1 trong các điều kiện sau:

 ô chữ được giải


 số lần đoán lớn hơn số lần đoán tối đa của ô chữ đó
 không còn người chơi.

Gợi ý tổ chức các ô chữ: lưu dưới dạng file text gồm nhiều dòng, 3 dòng sẽ tạo thành 1 ô
chữ: dòng đầu là từ/cụm từ trong ô chữ, dòng thứ 2 là gợi ý về ô chữ, dòng thứ 3 qui định
số lần đoán ký tự tối đa. Ngoài ra, các bạn có thể lưu trữ dưới dạng file xml hoặc 1 file có
cấu trúc khác.

4
Khoa Công Nghệ Thông Tin – Đại học Khoa Học Tự Nhiên
Bộ môn Mạng Máy Tính và Viễn Thông

Đề 2: AI LÀ TRIỆU PHÚ

Viết chương trình cho phép Server đóng vai trò quản trò trong trò chơi “Ai là Triệu
phú” và client là người chơi. Số người chơi trong 1 lượt chơi là N, do Server quy định
khi bắt đầu 1 lượt chơi mới. Mỗi lượt chơi diễn ra như sau:

1. Người chơi kết nối vào server để đăng ký nickname của mình. Nickname giữa các
người chơi không được trùng nhau và được tạo thành từ các ký tự ‘a’…’z’,
‘A’…’Z’, ‘0’..’9’. Server phản hồi cho người chơi biết có bị trùng Nickname hay
không khi tiếp nhận đăng ký nickname từ 1 người chơi. Người chơi phải đăng ký
lại nickname của mình nếu nhận thông tin phản hồi bị trùng nickname từ server.
2. Server chọn 1 bộ câu hỏi trong file dữ liệu lưu sẵn tại Server.
3. Server gửi cho tất cả người chơi thông tin về: số người tham gia, thứ tự trả lời của
người chơi, tổng số câu hỏi trong lượt chơi này.
VD: có 2 người chơi, người chơi có thứ tự đoán là 2, tổng số câu hỏi trong lượt
chơi này là 20. Thứ tự người chơi do server quyết định, số câu hỏi trong lượt chơi
do server chọn (nên chọn số câu hỏi > 3 lần số người chơi).
4. Lặp lại các lần trả lời từ người thứ nhất đến người thứ N (và quay ngược lại người
thứ nhất) đến khi nào trò chơi kết thúc.
- Trò chơi kết thúc nếu thỏa một trong các điều kiện sau:
o Chỉ còn lại một người chơi. Người chơi này sẽ là người chiến thắng.
o Người chơi trả lời câu hỏi cuối cùng trong bộ câu hỏi.
- Mỗi lần trả lời của 1 người chơi thực hiện như sau:
a. Server gởi thông báo cho người chơi biết đến lượt và gửi kèm câu hỏi để
người chơi trả lời.
b. Người chơi lúc này có 2 lựa chọn:
o Trả lời và gửi đáp án của mình về cho server.
o Không trả lời và nhường quyền trả lời cho người chơi tiếp theo.
Sau khi quyết định, người chơi gửi lựa chọn của mình về cho server.
Lưu ý: mỗi người chơi chỉ được chọn phương án “nhường quyền” một lần
duy nhất trong toàn trò chơi.
c. Khi server nhận được lựa chọn của người chơi:
o Nếu người chơi là người chơi duy nhất còn lại thì người chơi này là
người chiến thắng dù trả lời đúng hay sai.
o Nếu người chơi không phải là người còn lại duy nhất, người chơi chọn
trả lời và trả lời đúng câu hỏi thì server gửi câu hỏi tiếp theo đến cho
người chơi. Nếu câu hỏi server gửi cho người chơi là câu hỏi cuối cùng

5
Khoa Công Nghệ Thông Tin – Đại học Khoa Học Tự Nhiên
Bộ môn Mạng Máy Tính và Viễn Thông

thì người chơi đó là người chiến thắng (dù trả lời đúng hay sai câu hỏi
cuối cùng này).
o Nếu người chơi không phải là người còn lại duy nhất, người chơi chọn
trả lời và trả lời sai thì người chơi đó bị loại.
o Nếu người chơi chọn “nhường quyền” và lựa chọn này là hợp lệ (tức là
người chơi chưa lựa chọn “nhường quyền” trong các lượt chơi trước),
server sẽ chuyển quyền trả lời tới người chơi tiếp theo.
o Nếu người chơi chọn “nhường quyền” và lựa chọn này là không hợp lệ
(tức là người chơi đã lựa chọn “nhường quyền” ở lượt chơi trước),
server sẽ gửi thông báo cho người chơi biết và người chơi bắt buộc phải
trả lời câu hỏi này.
5. Server chuyển sang một lượt chơi mới.

6
Khoa Công Nghệ Thông Tin – Đại học Khoa Học Tự Nhiên
Bộ môn Mạng Máy Tính và Viễn Thông

Đề 3: TRÒ CHƠI « VUI VỚI TIN HỌC »

Viết chương trình cho phép Server đóng vai trò BTC cuộc thi “Vui với tin học” và các
client là các thí sinh dự thi. Tại cùng 1 thời điểm, Server sẽ cho N thí sinh cùng dự thi (N
>=0 và do người dùng trên server qui định), các câu hỏi trắc nghiệm sẽ được lấy từ một
database (định dạng dữ liệu xem ở cuối đề), số câu trắc nghiệm sẽ là 10 câu.

1. Với mỗi thí sinh, thí sinh sẽ đăng ký tham gia trò chơi cho Server với 1 nickname.
. Lưu ý: các nickname không được đặt trùng nhau và được tạo thành từ các ký tự
„a‟…‟z‟, „A‟…‟Z‟, „0‟..‟9‟, „_‟ và dài không quá 10 ký tự; nếu có thí sinh đặt
trùng nickname với thí sinh khác, thì server yêu cầu client đăng ký lại nickname.
2. Khi Server nhận đủ đăng ký của N thí sinh, server sẽ cho mỗi người thi 10 điểm và
bắt đầu cuộc thi
3. Với mỗi lượt chơi:
a. Server sẽ lần lượt gửi các câu hỏi trắc nghiệm và các câu trả lời về cho các
client
b. Các thí sinh lần lượt gởi cho server lựa chọn của mình
c. Khi nhận đủ các lựa chọn của thí sinh Server sẽ thông báo đáp án đúng về
cho thí sinh và tính điểm cho người thi theo nguyên tắc sau :
i. Các thí sinh trả lời sai sẽ bị trừ 1 điểm.
ii. Các thí sinh trả lời đúng sẽ được M điểm với M là tổng điểm bị trừ
của các thí sinh còn lại trả lời sai.
iii. Khi một thí sinh trả lời sai 3 câu liên tục, thí sinh này sẽ được loại
bởi cuộc chơi, số lượng thí sinh còn lại được hệ thống cập nhật và
thông báo cho các thí sinh còn lại trong cuộc thi.
d. Sau khi tính điểm xong server cập nhật và thông báo điểm hiện thời về cho
thí sinh ở từng câu hỏi.
4. Trò chơi kết thúc khi đã hết câu hỏi, Server sẽ gởi tổng điểm cho các thí sinh và
nickname của các thí sinh thắng cuộc (các thí sinh có số điểm cao nhất).

7
Khoa Công Nghệ Thông Tin – Đại học Khoa Học Tự Nhiên
Bộ môn Mạng Máy Tính và Viễn Thông

5. Kết thúc chương trình.


Định dạng dữ liệu:

 Mỗi câu hỏi sẽ có độ dài bất kì.


 Mỗi câu trả lời sẽ có độ dài bất kì.
 Mỗi câu hỏi có 4 câu trả lời được đánh số là 1,2,3,4 và đáp án của câu hỏi đó.
 Dữ liệu câu hỏi/đáp án có thể đọc từ file hoặc nhập thẳng vào source code của
chương trình.

8
Khoa Công Nghệ Thông Tin – Đại học Khoa Học Tự Nhiên
Bộ môn Mạng Máy Tính và Viễn Thông

Đề 4: TRÒ CHƠI “BÀI XÌ DÁCH”

Viết chương trình mô phỏng trò chơi “Bài xì dách” cho phép Server làm giám
khảo giữa N client là người tham gia trò chơi (N do người dùng tại Server quy định, 2 <=
N <= 8). Trò chơi thực hiện như sau:

1. Trên Server cho phép nhận vào các thông tin:


a. Số Client tham gia trò chơi: N
b. Số lượt muốn chơi: L
2. Với mỗi Client: Client sẽ đăng ký tham gia trò chơi cho Server với 1 nickname.
Lưu ý: các nickname không được đặt trùng nhau và được tạo thành từ các ký tự
„a‟…‟z‟, „A‟…‟Z‟, „0‟..‟9‟, „_‟ và dài không quá 10 ký tự; nếu có thí sinh đặt
trùng nickname với thí sinh khác, thì server yêu cầu client đăng ký lại nickname.
3. Sau khi N client đã kết nối đến Server, Server thông báo cho mọi Client biết trò
chơi có bao nhiêu lượt.
4. Trò chơi lặp lại L lượt, với mỗi lượt diễn ra như sau:
a. Server phát sinh ngẫu nhiên 2 lá bài trong 52 lá bài và gửi cho mỗi người
chơi (mỗi lá bài được đánh dấu chỉ chọn 1 lần).
b. Các Client trả lời cho Server biết Client có muốn rút bài tiếp hay không
cũng như số điểm các lá bài mà Client nhận được. Nếu Client không muốn
rút bài tiếp thì coi như hoàn tất 1 lượt chơi. Lưu ý: mỗi Client có tối đa 3
lần rút bài trong 1 lượt chơi.
c. Sau khi Server nhận tất cả thông tin gửi về từ Client, có 2 trường hợp:
i. Nếu Client nào muốn rút thêm thì Server lại rút ngẫu nhiên 1 lá bài
từ các lá bài còn lại gửi về cho Client đó.
ii. Nếu Client nào báo lên không muốn rút bài nữa hoặc đủ 3 lần rút bài
thì khóa sổ Client đó lại cùng với điểm số của nó.
d. Lặp lại bước b  c cho đến khi mọi Client hoàn tất rút bài và gửi kết quả
cho Server.

9
Khoa Công Nghệ Thông Tin – Đại học Khoa Học Tự Nhiên
Bộ môn Mạng Máy Tính và Viễn Thông

e. Thông báo cho các Client biết số điểm của mọi người và thông báo chúc
mừng người thắng cuộc. Có thể có nhiều người thắng cuộc. Người thắng
cuộc là người có điểm cao nhất không vượt quá 21.
f. Lặp lại bước a  e cho đến khi hết số vòng của trò chơi.
5. Kết thúc chương trình.
Ghi chú: một bộ bài gồm có 52 lá từ 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K, A (mỗi loại
có 4 lá). Số điểm mỗi lá bài được tính như sau:

- Từ 2  10: có số điểm tương ứng


- J, Q, K được tính 10 điểm
- A được tính như sau:
o Với 2 lá bài thì A được tính là 10 hoặc 11
o Với 3 lá bài thì A được tính là 10 hoặc 1
o Với 4 lá bài trở lên thì A được tính là 1

10
Khoa Công Nghệ Thông Tin – Đại học Khoa Học Tự Nhiên
Bộ môn Mạng Máy Tính và Viễn Thông

Đề 5: TÀU THĂM DÒ

I. Giới thiệu bài toán

Một tàu thăm dò có nhiệm vụ ghi lại địa hình của một vùng đất được biểu diễn bằng một
ma trận nxn. Vùng đất chỉ có 2 dạng địa hình là địa hình bằng phẳng biểu diễn bằng màu
trắng và chướng ngại vật biểu diễn bằng màu xám. Tàu có khả năng quan sát trong một
phạm vi hạn chế ngay phía trước mặt. Tàu không thể đi lên trên chướng ngại vật nhưng
vùng quan sát của tàu không phụ thuộc vào các chướng ngại vật này.
Vùng nhìn thấy của tàu biểu diễn bằng phần màu xanh lá cây trên đỉnh của dấu nón.
Tàu có khả năng di chuyển mỗi lần 2 ô trên ma trận. Mỗi một lần, tàu gửi về thông tin về
địa hình trong vùng nó quan sát được sau đó nhận lệnh của người điều khiển từ xa. Lệnh
điều khiển chỉ chứa một thông tin duy nhất là hướng đi của tàu. Sau khi nhận lệnh, tàu tự
động quay mặt về hướng đã chỉ định và di chuyển theo hướng đó 2 đơn vị. Tàu thăm dò
không thể ghi nhận thông tin địa hình trong khi đang di chuyển mà chỉ thực hiện sau khi
đã đứng yên. Vùng nhìn thấy được của tàu luôn luôn nằm ở phía trước mặt tàu.
Sau 5 lượt điều khiển, tàu sẽ tự động ngắt kết nói với trạm điều khiển. Lúc này trạm
điều khiển có nhiệm vụ xây dựng lại ma trận biểu diễn địa hình dựa vào những gì đã quan
sát được từ tàu thăm dò.

11
Khoa Công Nghệ Thông Tin – Đại học Khoa Học Tự Nhiên
Bộ môn Mạng Máy Tính và Viễn Thông

II. Yêu cầu:

Viết chương trình giải quyết các yêu cầu trên. Khuyến khích sinh viên tự xây dựng
mô hình và giao thức để giải quyết bài toán.
III. Mô hình và giao thức (gợi ý):
Mô hình gồm 1 client là tàu thăm dò và 1 server là trạm điều khiển. Mô hình sử dụng
phương pháp tuần tự.
1. Server lắng nghe kết nối.
2. Client mở kết nối đến server.
3. Client cập nhật thông tin về địa hình quan sát được trong phạm vi màu xanh lá
cây.
4. Client gửi về thông tin địa hình nằm trong phần màu xanh lá cây cho server.
5. Server nhận được thông tin từ client, cập nhật vào thông tin địa hình đã thu
thập được từ đầu.
6. Server gửi thông điệp chỉ cho tàu thăm dò biết một hướng đi. Hướng đi gồm 4
hướng ▲ (trên), ► (phải), ▼ (xuống), ◄ (trái).
7. Client nhận được thông tin một hướng đi, quay mặt về hướng đó và di chuyển
2 ô trên ma trận.
8. Lặp lại bước 3 đến bước 7 năm lần.
9. Client ngắt kết nối với server.
10. Server hiển thị bản đồ đã cập nhật suốt quá trình cho người dùng.

12

You might also like