Apr 10, 2009

Lập trình C# và internet [phần 1]

Lập trình mạng sử dụng cho giao thức TCP và UDP

Tôi viết bài lược dịch này cũng khá lâu rồi. Nhưng thiết nghĩ với C# thì chắc từ hồi đó đến giờ chắc cũng có thay đổi khá nhiều nhưng không phải là những code này không chay đc.
Bài viết được dịch từ sách lập trình internet bằng C# trên phiên bản .NET 2003 các bạn có thể tham khảo. tôi đoán là code nó vẫn có thể chạy ngon lành trên các phiên bản mới hiện thời.

Các vấn đề
1> Giới thiệu về kênh và mạng internet
2> Minh họa về tiến trình truyền giao (transmisstion) TCP
3> Minh họa về tính trình truyền giao (transmisstion) UDP
4> Tạo một kiểm tra sử dụng với đa kênh (multicasting) UDP
5> Tạo một máy chủ khách ứng dụng chat
6> Ứng dụng chia sẻ file dùng TCP
7> Truy xuất tài nguyên web

1>Giới thiệu về networking và sockets (kênh)
Trong năm 60 các nhà nghiên cứu thuộc viện nghiên cứu những dự án cao câp (ARPA) Mỹ đc yêu cầu từ cơ quan bộ quốc phòng Mỹ (DoD năm 72 ARPA đc sát nhập vào DoD) phát triển một hệ thống lưu trữ thông tin quân sự quan trọng để phòng trường hợp sẩy ra chiến tranh. Và kết quả làm việc của họ là mạng điện tử ARPAnet ra đời. trong đó tất cả những thông tin quân sự đc lưu trên các máy tính và chúng làm một phần của mạng. các máy tính đc đắt ở những nơi khác nhau và việc chao đối thông tin giữa chúng thông qua khá nhiều cách khác nhau. Khi cập nhập lại dữ liệu hay thêm mới sự đồng bộ các máy chỉ diễn ra trong thời gian ngắn. nó đảm bảo phòng chánh cho trường hợp một máy tính bị phá hủy nhưng thông tin trên đó không bị mất.
Từ những nắm 70 DoD đã cho phép những viện nghiên cứu phi quân sự đc tiếp cận vào mạng ARPAnet. Và những nhà nghiên cứu quan tâm đến việc kết nối máy tính hơn là việc đồng bộ dữ liệu. họ sử dụng nó để chuyền dữ liệu và những sinh viên trong viện đã sử dụng vào những phần của mạng và nó chở thành Usenet – mạng sử dụng
Bắt đầu từ nắm 80 mạng quân sự và mạng dân dụng của ARPAnet đc chia ra hình thành những khu vực mạng usenet và những khu vực mạng này đc nối lại với nhau thế là INTERNET ra đời
Một điều thực sự cần thiết là tiêu chuẩn hóa những cách thức liên kết giữa các mạng khác nhau và các kiểu máy tính khác nhau bởi thế TCP/Internet Protocol (TCP/IP) đc phát triển bởi ARPA chở thành một tiêu chuẩn rộng rãi trên toàn mạng Internet
TCP/IP là một giao thức thân thiện nó cho phép kết nối những máy tính để chuyền thông và chia sẻ tài nguyên suyên qua mạng TCP và IP chỉ là 2 giao thức trong bộ giao thức này còn có UDP và tất cả nhưng giao thức này đc hỗ trợ trong .NET bạn có thể xen ở lớp System.NET.sockets.socket
Để truy nhập vào IP – cơ bản của networks từ tầng ứng dụng chúng ta phải sử dụng socket – kênh. Một socket là một giao lập trình và truyền thông điểm cuối nó cho phép thực hiện kết nối đến một máy tính khác gửi và nhận thông tin với máy tính đó

kiến trúc truyên thông giữa 2 máy tính

