Sau đó gửi các yêu cầu đến máy chủ, các chơng trình dịch vụ trên máy chủ nh web server hay mail server,… Sẽ xử lý những yêu cầu này và gửi kết quả ngợc về cho máy khách chẳng hạn web ser
Trang 1trờng đại học vinh
khoa công nghệ thông tin
-Phan Vô Song - Nguyễn Chí Hòa
Sử dụng lập trình socket với C#
Xây dựng chơng trình Chat Room
Trang 2Chúng em xin chân thành cảm ơn các thầy, cô trong khoa Công nghệthông tin đã tận tình giảng dạy, trang bị cho chúng em những kiến thức quý báutrong những năm học vừa qua Và luôn sẵn sàng chỉ bảo giúp đỡ chúng em hoànthành đề tài này.
Mặc dù đã cố gắng hoàn thành đề tài trong phạm vi và khả năng cho phépnhng chắc chắn sẽ không tránh khỏi những thiếu sót Chúng em rất mong nhận
đợc sự thông cảm, góp ý và tận tình chỉ bảo của thầy, cô cùng các bạn
Vinh, tháng 05 năm 2009Nhóm sinh viên thực hiện Phan Vô Song - Nguyễn Chí Hòa
Trang 3Mục lục
Lời nói đầu 4
Chơng 1: Tổng quan về đề tài 5
1.1 Mạng, gói tin và giao thức 5
1.1.1 Mạng (Network) 5
1.1.2 Gói tin (Packets) 5
1.1.3 Giao thức (Porotocol) 5
1.2 Về địa chỉ và tên 5
1.2.1 Địa chỉ (address) 5
1.2.2 Tên (name) 6
1.3 Mô hình khách/chủ và mạng ngang hàng 7
1.3.1 Mô hình khách/chủ(Client/server) 7
1.3.2 Mô hình mạng ngang hàng (peer-to-peer) 9
1.4 Lập trình mạng thông qua socket 9
Chơng 2: Cơ bản về Socket 10
2.1 Khái niệm TCP , UDP và socket 10
2.2 Các lớp hỗ trợ lập trình socket trong C# 12
Chơng 3: Lập trình socket trong C# 13
3.1 Các th viện hỗ trợ trong C# 13
3.1.1 Sử dụng th viện System.Net 13
3.1.2 Sử dụng th viện System.Net.Socket 13
3.2 Lập trình đa luồng trong C# 15
Chơng 4: Xây dựng chơng trình Chat room 17
4.1 Bài toán Chat room 17
4.2 Cài đặt 17
4.2.1 Các quy ớc chung 17
4.2.2 Thiết kế giao diện chơng trình 20
4.2.3 Cài đặt chơng trình 22
a) Quá trình móc nối thông tin 22
b) Tổ chức một số lớp cơ bản 28
Tổng kết 34
4.1 Kết quả đạt đợc 34
4.2 Hạn chế 34
4.3 Hớng phát triển 34
Trang 4Lời nói đầu
Có thể nói sự phát triển vợt bậc của Công nghệ thông tin đã giúp con ngờigiải quyết đợc rất nhiều bài toán, nhng một điều quan trọng ở đây là không chỉ
đơn thuần là giải đợc bài toán đó mà là phơng pháp để giải bài toán đó nh thếnào và sao cho có hiệu quả nhất Hầu hết trong tất cả các ứng dụng nh trình
duyệt web, yahoo, team viewer, đều sử dụng socket để truyền và nhận dữ liệu.
Đối với mỗi máy tính nối mạng đợc đánh một địa chỉ IP nhất định Tơng tự nh vậy socket đợc xem là địa chỉ của chơng trình Nên việc sử dụng socket để
truyền, nhận dữ liệu là khó có thể tránh đợc Trong khi đó ở nớc ta vấn đề nàycha đợc nhiều ngời quan tâm, và sử dụng rộng rãi
Với đề tài “Sử dụng lập trình socket với C# - Xây dựng chơng trình
Chat room” mong sẽ giúp mọi ngời hiểu hơn, nắm vững hơn đặc biệt là qua ứng
dụng Chat room trong mạng LAN, mà chúng tôi sẽ trình bày trong đề tài này.
Nội dung của đề tài gồm
Trang 5Chơng 1: Tổng quan về đề tài1.1 Mạng, gói tin và giao thức
1.1.2 Gói tin (Packets)
Những gói tin hay thông tin của chúng ta ở đây là những chuỗi bytes có
cấu trúc đợc những chơng trình gửi đi trên mạng
Địa chỉ IP cho biết vị trí của 1 hệ thống trong 1 mạng giống nh địa chỉ xác
định ngôi nhà trên con đờng nào đó Tơng tự nh 1 khu dân c Địa chỉ IP phải làduy nhất trên toàn cầu và phải đợc viết dới dạng 1 định dạng chuẩn
Mỗi địa chỉ IP đợc chia thành 2 phần: Phần địa chỉ mạng (Net ID) và phần
địa chỉ trạm (Host ID)
- Net ID: Dùng để nhận dạng những hệ thống trong cùng 1 khu vực vật
lý còn đợc gọi là phân đoạn (segment) Mọi hệ thống trong cung 1 phân
đoạn phải có cùng địa chỉ mạng và phần địa chỉ mạng này là phải duy nhấttrong số các mạng hiện có
- Host ID: Dùng để nhận dạng 1 trạm làm việc, 1 máy chủ, 1 Router
hoặc trạm TCP/IP trong phân đoạn Phần địa chỉ trạm cũng phải là duynhất trong mạng
- Giống nh địa chỉ bu điện gồm 2 phần: Mã bu điện - Số nhà, tên đờng
Địa chỉ IP cũng vậy gồm: Net ID - Host ID
- Phần đầu tiên, Net ID nhận mạng mà máy tính nối tới, tất cả trongcùng mạng phải có cùng Net ID
Trang 6- Phần thứ hai, Host ID xác định máy tính, router hoặc thiết bị mạngkhác trong mạng Host ID là duy nhất trong 1 mạng.
- Sự kết hợp giữa Net ID và Host ID cho phép nhận dạng duy nhất mỗimáy tính riêng biệt
Các địa chỉ IP có chiều dài 32 bit đợc chia thành 4 dãy Mỗi dãy gồm 8 bit(1Byte), mỗi byte đợc phân cách bằng 1 dấu (.), 1byte là 1 giá trị nằm trongkhoảng 0-255
1.2.2 Tên (name)
Mỗi máy, mỗi trạm hay mỗi thiết bị mạng sử dụng TCP/IP để truyềnthông đều sử dụng địa chỉ IP Đối với các máy móc thiết bị thì việc sử dụng cáccon số là đơn giản dễ dàng nhng đối với con ngời là một vấn đề Ví dụ để nhớ
địa chỉ website www.microsoft.com là đơn giản và dễ dàng đối với con ngời
nh-ng để nhớ 207.46.230.219 thật khó khăn
Vì vậy mỗi máy, mỗi trạm hay mỗi thiết bị nối mạng đều có một cái tênduy nhất Và để thực hiện việc chuyển đổi giữa 2 kiểu địa chỉ này ngời ta sửdụng DNS (Domain Name Sytem) để ánh xạ
browser) hay chơng trình gửi nhận email sẽ tao ra kết nối (connection) với một
máy chủ ở xa (server) Sau đó gửi các yêu cầu đến máy chủ, các chơng trình dịch
vụ trên máy chủ nh web server hay mail server,… Sẽ xử lý những yêu cầu này
và gửi kết quả ngợc về cho máy khách (chẳng hạn web server sẽ truy tìm và trả
về cho máy khách các trang web theo địa chỉ mà máy khách đa đến còn mail
Trang 7server lu trử và gửi về cho máy khách những bức email mới) Thông thờng một
dịch vụ trên máy chủ phục vụ rất nhiều máy khách
Khi thiết kế chơng trình theo mô hình khách chủ thông thờng ta phân rathành hai phần, một phần là chơng trình viết chạy trên máy khách còn một phần
là chơng trình viết chạy trên máy chủ
- Chơng trình viết chạy trên máy khách:
+ Các chơng trình ở máy khách nhìn chung thờng thực hiện nhữngnhiệm vụ sau:
Kết nối với máy chủNhận dữ liệu hay yêu cầu do ngời dùng nhập vào từ bên ngoàiGửi dữ liệu hay yêu cầu đến máy chủ để xử lý
Trình bày kết quả trả về từ máy chủ cho ngời dùng xem+ Các chơng trình thực hiện những tác vụ này ở máy khách rất đadạng có thể kể một số ứng dụng tiêu biểu sau:
Chơng trình đọc và gửi email: Tạo điều kiện cho ngời dùng gửi
và nhận email Soạn thảo email trớc khi gửi đi, lấy các bức email
về từ máy chủ và cho xem nội dung của nó, quản lý các bức
email theo ngày tháng,… Các chơng trình gửi nhận email nối
tiếng điển hình nh: Trên windows có Edora, OutLook, trên hệUNIX có Pine, Elm,…
Trình duyệt (web browser): Dùng truy tìm và đọc các trang web trên mạng Địa chỉ các trang web sẽ đợc các trình duyệt gửi đến máy chủ và máy chủ sẽ gửi trả về nội dung trang web bao gồm
các dữ liệu nh văn bản, hình ảnh, âm thanh,… Trình duyệt sẽ
chịu tránh nhiệm trình bày kết quả trang web ra màn hình với
những loại dữ liệu nhận đợc này Các trình duyệt điển hình nh:
Internet Explorer, Netscape Navigator và Firefox,…
- Các chơng trình viết chạy trên máy chủ:
Các chơng trình thiết kế chạy trên máy chủ thờng phải lắng nghe cáckết nối từ các chơng trình trên máy khách gửi đến Tiếp nhận những yêucầu từ máy khách sau đó xử lý và gửi trả kết quả xử lý về cho máy khách
Nh vậy chơng trình ở máy chủ đóng vai trò nh một dịch vụ (server) phục
vụ cho máy khách Có rất nhiều loại dịch vụ trên máy chủ, điển hình gồmcó:
Trang 8+ Email Server: Cung cấp dịch vụ email, các bức email do máy khách gửi đi sẽ đợc chơng trình mail server ở máy chủ quản lý lu trử tạm thời và dò tìm địa chị để gửi đợc email đến đích.
+ Web Server: Cung cấp dịch vụ dò tìm trang web trên máy chủ, khi máy khách yêu cầu lấy về một trang web (thờng yêu cầu này do các trình duyệt browser gửi đến) chơng trình web server sẽ đọc nội dung trang web và gửi toàn bộ về cho máy khách (trớc khi gửi đi có
thể thực hiện một số thao tác biến đổi khác nh thông qua các chơng
trình CGI hay Active save page,…).
1.3.2 Mô hình mạng ngang hàng (peer-to-peer)
Trong mô hình này, một máy tính vừa đóng vai trò là khách (client), vừa
đóng vai trò là chủ(server) Một số ứng dụng thuộc mô hình này nh Gnutella,KaZaA
1.4 Lập trình mạng thông qua socket
Nh vậy trớc khi yêu cầu một dịch vụ trên máy chủ thực hiện điều gì đómáy khách (client) phải có khả năng kết nối đợc với máy chủ Quá trình kết nốinày đợc ngôn ngữ lập trình C# thực hiện thông qua một cơ chế trừu tợng hóa gọi
là socket (tạm dịch là cơ chế ổ cắm) Kết nối giữa máy khách và máy chủ tơng tự
nh việc cắm phích điện vào ổ Máy khách thờng đợc coi nh phích cắm còn máychủ coi nh ổ cắm, một ổ cắm có thể cắm vào đó nhiều phích cắm khác nhau.Cũng nh một máy chủ có thể kết nối phục vụ cho rất nhiều máy khách
Nếu kết nối socket thành công thì máy khách và máy chủ có thể trao đổi
dữ liệu với nhau thực hiện các yêu cầu về dịch vụ trên máy chủ Việc kết nối
theo cơ chế socket cần biết 2 thông tin chủ yếu là địa chỉ của máy cần kết nối và
số hiệu cổng của chơng trình dịch vụ Ngôn ngữ lập trình C# cung cấp 2 th viện
cơ bản: System.Net và System.Net.Socket.
Trang 9Chơng 2: Cơ bản về Socket2.1 Khái niệm TCP , UDP và socket
TCP (Transmision Control Protocol): Giao thức TCP/IP là giao thức đợc sửdụng để truyền dữ liệu giữa 2 máy tính, dựa vào địa chỉ IP Giao thức này sẽ chiadữ liệu gửi đi thành các gói tin Đợc sử dụng cho các dịnh vụ với khả năngtruyền dữ liệu lớn và một kết nối liên tục Đảm bảo độ tin cậy trong quá trìnhtruyền dữ liệu, cung cấp cơ chế phản hồi sau khi nhận đợc dữ liệu và có sử dụngcơ chế phát hiện lỗi
UDP (User Datagram Protocol) không phân đoạn dữ liệu, không cung cấpcơ chế tập hợp dữ liệu nhận cũng nh đồng bộ quá trình truyền nhận dữ liệu Nếu
có lỗi xảy ra bắt buộc phải thực hiện truyền lại dữ liệu Không có cơ chế phảnhồi sau khi nhận dữ liệu Đây là giao thức truyền tin không đáng tin cậy
Một số khái niệm về Socket:
- Hiện nay trên thế giới có hàng triệu máy tính kết nối internet Internet
ho phép những chơng trình trên những máy tính cách xa nhau hàng ngàndặm có thể giao tiếp và trao đổi thông tin Vậy làm thế nào để một chơngtrình giao tiếp với một chơng trình khác trên mạng? Câu trả lời thay đổituy thuộc vào ứng dụng và hệ điều hành, nhng phần lớn chơng trình để
truy cập mạng sử dụng giao diện lập trình ứng dụng “socket”.
Trang 10- Socket là một trong những kỹ thuật cơ bản nhất trong truyền thông trên
mạng máy tính, là một phơng thức thực hiện truyền thông giữa các tiếntrình đợc BSD(Berkeley Software Distribution) đề xuất
- Các giao thức TCP và UDP làm nhiệm vụ vận chuyển giữ liệu giữa cácmáy tính, nên để biết đợc dữ liệu này là của chơng trình nào trên máy ngời
ta sử dụng cổng giao thức có giá trị 1 đến 65535 đợc gọi là socket Vậy để
truyền giữ liệu từ ứng dụng của máy này đến ứng dụng của máy khác cần
biết đợc địa chỉ IP và Socket.
- Socket đợc sử dụng để một tiến trình giao tiếp với một tiến trình khác Hay nói cách khác socket là một thứ trừu tợng mà một ứng dụng sử dụng
để truyền và nhận dữ liệu nh cách mà một ứng dụng mở file để đọc hoặc ghi dữ liệu một cách ổn định Socket đóng vai trò giao tiếp giữa hai ứng
dụng ở hai máy nối mạng bằng cách một ứng dụng gửi dữ liệu đến ứng
dụng kia thông qua socket.
TCP Socket và UDP Socket:
- Ngày nay là stream sockets và datagram sockets
- Stream sockets sử dụng giao thức TCP truyền điểm đến điểm
(end-to-end) thông qua IP Nh vậy đây là một giao thức truyền đáng tin cậy vì sửdụng giao thức TCP để truyền tin
- Datagram sockets sử dụng UDP và cũng tơng tự nh TCP, nó cũng
truyền điểm đến điểm (end-to-end) thông qua IP
2.2 Các lớp hỗ trợ lập trình socket trong C#
Ngôn ngữ lập trình C# là một ngôn ngữ mạnh hiện nay, với một th việnkhổng lồ, thêm vào đó là bộ soạn thảo hỗ trợ ngời lập trình đạt hiệu quả caonhất Một số lớp cơ bản mà ngôn ngữ lập trình C# hỗ trợ:
Trang 11Trong System.Net cã mét sè líp hay dïng:
Trang 12Chơng 3: Lập trình socket trong C#
3.1 Các th viện hỗ trợ trong C#
3.1.1 Sử dụng th viện System.Net
Dns(Domain Name System): Là một dịch vụ dò tìm trong Microsoft Windows, nó định vị một máy trên mạng dựa vào IP và là một giao thức chuẩn
công nghiệp Đối với máy tính thì các địa chỉ IP (nh là 207.45.131.137) mới là
đáng tin cậy, tuy nhiên đối với ngời sử dụng thì nhớ tên (nh làwww.microsoft.com) dễ dàng hơn Nên Dns đợc sử dụng để ánh xạ qua lại giữatên và địa chỉ IP Một số phơng thức:
- Lấy thông tin về một máy tính:
public static IPHostEntry GetHostByAddress(IPAddress address)
public static IPHostEntry GetHostByAddress(string address)
public static IPHostEntry GetHostByName(string hostname)
- Lấy host name của máy tính:
public static string GetHostName()
Thực thi dịch vụ tìm kiếm thông tin về host:
Public static IPHostEntry Resolve(string hostname)
IPHostEntry: Cho biết thông tin về host nh mảng aliases và mảng địa chỉ IP IPAddress: Địa chỉ giao tiếp của một IP trên mạng.
IPEndPoint: Cho biết điểm kết nối đến trong mạng TCP/IP là địa chỉ IP và số
hiệu cổng (port)
EndPoint: Điểm kết nối đến trong mạng, lớp này có nguồn gốc từ lớp
IPEndPoint
3.1.2 Sử dụng th viện System.Net.Socket
TcpListener: Dùng để lắng nghe (chờ) kết nối từ những máy trong mạng Thiết lập miền địa chỉ IP và cổng để lắng nghe, và gọi phơng thức Start() để có thể bắt đầu lắng nghe AcceptTcpClient() và AcceptSocket() là hai phơng thức lắng nghe kết nối trả về lần lợt là TcpClient và Socket Khi đó đã thực sự kết nối
và có thể gửi và nhận dữ liệu Sẽ dừng lắng nghe khi phơng thức Stop() đợc gọi
và ngừng kết nối khi TcpListener gọi phơng thức Close() hay Socket gọi phơng thức Shutdown().
TcpClient: Khi đang kết nối, thông qua phơng thức Getstream() truy cập
đến NetworkStream và đây là phơng thức dùng để gửi, nhận dữ liệu.
NetworkStream: Là một lớp con của lớp Stream, và phục vụ vào ra các luồng dữ liệu cho network.
Trang 13UdpClient: Sử dụng phơng thức kết nối UDP để gửi nhận dữ liệu Vì UDP
là một giao thức phi kết nối, có thể gửi và nhận dữ liệu mà không cần thiết lậpkết nối Bạn có thể thiết lập theo hai cách: Kết nối ngay lúc khởi tạo hoặc gọi ph-
ơng thức connect sau khi khởi tạo Một số phơng thức:
- Ngừng kết nối:
public void Close()
- Kết nối đến máy khác:
public void Connect(IPEndPoint endPoint)
public void Connect(IPAddress addr, int port)
public void Connect(string hostname, int port)
- Nhận dữ liệu:
public byte[] Receive(ref IPEndPoint remoteEP)
- Gửi dữ liệu:
public int Send(byte[] dgram, int length)
public int Send(byte[] dgram, int length, IPEndPoint endPoint)
Socket: Lớp cung cấp nhiều phơng thức và thuộc tính để giao tiếp mạng Lớp socket cho phép truyền dữ liệu cả hai dạng đồng bộ và không đồng bộ Để
sử dụng một socket thực hiện các bớc:
- Khởi tạo socket
- Nếu socket là server, gọi phơng thức Bind() để gán một endpoint.
- Nếu socket là client, gọi phơng thức Connect() để kết nối đến endpoint
- Nếu socket là server, gọi phơng thức Listen() để bắt đầu lắng nghe kết nối, và gọi phơng thức Accept() để khôi phục kết nối.
- Sử dụng hai phơng thức Send() và Recceive() để truyền và nhận dữ liệu bằng giao thức TCP or SendTo() và RecceiveFrom() để truyền và nhận
dữ liệu bắng giao thức UDP
- Gọi Shutdown() để shutdown.
- Gọi Close() để đóng socket.
3.2 Lập trình đa luồng trong C#
Khi chơng trình thực thi thực hiện giao tiếp với máy khác qua socket thì các thao tác với cửa sổ(form) sẽ bị chặn Có nghĩa là trong thời gian xử lý với socket nh lắng nghe, truyền nhận dữ liệu thì mọi thao tác trên cửa sổ đều không
đợc do đang thực hiện trên một luồng (luồng của form) Mà việc socket lắng
Trang 14nghe là thờng xuyên vì vậy để tránh điều đó chúng ta phải sử dụng thêm các
luồng khác
Ví dụ nh khi một máy giao tiếp với máy khác thì luôn có một luồng lắng nghe để biết đợc lúc nào trao đổi thông tin, dữ liệu Nh vậy việc sử dụng đa
luồng là cần thiết
Với Net Framework, bạn có thể tạo ra ứng dụng có nhiều luồng một cách
đơn giản và dễ dàng Việc tạo một luồng mới rất đơn giản, chỉ việc khai báo và
cung cấp cho nó một phơng thức và start để luồng đợc bắt đầu Khi đã luồng thực sự đợc thực thi băng cách gọi phớng thức Thread.Start
public static void Main(){
Console.WriteLine(“Main thread: Start a second thread.”);Thread t = new Thread(new ThreadStart(ThreadProc));
t.Join();
Trang 15Console.WriteLine(“Main thread: ThreadProc.Join hasreturned Press Enter to End program.”);
Console.ReadLine();
}}
Trang 16Chơng 4: Xây dựng chơng trình Chat room4.1 Bài toán Chat room
Thiết kế và cài đặt chơng trình Chat room Chat room: Là tạo phòng chát trong mạng LAN (Local Area Network), ở đó mọi ngời nhìn thấy nhau qua nick name có thể trò chuyện, trao đổi dữ liệu với nhau và có trò chơi caro giữa 2 ngời
để giải trí
Chat public: Nơi mọi ngời có thể nhìn thấy nhau, có thể thảo luận và gửi
thông tin đến tất cả mọi ngời và nhận thông tin từ tất cả mọi ngời Là cửa sổchính từ đó thực hiện các chức năng khác
Chat private: Là cửa sổ để trao đổi riêng với ngời khác.
Gửi nhận tệp: Mỗi ngời có thể gửi nhận tệp từ ngời khác
Chơi caro: Mỗi ngời có thể chơi caro với một ngời khác
4.2 Cài đặt
4.2.1 Các quy ớc chung
Để thức hiện trao đổi thông tin giữa các máy cần có một số quy ớc
Quy ớc cấu trúc message gửi đi: <phần đầu> + @ + <phần dữ liệu>
<phần đầu>: <tín hiệu móc nối> + @ + <host name> + @ + <nick name>.
<phần dữ liệu>: <dữ liệu> + @ + <dữ liệu>
Message: Là thông điệp để các chơng trình trao đổi thông tin.