Thông thường tồn tại 3 loại sockets
Raw socket : là loại thực thi dùng trên tầng mạng ví dụ như giao thức IP
Datagram sockets : Datagram là một gói dữ liệu đâu là kiểu sockets đc thực thi trên tầng transposts – giao vận. tuy vậy sự chuyển giao đến một tầng là không chặt chẽ
Stream sockets : Nó đối nghịch lại datagram socket là những sockets đc cung câp cho dong dữ liệu
Kiến trúc truyền thông hiện đại sử dụng stack cho những tầng giao thức khác nhau nơi dữ liệu được đưa tới là tầng cao nhất. mỗi một tầng cộng thêm những thông tin đặc trưng giao thức vào dữ liệu và đưa nó cho tâng kế tiếp. tầng thấp nhất thực hiện việc gửi dữ liệu. nơi tiếp nhận dữ liệu, thông qua mỗi tầng sẽ bỏ đi những thông tin đc thêm vào trong các tầng của bên gửi cho đến khi nó lên đến tầng ứng dụng
Tầng ứng dụng có thể bị chia làm nhiều các tầng con. Bạn có thể nghĩ như thế này tầng ứng dụng sử dụng nền tảng XML cơ bản giao thức try nhập đối tựng đơn giản (SOAP) dùng giao thức HTTP để gửi những câu lệnh điểu khiển SOAP trong XML nó đc gọi là HTTP tunneling đc sử dụng một cách đặc biệt đối với tường lửa khi mà tường lửa đc cấu hình không cho phép SOAP suyên qua nó

System.Net namespace
Trong nay bao gồm nhiều những lớp cung cấp những khái niệm cơ bản cho mạng, truy xuất và làm việc với chúng một cách dẽ dàng.
Tâm điểm của namespace này là lớp webrequest và webreponse là những lớp trùi tượng làm cơ sở cho việc thực thi giao thức bảng sau mô tả những lớp trong System.Net

Lớp >> Mô tả lớp
IPaddress >> Hiện thị lại một địa chỉ IP
IPEndPoint >> Thẩm định một điểm cuối mạng, là một địa chỉ IP và một cổng
webRequest >> Làm một yêu cầu tới Unitform Recouse Identifile (URI) là một lớp trùi tượng sẽ đc mở rộng cho các mục đính của giao thức
WebResponse >> Hiện thị lại những đáp ứng(response) tới một (uri) lớp trùi tượng và cũng sẽ đc mở rộng cho mục đích của giao thức
webProxy >> Nhận dạng một giao thức HTTP proxy nó bao gồm tất cả những proxry đc cài đặt và sử dụng bởi webrequest

System.Net.sockets namespace
Trong này với lớp trung tâm là socket cung cấp phần lớn những giao diện lập trình cơ bản cho mạng ta sẽ sử dụng một số những lớp thuộc namespace này cho vi dụ của chúng ta

Lớp >> Mô tả
Socket >> Thực thi nhưng giao diện lập trình sockets
Networkstream >> Cho phép dễ dàng truy nhập vào dữ liệu của stream socket
Tcpclient >> Cung cấp một tcp cho khách có thể đc kết nối đến socket máy chủ
Tcplistener >> Thực thi một tcp socket máy chủ lắng nghe những yêu cầu kết nối đến
Udpclient >> Cung cấp những udp ngang hàng và sử lý đa kênh

2>Ví dụ cho giao thức TCP và lệnh chuyền giao và sử lý
Đây là một ví dụ cho sự chặt chẽ chia cát giữa 2 tầng hiện thị(presentation layer) và chức năng (function layer) tầng hiện thị là giao diện người dùng, tầng chức năng là ứng dụng nó làm tất cả các công việc cho ứng dụng
đối với tầng hiện thị, nơi mà các chức năng thực thi là không quan trọng bạn có thi hành tầng chức năng với cùng những ứng dụng và những sử lý khác trên cùng một máy tính hay những máy tính khác trong mạng LAN hay là INTERNET để làm cho kiến truc chở nên linh hoạt bạn có thể thêm vào những lệnh cho processor giữa những hiện thị và chức nắng những lệnh cho bộ sử lý là tiêu chuẩn hóa giao diện cho tâng chức năng. Bộ sử lý sẽ thực thi phương thức của tầng chức năng cơ bản trong lệnh kết quả bộ sử lý đc điều khiển để hiện thị lên tầng ứng dụng sự phân giã này bạn co thể tham khảo hình sau

bộ sử lý thực thi một cách đơn giản là truy xuất vào tầng chức năng thông qua một biến cùng với những ứng dụng khác hoặc thông qua mạng chuyền thông đến một máy tính khác
hình nay cho ta một ví dụ về một tầng chức năng ở xa một cái tiện ích là tâng hiện thị không cần biết tầng chức năng ở đâu nó chỉ đưa ra lệnh đến bộ sử lý lệnh và nhận kết quả
một ví dụ của kiểu kiến trúc này là ví dụ về truyền thông giữa trình duyệt web và web server bạn chỉ cần gõ địa chỉ vào thanh địa chỉ của trình duyệt web trình duyệt web gửi một yêu cầu GET đến web server. Web server sẽ phân tích yêu cầu và chả lại trang HTML cho trình duyệt web
Trong ví dụ này nền tảng của cùng những hành động trong dạng thức khác nhau trình duyệt gửi một yêu cầu cho server và server trả lại trình duyệt một thông điệp “Hello world” đây là một ví dụ thực thi một giao thức chuyền thông đơn giản với 2 lệnh đơn giản là GET và EXIT ta có thể hình dung nó giống như
Client : (thiết lập một kết nôi TCP đến server)
Server : (chấp nhận kết nối)
C: GET
S: “hello world !”
C: EXIT
S: bye
C: (đóng kết nối)
S: (đóng kết nối)
có nghĩa là thực thi chả lại cho phép trong một dòng đôi khi cũng chỉ ra sự kết thúc của dòng đây la nhưng thông dụng được dùng với giao thức truyền thông giống như là HTTP hoặc là SMTP

Những sử dụng cần thiết của lớp .NET
Bạn cần sử dụng 2 lớp mạng chính cho ví dụ này bên phía client bạn sử dụng System.Net.Socktes.Tcpclient bên phía server bạn sử dụng System.Net.Sockets.Listener. đây la thông thường ở bên client dùng Tcpclient để kết nối đến server khi làm việc bằng những dòng cho kết nối của phía client và khi tất cả làm việc song bạn sẽ đóng kết nối lại
// tạo kết nối đến server 127.0.0.1:8080
TcpClient client = new TcpClient(“127.0.0.1”,8080);
// lấy dòng thông tin mạng cho việc đọc hay viết cái gì đó lên mạng
NetworkStream ns = client.Getstream();
// đọc hoặc ghi cái gì đó từ hoặc vào stream

// gắt kết nối từ server
client.close();
bên phía server đòi hỏi nhiều bước hơn nhưng thông thường code cũng giống như bên phía client. Bạn ràng buộc Tcplistener trên một cổng cụ bộ như thế nếu client kết nối đên server trên cổng lắng nghe bạn sẽ có một socket vói socket này bạn có thể tạo ra những dòng thông tin từ điểm này bạn sẽ thấy code có dạng giông như sau
// tạo một listener lắng nghe những kết nối TCP đến trên cổng 8080
TcpListener listener = new TcpListener(8080);
// khởi động
listener.Start();
// đợi và chấp nhận một kết nối đến
Socket server = listener.AcceptSocket();
// tạo một dòng thông tin mạng cho người dùng sớm nhất
NetworkStream ns = new NetworkStream(server);

// đóng kết nối từ phía người dùng
server.close();

còn tiếp ...

1 comment:

  1. Cám ơn bạn về bài viết rất bổ ích, bạn có thể tiếp tục post những phần tiếp theo được không bạn?, mình đang rất cần để học và tham khảo. Cám ơn bạn rất nhiều.

    ReplyDelete

 
Bạn có thể dùng bài viết của tôi tùy ý bạn nhưng vui lòng ghi lại rõ nguồn cung cấp
The world in a click_
Copyright © 2008 linhdkl