Tải bản đầy đủ (.doc) (60 trang)

De tai screen monitoring v3

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.72 MB, 60 trang )

Tổng quan về mạng cục bộ và các công cụ lập trình
1.

Mục đích của đề tài

Chương trình “Screen monitoring” được xây dựng nhằm hỗ trợ cho việc hỗ trợ,
giám sát, theo dõi và trao đổi dữ liệu trong cùng mạng LAN mà không cần phải sử
dụng các phần mềm bên ngồi để đảm bảo dữ liệu khơng bị truyền ra bên ngồi.
2.

Lý do chọn đề tài

Việc nối máy tính thành mạng từ lâu đã trở thành một nhu cầu khách quan vì:
Có rất nhiều cơng việc về bản chất là phân tán hoặc về thông tin, hoặc về xử lý hoặc cả
hai địi hỏi có sự kết hợp truyền thơng với xử lý hoặc sử dụng phương tiện từ xa. Chia
sẻ các tài nguyên trên mạng cho nhiều người sử dụng tại một thời điểm (ổ cứng, máy
in, ổ CD ROM . . .) Nhu cầu liên lạc, trao đổi thơng tin nhờ phương tiện máy tính. Các
ứng dụng phần mềm địi hịi tại một thời điểm cần có nhiều người sử dụng, truy cập
vào cùng một cơ sở dữ liệu.
Hiện nay, mạng LAN đã có những tiến bộ vượt bậc và ngày càng phổ biến hơn
trong đời sống sinh hoạt. Điều này làm cho nhu cầu liên lạc và trao đổi thông tin thông
qua mạng LAN ngày càng lớn hơn, nhất là trong các công ty dùng để hỗ trợ và trao đổi
Database mà không cần sử dụng phần mềm bên ngồi nào khác. Chính vì vậy, chương
trình “Screen monitoring” được xây dựng để đáp ứng phần nào những nhu cầu cấp
thiết đó.
Trên thực tế có rất nhiều ứng dụng trên mạng đã được phổ biến rộng rãi cho việc
hỗ trợ này, nhưng người dùng phải Download rất nhiều phần mềm khác nhau về.
Người ta sử dụng các chương trình Chat, Teamview, Ultraview, Sky… với mục đích
trao đổi thơng tin như trị chuyện, bàn bạc cơng việc và gửi dữ liệu gián tiếp qua môi
trường Internet - một cách đơn giản để kết nối mọi người lại với nhau.
Khi xây dựng một chương trình này cần phải đảm bảo các yêu cầu về kết nối, dữ


liệu trong quá trình truyền đi phải đảm bảo toàn vẹn và an toàn. Đặc biệt chương trình
này tích hợp các chức năng có thể truyền file, chat, theo dõi và quản lý các máy tính
trong mạng LAN đó. Là một ứng dụng mạng nên các chương trình hỗ trợ, giam sát này
hoạt động dựa trên mơ hình Client – Server hoặc Point to Point và kết nối bằng một
trong 2 giao thức TCP hoặc UDP. Trên cơ sở đó, em đã xây dựng chương trình hoạt
động theo mơ hình Client – Server và sử dụng giao thức kết nối TCP.
3.

Lý do chọn ngôn ngữ thiết kế JAVA

3.1

Đơn giản


Do những người thiết kế mong muốn phát triển một ngôn ngữ dễ đọc và quen
thuộc với đa số người lập trình, nên Java được loại bỏ các đặc trưng phức tạp của C và
C++ như thao tác con trỏ, thao tác nạp chồng (overload) … và sử dụng lệnh “goto”
cũng như file header (.h). Cấu trúc “struct” và “union” cũng được loại bỏ khỏi Java.
3.2

Hướng đối tượng

Java được thết kế quanh mơ hình hướng đối tượng. Vì vậy trong Java, tiêu điểm
là dữ liệu và các phương pháp thao tác lên dữ liệu đó.
3.3

Dễ bảo trì (Vận hành)

Đây là khả năng một chương trình được viết tại một máy nhưng có thể chạy

được bất kỳ đâu. Chúng được thể hiện ở mức mã nguồn và mức nhị phân: Ở mức mã
nguồn, người lập trình cần mơ tả kiểu cho mỗi biến. Kiểu dữ liệu trong Java nhất quán
cho tất cả các hệ điều hành và phần cứng khác nhau. Java có riêng một thư viện các
lớp cơ sở. Vì vậy chương trình Java được viết trên một máy có thể được dịch và chạy
trơn tru trên các loại máy khác mà không cần viết lại.
Ở mức nhị phân, một chương trình đã biên dịch có thể chạy trên nền khác mà
không cần dịch lại mã nguồn. Tuy vậy cần có phần mềm máy ảo Ngơn ngữ lập trình
Java, hoạt động như một trình thơng dịch tại máy thực thi.

Hình 1: Minh họa biên dịch và chạy chương trình C/C++
Trình biên dịch sẽ chuyển các chương trình viết bằng C/C++ hay ngôn ngữ
khác thành mã máy nhưng phụ thuộc vào CPU. Nên khi muốn chạy trên CPU khác, ta
phải biên dịch lại


Hình 2: Minh họa biên dịch và chạy chuơng trình Ngơn ngữ lập trình Java
Mơi trường phát triển của Java được chia làm hai phần: Trình viên dịch và trình
thơng dịch. Khơng như C hay C++, trình biên dịch của Java chuyển mã nguồn thành
dạng byte code độc lập với phần cứng mà có thể chạy trên bất kỳ CPU nào.
Nhưng để thực thi chương trình dưới dạng byte code, tại mỗi máy cần phải có
trình thơng dịch của Java hay còn gọi là máy ảo Java. Máy ảo Java chuyển byte code
thành mã lệnh mà CPU thực thi được.
3.4

Mạnh mẽ

Java yêu cầu chặt chẽ về kiểu dữ liệu và phải mơ tả rõ ràng khi viết chương
trình. Chúng sẽ kiểm tra lúc biên dịch và cả trong thời gian thơng dịch, vì vậy Java loại
bỏ các kiểu dữ liệu dễ gây lỗi.
3.5


Bảo mật
Java cung cấp một số lớp để kiểm tra bảo mật:

Ở lớp đầu tiên, dữ liệu và các phương pháp được đóng gói bên trong lớp.
Chúng chỉ truy xuất thông qua các giao diện mà lớp cung cấp. Nó cũng ngăn chặn
khơng cho truy xuất thơng tin bên ngoài của mảng bằng kỹ thuật tràn và cũng cung cấp
kỹ thuật dọn rác trong bộ nhớ. Các đặc trưng này tạo cho Java sự an toàn và khả năng
cơ động cao.
Trong lớp thứ hai, trình biên dịch kiểm sốt để đảm bảo mã an tồn.
Lớp thứ ba được đảm bảo bởi trình thơng dịch. Chúng kiểm tra xem liệu byte
code có đảm bảo các quy tắc an tồn trước khi thực thi.


Lớp thứ tư kiểm soát việc nạp các lớp lên bộ nhớ giám sát việc vi phạm giới
hạn truy xuất trước kh nạp vào hệ thống.
3.6

Phân tán

Java có thể được dùng để xây dựng làm việc trên nhiều phần cứng, hệ điều hành
và giao diện đồ họa. Java được thiết kế cho các ứng dụng chạy trên mạng. Vì vậy
chúng được sử dụng rộng rãi trên Internet, nơi sử dụng nhiều nền tảng khác nhau.
3.7

Đa luồng

Chương trình Java sử dụng kỹ thuật đa luồng (Multithread) để thực thi các công
việc đồng thời. Chúng cũng cung cấp giải pháp đồng bộ giữa các tiến trình. Đặc tính
hỗ trợ đa tiến trình này cho phép xây dựng các ứng dụng trên mạng chay uyển chuyển.

3.8

Động

Java được thiết kế như một ngôn ngữ động để đáp ứng cho những môi trường
thực thi mở các chương trình Java bổ sung thơng tin cho các đối tượng tại thời gian
thực thi. Điều này cho phép khả năng liên kết động các mã.
4.

Thuật toán được sử dụng

Trong báo cáo này, em xin trình bày những vấn đề cơ bản liên quan phương
thức kết nối và hoạt động của một chương trình hỗ trợ, chat, gửi file trong LAN. Từ
đó, vận dụng lý thuyết về lập trình socket để phân tích q trình hoạt động của một
chương trình cơ bản. Trên cơ sở đó, đề ra giải pháp để xây dựng nên một chương trình
Hỗ trợ, giám sát máy tính trong LAN đảm bảo các tính năng cần thiết từ việc ứng dụng
lập trình socket và thuật tốn mã hóa RSA.
Trong lập trình mạng dùng Socket, chúng ta không trực tiếp truy cập vào các thiết bị
mạng để gửi và nhận dữ liệu. Thay vào đó, một chương trình trung gian được tạo ra để
điều khiển việc gửi và nhận dữ liệu. Các chương trình mơ tả dùng để tham chiếu đến
các kết nối mạng được gọi là các Socket. Socker định nghĩa những đặt trưng sau.
• Một kết nối mạng hay một đường ống dẩn để truyền tải dữ liệu
• Một kiểu truyền thơng như stream hay datagram
• Một giao thức như TCP hay UDP.
- Socket cho phép thiết lập các kênh giao tiếp mà hai đầu kênh được xác định bởi hai
cổng (port). Thông qua các cổng này một tiến tình có thể nhận và gửi dữ liệu với các
tiến trình khác.


- Sau khi một Socket được tạo ra nó phải được gán vào một địa chỉ mạng và một port

trên hệ thống cục bộ hay ở xa. Khi đó nó có thể được dùng để gửi hay nhận dữ liệu
trong mạng

Hình 3: Sơ đồ lập trình socket hướng kết nối
5.

Đối tượng và phạm vi nghiên cứu

5.1

Đối tượng nghiên cứu

Tìm hiểu được cơ chế hoạt động của Socket và Thread trong .NET Framwork từ
đó viết ứng dụng Chat và hỗ trợ, gửi dữ liệu trong mạng LAN
Hiểu các giao tiếp giữa Client và Server sử dụng các giao thức mạng
-

-

5.2

Phần Server: đảm nhiệm lắng nghe ở một cổng nào đó và thực hiện các kết nối của
các client với nhau hoặc giải phóng kết nối khi một client ngắt kết nối với server.
Có chức năng để thực hiện kết nối và nói chuyện riêng giữa hai người với nhau và
thực hiện các chức năng hỗ trợ, giám sát máy được kết nối.
Phần Client: kết nối tới Server, nếu kết nối thành cơng thì thơng báo cho người
quản trị

Phạm vi nghiên cứu
Chương trình được xây dựng với khả năng gửi các được văn bản, file qua lại

giữa các user thông qua sự điều khiển của một Server trong mạng LAN….


Chương 1: TỔNG QUAN LẬP TRÌNH MẠNG, PHƯƠNG PHÁP
LẬP TRÌNH SOCKET
(Cơ sở lý thuyết)
1.1

Tổng quan về lập trình mạng

1.1.1 Họ giao thức TCP/IP
IP là một họ giao thức để cung cấp phương tiện truyền thơng liên mạng và nó
được cấu trúc theo kiểu phân cấp.
Khác với mơ hình OSI tầng liên mạng sử dụng giao thức kết nối mạng "không
liên kết" (connectionless) IP, tạo thành hạt nhân hoạt động của Internet. Cùng với các
thuật toán định tuyến RIP, OSPF, BGP, tầng liên mạng IP cho phép kết nối một cách
mềm dẻo và linh hoạt các loại mạng "vật lý" khác nhau như: Ethernet, Token Ring ,
X.25...
Giao thức trao đổi dữ liệu "có liên kết" (connection - oriented) TCP được sử dụng
ở tầng vận chuyển để đảm bảo tính chính xác và tin cậy việc trao đổi dữ liệu dựa trên
kiến trúc kết nối "không liên kết" ở tầng liên mạng IP.
Các giao thức hỗ trợ ứng dụng phổ biến như truy nhập từ xa (telnet), chuyển tệp
(FTP), dịch vụ World Wide Web (HTTP), thư điện tử (SMTP), dịch vụ tên miền (DNS)
ngày càng được cài đặt phổ biến như những bộ phận cấu thành của các hệ điều hành
thông dụng như UNIX (và các hệ điều hành chuyên dụng cùng họ của các nhà cung
cấp thiết bị tính tốn như AIX của IBM, SINIX của Siemens, Digital UNIX của DEC),
Windows9x/NT, NovellNetware,...


Hình 1.1: Mơ hình tham chiếu và giao thức TCP/IP

1.1.2 So sánh 2 giao thức TCP và UDP
UDP (User Datagram Protocol) là một trong những giao thức cốt lõi của giao
thức TCP/IP. Dùng UDP, chương trình trên mạng máy tính có thể gởi những dữ liệu
ngắn được gọi là datagram tới máy khác. UDP không cung cấp sự tin cậy và thứ tự
truyền nhận mà TCP làm. Các gói dữ liệu có thể đến khơng đúng thứ tự hoặc bị mất
mà khơng có thơng báo. Tuy nhiên UDP nhanh và hiệu quả hơn đối với các mục tiêu
như kích thước nhỏ và yêu cầu khắt khe về thời gian. Do bản chất khơng trạng thái của
nó nên nó hữu dụng đối với việc trả lời các truy vấn nhỏ với số lượng lớn người yêu
cầu.
TCP (Transmission Control Protocol - "Giao thức điều khiển truyền vận") là một
trong các giao thức cốt lõi của bộ giao thức TCP/IP. Sử dụng TCP, các ứng dụng trên
các máy chủ được nối mạng có thể tạo các "kết nối" với nhau, mà qua đó chúng có thể
trao đổi dữ liệu hoặc các gói tin. Giao thức này đảm bảo chuyển giao dữ liệu tới nơi
nhận một cách đáng tin cậy và đúng thứ tự. TCP còn phân biệt giữa dữ liệu của nhiều
ứng dụng (chẳng hạn, dịch vụ Web và dịch vụ thư điện tử) đồng thời chạy trên cùng
một máy chủ.
Khác nhau (cơ bản):
Các header của TCP và UDP khác nhau ở kích thước (20 và 8 byte) nguyên nhân chủ
yếu là do TCP phải hộ trợ nhiều chức năng hữu ích hơn (như khả năng khơi phục lỗi).
UDP dùng ít byte hơn cho phần header và yêu cầu xử lý từ host ít hơn.
TCP:
-

Dùng cho mạng WAN.

-

Khơng cho phép mất gói tin.

-


Đảm bảo việc truyền dữ liệu.

-

Tốc độ truyền thấp hơn UDP

UDP:
-

Dùng cho mạng LAN.

-

Cho phép mất dữ liệu.


-

Không đảm bảo.

-

Tốc độ truyền cao, VolP truyền tốt qua UDP

Hình 1.2: Các đặc trưng sự giữa hai giao thức TCP và UDP
1.1.3 Địa chỉ IP
Địa chỉ IP (IP là viết tắt của từ tiếng Anh: Internet Protocol - giao thức Internet)
là một địa chỉ đơn nhất mà những thiết bị điện tử hiện nay đang sử dụng để nhận diện
và liên lạc với nhau trên mạng máy tính bằng cách sử dụng giao thức Internet.

Nhiệm vụ chính của giao thức IP là cung cấp khả năng kết nối các mạng con
thành liên kết mạng để truyền dữ liệu, vai trò của IP là vai trò của giao thức tầng mạng
trong mơ hình OSI. Giao thức IP là một giao thức kiểu khơng liên kết (connectionless)
có nghĩa là khơng cần có giai đoạn thiết lập liên kết trước khi truyền dữ liệu.
Tổng quan về địa chỉ IP
-

Là địa hỉ có cấu trúc, được chia làm hai hoặc ba phần là: Network_id và
Host_id hoặc Network_id và Subnet_id và Host_id
Là một con số có kích thước 32 bit. Khi trình bày, người ta chia con số 32 bit
thành bốn phần, mỗi phần có kích thước 8 bit, gọi là octet hoặc byte.
Có các cách trình bày sau:
• Ký pháp thập phân có dấu chấm (dotted-decimal notation).
Ví dụ: 172.16.30.56
• Ký pháp nhị phân.
Ví dụ: 10101100 00010000 00011110 00111000
• Ký pháp thập lục phân.
Ví dụ: AC 10 1E 38

- Không gian địa chỉ IP (gồm 232 địa chỉ) được chia thành nhiều lớp (class) để dễ quản
lý. Đó là các lớp: A, B, C, D và E; trong đó các lớp A, B và C được triển khai để đặt


cho các host trên mạng Internet; lớp D dung cho các nhóm multicast; cịn lớp E phục
vụ chi mục đích nghiên cứu.
- Địa chỉ IP còn được gọi là địa chỉ logical, trong khi địa chỉ MAC còn gọi là địa chỉ
vật lý (hay địa chỉ physical).
Một số khái niệm và thuật ngữ liên quan
Địa chỉ host là địa chỉ IP có thể dung đặt cho các Interface của các host.
Hai host nằm cùng một mạng sẽ có Network_id giống nhau và Host_id khác nhau.

-

-

-

Địa chỉ mạng (Network Address): là địa chỉ IP dung để đặt cho các mạng.
Phần host_id của địa chỉ chỉ chứa các bit 0. Địa chỉ này khơng thể dung để đặt
cho một Interface.
Ví dụ: 172.29.0.0
Địa chỉ Broadcast: là địa chỉ IP được dùng để đại diện cho tất cả các host trong
mạng. Phần Host_id chỉ chứa các bit 1. Địa chỉ này cũng không thể dùng đặt
cho một host được.
Ví dụ: 172.29.255.255
Bảng 1.1: Các phép toán làm việc trên bit

Mặt nạ mạng (Network Mask): là một con số dài 32 bits, là phương tiện giúp
máy các định được địa chỉ mạng của một địa chỉ IP (bằng các AND giữa địa chỉ
IP với mặt nạ mạng) để phục vụ cho công việc routing. Mặt nạ mạng cũng cho
biết số bit nằm tỏng phần Host_id. Được xây dựng bằng các bật các bit tương
ứng với phần Network_id và tắt các bit tương ứng với phần Host_id.
Bảng 1.2: Mặt nạ mặc định của các lớp không chia mạng con

Các bước hoạt
thức IP

Lớp A

255.0.0


Lớp B

255.255.0.0

Lớp C

255.255.255.0

động của giao

Khi giao thức IP được khởi động nó trở thành một thực thể tồn tại trong máy
tính và bắt đầu thực hiện những chức năng của mình, lúc đó thực tế là up là cấu thành


của tầng mạng, nhận yêu cầu từ các tầng trên nó và gửi yêu cầu xuống các tầng dưới
nó.
Đối với thực thể IP ở máy nguồn, khi nhận được một yêu cầu gửi từ tầng trên, nó thực
hiện các bước sau đây:
1. Tạo một IP datagram dựa trên thâm số nhận được
2. Tính Checksum và ghép vào Header của gói tin.
3. Ra quyết định chọn đường: hoặc là trạm đích nằm trên cùng mạng hoặc một
Gateway sẽ được chọn cho chặng tiếp theo.
4. Chuyển gói tin xuống tầng dưới để truyền qua mạng
Đối với Router, khi nhận được một gói tin đi qua, nó thực hiện các động tác sau:
1) Tính Checksum, nếu sai thì loại bỏ gói tin.
2) Giảm giá trị tham số Time – to – Live. Nếu thời gian đã hết thì loại bỏ gói
tin.
3) Ra quyết định chọn đường.
4) Phân đoạn gói tin, nếu cần.
5) Kiến tạo lại Ip Header, bao gồm giá trị mới của các vùng Tim – to – Live,

Fragmentation và Checksum.
6) Chuyển Datagram xuống tầng dưới để chuyển qua mạng.
Cuối cùng khi một Datagram nhận bởi một thực thể IP ở trạm đích, nó sẽ
thực hiện bởi các cơng việc sau:
1. Tính Checksum. Nếu sai thì loại bỏ gói tin.
2. Tập hợp các đoạn của gói tin (nếu có phân đoạn).
3. Chuyển dữ liệu và các tham số điều khiển lên tầng trên.
Một cách đơn giản hơn: IP là một địa chỉ của một máy tính khi tham gia vào
mạng nhằm giúp cho các máy tính có thể chuyển thơng tin cho nhau một cách chính
xác, tránh thất lạc. Có thể coi địa chỉ IP trong mạng máy tính giống như địa chỉ nhà
của bạn để nhân viên bưu điện có thể đưa thư đúng cho bạn chứ không phải một người
nào khác.
Bất kỳ thiết bị mạng nào, bao gồm bộ định tuyến, bộ chuyển mạch mạng, máy vi
tính, máy chủ hạ tầng (như NTP, DNS, DHCP, SNMP, v.v.), máy in, máy fax qua
Internet, và vài loại điện thoại khi tham gia vào mạng đều có địa chỉ riêng và địa chỉ
này là đơn nhất trong phạm vi của một mạng cụ thể. Vài địa chỉ IP có giá trị đơn nhất
trong phạm vi Internet toàn cầu, trong khi một số khác chỉ cần phải đơn nhất trong
phạm vi một công ty.


Địa chỉ IP do Tổ chức cấp phát số hiệu Internet (IANA) quản lý và tạo ra. IANA nói
chung phân chia những "siêu khối" đến Cơ quan Internet khu vực, rồi từ đó lại phân
chia thành những khối nhỏ hơn đến nhà cung cấp dịch vụ Internet và công ty.
1.2

Phương pháp lập trình Socket

Socket là một giao diện lập trình ứng dụng (API). Nó được giới thiệu lần đầu
tiên trong ấn bản UNIX-BSD 4.2 dưới dạng các hàm hệ thống theo cú pháp ngôn ngữ
C (socket(), bind(), connect(), send(), receive(), read(), write(), close(),… Ngày nay,

Socket được hỗ trợ trong hầu hết các hệ điều hành như MS Windows, Linux và được
sử dụng trong nhiều ngơn ngữ lập trình khác nhau như: C, C++, Java, Visua Basic,
Visua C++…
1.2.1 Định nghĩa
- Có rất nhiều định nghĩa khác nhau về Socket tùy theo cách nhìn của người sử dụng.
- Một cách tổng quá nhất có thể định nghĩa: Một socket là một điểm cuối trong một kết
nối giữa hai chương trình đang chạy trên mạng.
- Đối với người lập trình, họ
1.2.2 Sử dụng các lớp hỗ trợ được xây dựng từ lớp Socket
1.2.2.1Lớp TCPClient
Dùng giao thức này thì hai bên khơng cần phải thiết lập kết nối trước khi gửi do vậy
mức dộ tin cậy không cao. Để đảm bảo độ tin cậy trong các ứng dụng mạng người ta
còn sử dụng một giao thức khác gọi là giao thức có kết nối: TCP (transport control
protocol). Để lập trình theo giao thức TCP, MS.NET cung cấp hai lớp có tên là
TCPClient và TCPListener.
Các thành phần của lớp TcpClient
Phương thức khởi tạo:
Constructor method
Name

Description

TcpClient ()

Tạo một đối tượng TcpClient. Chưa đặt thơng
số gì.

TcpClient (IPEndPoint)

Tạo một TcpClient và gắn cho nó một

EndPoint cục bộ. (gán địa chỉ máy cục bộ và
số hiệu cổng để sử dụng trao đổi thông tin về
sau)

TcpClient (RemoteHost: String

Tạo một đối tượng TcpClient và kết nối đến


Int32)

một máy có địa chỉ và số hiệu cổng được
truyền vào. RemoteHost có thể là địa chỉ IP
chuẩn hoặc tên máy.

Một số thuộc tính:
Name

Description

Available

Cho biết số byte đã nhận về từ mạng và có sẵn để đọc

Client

Trả về socket ứng với TCPClient hiện hành

Connected


Trạng thái cho biết đã kết nối được đến server hay chưa?

Một số phương thức:
Name

Description

Close

Giải phóng đối tượng TcpClient nhưng khơng đóng
kết nối

Connect (RemoteHost,
Port)

Kết nối đến một máy TCP khác có tên và số hiệu
cổng

GetStream

Trả về NetworkStream để từ đó giúp ta gửi hay nhận
dữ liệu. (thường làm tham số khi tạo StreamReader
và StreamWriter).
Khi đã gắn vào StreamReader vá StreamWriter rồi
thì ta có thể gửi và nhận dữ liệu thông qua các
phương thức Readln, writeline tương ứng của các
lớp này.

1.2.2.2Lớp TCPListener
TCPListener là một lớp cho phép người lập trình có thể xây dựng các ứng dụng server.

Các thành phần của lớp TcpListent:
Phương thức khởi tạo:
Constructor method
Name

Description

TcpListener (Port: Int32)

Tạo một TcpListener và lắng nghe tại cổng chỉ


định
TcpListener (IPAddress,
Int32)

Tạo một TcpListener và lắng nghe các kết nối đến
tại địa chỉ IP và cổng chỉ định

TcpListener (IPEndPoint)

Tạo một TcpListener với giá trị EndPoint truyền
vào.

Các phương thức khác:
Name

Description

AcceptTcpClient


Chấp nhận một yêu cầu kết nối đang chờ. (ứng dụng sẽ dừng
tại câu lệnh này cho đến khi nào có một kết nối đến)

AcceptSocket

Chấp nhận một yêu cầu kết nối đang chờ.

Pending

Cho biết liệu có kết nối nào đang chờ đợi khơng? (True = có).

Start

Bắt đầu lắng nghe các u cầu kết nối

Stop

Dừng việc nghe.

1.2.2.3Lớp UDPClient
Giao thức UDP (user datagram protocol hay user define protocol) là một giao thức phi
kết nối có nghĩa là một bên có thể gửi dữ liệu cho bên kia mà khơng cần biết là bên đó
có sẵn sàng hay chưa? Giao thức này không tin cậy bằng giao thức TCP nhưng tốc độ
của nó nhanh và dễ cài đặt. Ngoài ra, với giao thức UDP ta cịn có thể gửi được gói tin
quảng bá đến nhiều máy.
Trong .NET, lớp UDPClient đóng gói các chức năng của giao thức UDP.
Constructor method

Description


UdpClient ()

Tạo một đối tượng (thể hiện) mới của lớp
UDPClient.

UdpClient (AddressFamily)

Tạo một đối tượng mới của lớp UDPClient. Thuộc
một dòng địa chỉ được chỉ định.

UdpClient (Int32)

Tạo một UdpClient và gắn một cổng cho nó

UdpClient (IPEndPoint)

Tạo một UdpClient và gắn một IPEndPoint cho nó

UdpClient (Int32,
AddressFamily)

Tạo một UdpClient và gắn số hiệu cổng,
AddressFamily

UdpClient (String, Int32)

Tạo một UdpClient và thiết lập với một máy trạm từ
xa mặc định.



PUBLIC Method
Name

Description

BeginReceive

Nhận dữ liệu khơng đồng bộ từ máy tính từ xa.

BeginSend

Gửi không đồng bộ dữ liệu tới máy ở xa

Close

Đóng kết nối

Connect

Thiết lập một default remote host.

EndReceive

Kết thúc nhận dữ liệu không đồng bộ ở trên

EndSend

Kết thúc việc gửi dữ liệu không đồng bộ ở trên


Receive

Nhận dữ liệu (đồng bộ) do máy tính ở xa gửi

Send

Gửi dữ liệu (đồng bộ) cho máy ở xa.

1.2.3 Socket khơng đồng bộ
1.2.3.1Mơ hình xử lý sự kiện của Windows
Mơ hình sử lý sự kiện được thể hiện qua mơ hình sau:
Thơng qua mơ hình này ta có thể ủy nhiệm cho mơt thủ tục nào đó thực hiện khi sự
kiện sảy ra trên Control.

Hình 1.4: Mơ hình xử lý sự kiện trong Windows


1.2.3.2Sử dụng Socket khơng đồng bộ
Để lập trình khơng đồng bộ với Socket chúng ta sử dụng các phương thức cho việc sử
dụng bất đồng bộ.
-

Các phương thức cho việc lập trình bất đồng được chia làm 2 bắt đầu bằng

-

Begin và End:
Phương thức bắt đầu bằng Begin, bắt đầu một chức năng và được đăng ký với
phương thức AsyncCallback.


Bắt đầu bằng End chỉ chức năng hoàn thành khi AsyncCallback đươc gọi
Requests Started By …
BeginAccept ()

Description of Request

Requests Ended BY …

To accept an incoming

EndAccept ()

connection
BeginConnect ()

To connect to a remote host

EndConnect ()

BeginReceive ()

To retrieve data from a socket

EndReceive ()

BeginReceiveFrom ()

To retrieve data from a specific

EndReciveFrom()


remote host
BeginSend ()

To send data from a socket

EndSend ()

BeginSendTo ()

To send data to a specific remote

EndSendTo ()

host
Để chấp nhận kết nối bất đồng bộ ta sử dụng phương thức BeginAccept() và
EndAccept() như sau:
Phương thức BeginAccept() và EndAccept().
IAsyncResult BeginAccept(AsyncCallback callback, object state)
Socket EndAccept(IAsyncResult iar);
Để thiết lập phương thức kết nối theo cách bất đồng bộ ta sử dụng phương thức
BeginConnect() và EndConnect() như sau:
Phương thức BeginConnect() và EndConnect().
Socket

newsock

=

new


Socket

(AddressFamily.InterNetwork,

SocketType.Stream, ProtocolType.Tcp) ;
IPEndPoint iep =new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050);
newsock.BeginConnect (iep, new AsyncCallback (Connected), newsock);


 Trong đó phương thức Connected thường được viết như sau:
public static void Connected(IAsyncResult iar)
{
Socket sock = (Socket)iar.AsyncState;
try
{
sock.EndConnect(iar);
}
catch (SocketException)
{
Console.WriteLine("Unable to connect to host");
}
}
Để gửi dữ liệu bất đồng bộ chúng ta làm như sau:
Phương thức BeginSend() và EndSend().
BeginSend()
IAsyncResult BeginSend(byte[] buffer, int offset, int size, SocketFlags
sockflag, AsyncCallback callback, object state)
EndSend()
int EndSend(IAsyncResult iar)

 Trong đó phương thức SendData thường được viết như sau:
private static void SendData(IAsyncResult iar)
{
Socket server = (Socket)iar.AsyncState;
int sent = server.EndSend(iar);
}
Tương tự như giao thức hướng kết nối nếu ta sử dụng gửi dữ liệu theo giao thức
không hướng kết nối chúng ta cũng thực hiện tương tự như sau:
• Phương thức BeginSendTo() và EndSendTo().
IAsyncResult BeginSendTo(byte[] buffer,int offset,int size,SocketFlags sockflag,
EndPoint ep, AsyncCallback callback, object state)


Để nhận dữ liệu bất đồng bộ ta thực hiện như sau:
Nhận dữ liệu với giao thức hướng kết nối:


• Phương thức BeginRecieve và EndRecive()
sock.BeginReceive(data, 0, data.Length, SocketFlags.None, new
AsyncCallback(ReceivedData), sock);
Với ReceivedData được định nghĩa như sau:
void ReceivedData(IAsyncResult iar)
{
Socket remote = (Socket)iar.AsyncState;
Int recv = remote.EndReceive(iar);
string receivedData = Encoding.ASCII.GetString(data, 0, recv);
Console.WriteLine(receivedData);
}
Nhận dữ liệu bất đồng bộ với giao thức không hướng kết nối
Phương thức BeginReceiveFrom() và EndReceiveFrom()

sock.BeginReceive(data,0,data.Length,SocketFlags.None,refiep,new
AsyncCallback (ReceiveData) , sock);
void ReceiveData(IasyncResult iar)
{
Socket remote = (Socket)iar.AsyncState;
int recv = remote.EndReceiveFrom(iar);
string stringData = Encoding.ASCII.GetString(data, 0, recv);
Console.WriteLine(stringData);
}
1.2.4 Sử dụng Thread trong các ứng dụng mạng
1.2.4.1Một số khái niệm
-

Đa nhiệm (multitasking): là khả năng hệ điều hành làm nhiều công việc tại một
thời điểm.


-

-

Tiến trình (Process): khi chạy một ứng dụng hệ điều hành sẽ cấp phát riêng cho
ứng dụng đó bộ nhớ và các tài nguyên khác. Bộ nhớ và tài nguyên vật lý riêng
biệt này được gọi là một tiến trình. Các tài nguyên và bộ nhớ của một tiến trình
thì chỉ tiến trình đó được phép truy cập.
Tuyến (Thread): trong hệ thống một tiến trình có thể có một hoặc nhiều chuỗi
thực hiện tách biệt khác nhau và có thể chạy đồng thời. mỗi chuỗi thực hiện này
được gọi là 1 tuyến (Thread). Trong 1 ứng dụng Thread khởi tạo đầu tiên gọi là
Thread sơ cấp hay Thread chính.


1.2.4.2Sử dụng Thread trong chương trình .Net
Để sử dụng Thread trong .NET ta sử dụng namespace System.Threading
Một số phương thức thường dùng:
Public Method

Mơ tả

Name
Abort ()

Kết thúc Thread

Join ()

Buộc chương trình phải chờ cho thread kết thúc (Block) thì
mới thực hiện tiếp (các câu lệnh đứng sau Join).

Resume ()

Tiếp tục chạy thread đã tạm ngừng – suspended

Sleep ()

Static method: tạm dừng thread trong một khoảng thời gian.

Start ()

Bắt đầu chạy (khởi động) một thread. Sau khi gọi phương
thức này, trạng thái của thread chuyển từ trạng thái hiện
hành sang Running.


Suspend ()

Tạm ngưng thread. (phương thức này được loại khỏi phiên
bản VS.NET 2005)

Một số thuộc tính thường dùng:
Public Property

Mơ tả

Name
CurrentThread

This static property: trả về thread hiện hành đang chạy.

IsAlive

Trả về giá trị cho biết trạng thái thực thi của thread hiện
hành.

IsBackground

Sets or gets giá trị cho biết là thread là background hay
foreground thread.

IsThreadPoolThread

Gets a value indicating whether a thread is part of a thread



pool.
Priority

Sets or gets giá trị để chỉ định độ ưu tiên (dành nhiều hay ít
CPU cho thread). Cao nhất là 4, thấp nhất là 0.

ThreadState

Lấy về trạng thái của thread (đang dừng, hay đang chạy…)

1.2.4.3Sử dụng Threadpool trong các chương trình .Net
Method

Description (Mơ tả)

BindHandle ()

Binds an operating system handle to the
thread pool

GetAvailableThreads()

Gets the number of worker threads
available for use in the thread pool

GetMaxThreads ()

Gets the maximum number of worker
threads available in the thread pool


QueueUserWorkItem ()

Queues a user delegate waiting for a
WaitHandle object

UnsafeQueueUserWorkItem ()

Queues an unsafe user delegate to the
thread pool but does not propagate the
calling stack onto the worker thread

UnsafeRegisterWaitForSingleObject ()

Registers an unsafe delegate waiting for a
WaitHandle object


Trên Internet mỗi một trạm (có thể là máy tính, máy in, thiết bị …) đều có một
định danh duy nhất, định danh đó thường được gọi là một địa chỉ (Address). Địa chỉ
trên Internet là một tập hợp gồm 4 con số có giá trị từ 0-255 và cách nhau bởi dấu
chấm.
Để thể hiện địa chỉ này, người ta có thể viết dưới các dạng sau:
Mạng yêu cầu nối độc lập riêng rẽ từng thiết bị ở các nút thông tin đến trung tâm.
Khoảng cách từ máy đến trung tâm rất hạn chế (100 m).
• DiaChi(0) = 192;
• DiaChi(1) = 168;
• DiaChi(2) = 1;
• DiaChi(3) = 1;
Hoặc cũng có thể là một số (long), có độ dài 4 byte. Ví dụ, với địa chỉ 192.168.1.1

ở trên thì giá trị đó sẽ là: 16885952 (đây là số ở hệ thập phân khi xếp liền 4 byte ở
trên lại với nhau 00000001 00000001 10101000 11000000
Như vậy, để đổi một địa chỉ chuẩn ra dạng số ta chỉ việc tính tốn cho từng thành
phần. Ví dụ: Đổi địa chỉ 192.168.1.2 ra số, ta tính như sau:
2 * 256 ^ 3 + 1* 256 ^ 2 + 168 * 256 ^ 1 + 192 * 256 ^ 0
Trong.NET, IPAddress là một lớp dùng để mô tả địa chỉ này. Đây là lớp rất cơ bản
được sử dụng khi chúng ta thao tác (truyền) vào các lớp như IPEndpoint, UDP, TCP,
Socket …
Bảng 1.1: Các thành phần của lớp IpAddress
Thành viên Static
Mô tả
Any
Cung cấp một địa chỉ IP (thường là 0.0.0.0) để chỉ ra
rằng Server phải lắng nghe các hoạt động của Client
trên tất cả các Card mạng (sử dụng khi xây dựng
Server). Thuộc tính này chỉ đọc.
Broadcast
Cung cấp một địa chỉ IP quảng bá (Broadcast, thường
là 255.255.255.255), ở dạng số long.
Loopback
Trả về một địa chỉ IP lặp (IP Loopback, ví dụ
127.0.0.1).
AddressFamily
Trả về họ địa chỉ của địa chỉ IP hiện hành. Nếu địa chỉ
ở dạng IPv4 thì kết quả là Internetwork, và
InternetworkV6 nếu là địa chỉ IPv6.
Phương thức
Mô tả
IPAddress(Int64)
Tạo địa chỉ IP từ một số long.

IPAddress(Byte[])
Tạo địa chỉ IP từ một mảng Byte.


GetAddressByte ()
HostToNetworkOrder()
IsLoopback()

Chuyển địa chỉ thành mảng Byte.
Đảo thứ tự Byte của một số cho đúng với thứ tự Byte
trong địa chỉ IPAddress.
Cho biết địa chỉ có phải là địa chỉ lặp hay khơng?

Ví dụ 1: Kiểm tra xem 192.168.1.300 có phải là địa chỉ IP hợp lệ không
private void KiemTra()
{
String Ip1 = "127.0.0.1";
String Ip2 = "999.0.0.1";
MessageBox.Show(IPAddress.TryParse(Ip1, new IPAddress(0)));
MessageBox.Show (IPAddress.TryParse(Ip2, new IPAddress(1)));
}
Ví dụ 2: Chuyển địa chỉ hiện hành ra mảng byte và hiển thị từng thành sphần trong
mảng đó
private void KiemTra()
{
IpAddress Ip3 = new IPAddress(16885952);
Byte[] b;
b = Ip3.GetAddressBytes();
MessageBox.Show("Address: " & b(0) &"." & b(1) &"." & b(2) & "." &
b(3));

}
1.2.4.4 Lớp IPEndpoint
Trong mạng, để hai trạm có thể trao đổi thơng tin được với nhau thì chúng cần
phải biết được địa chỉ (IP) của nhau và số hiệu cổng mà hai bên dùng để trao đổi thông
tin. Lớp IPAddress mới chỉ cung cấp cho ta một vế là địa chỉ IP (IPAddress), như vậy
vẫn còn thiếu vế thứ hai là số hiệu cổng (Port number). Như vậy, lớp IPEndpoint chính
là lớp chứa đựng cả IPAddress và Port number.
Đối tượng IPEndpoint sẽ được dùng sau này để truyền trực tiếp cho các đối tượng
UDP, TCP…
Bảng 1.2: Các thành viên của lớp IpEndPoint
Phương thức khởi tạo
Mô tả
IPEndPoint(Int64, Int32)
Tạo một đối tượng mới của lớp IPEndPoint, tham
số truyền vào là địa chỉ IP (ở dạng số) và cổng sẽ
dùng để giao tiếp.
IPEndPoint(IPAddress,
Tạo một đối tượng mới của lớp IPEndPoint,
Int32)
Tham số truyền vào là một địa chỉ IPAddress và
số hiệu cổng dùng để giao tiếp.
Thuộc tính
Mơ tả
Address
Trả về hoặc thiết lập địa chỉ IP cho Endpoint (trả
về một đối tượng IPAddress).


AddressFamily
Port

Phương thức
Create()
ToString()

Lấy về loại giao thức mà Endpoint này đang sử
dụng.
Lấy hoặc gán số hiệu cổng của Endpoint.
Mô tả
Tạo một Endpoint từ một địa chỉ socket (socket
address).
Trả về địa chỉ IP và số hiệu cổng theo khuôn dạng
địa chỉ: cổng. Ví dụ: “192.168.1.1:8080”

1.2.4.5Lớp UDP (UDPClient)
Giao thức UDP (User Datagram Protocol hay User Define Protocol) là một giao
thức phi kết nối (connectionless) có nghĩa là một bên có thể gửi dữ liệu cho bên kia mà
khơng cần biết là bên đó đã sẵn sàng hay chưa? (Nói cách khác là khơng cần thiết lập
kết nối giữa hai bên khi tiến hành trao đổi thông tin). Giao thức này không tin cậy
bằng giao thức TCP nhưng tốc độ lại nhanh và dễ cài đặt. Ngồi ra, với giao thức UDP
ta cịn có thể gửi các gói tin quảng bá (Broadcast) cho đồng thời nhiều máy.
Trong.NET, lớp UDPClient (nằm trong namesapce System.Net.Sockets) đóng gói các
chức năng của giao thức UDP.
Bảng 1.2: Các thành viên của lớp UDPClient
Phương thức khởi tạo
Mô tả
UdpClient ()
Tạo một đối tượng (thể hiện) mới của lớp UDPClient.
UdpClient (AddressFamily)
Tạo một đối tượng (thể hiện) mới của lớp
UDPClient. Thuộc một dòng địa chỉ (AddressFamily)

được chỉ định.
UdpClient (Int32)
Tạo một UdpClient và gắn (bind) một cổng cho nó.
UdpClient (IPEndPoint)
Tạo một UdpClient và gắn (bind) một IPEndpoint
(gán địa chỉ IP và cổng) cho nó.
UdpClient(Int32,
Tạo một UdpClient và gán số hiệu cổng,
AddressFamily)
AddressFamily
UdpClient(String, Int32)
Tạo một UdpClient và thiết lập với một trạm từ xa
mặc định.
Phương thức
Mô tả
BeginReceive()
Nhận dữ liệu Không đồng bộ từ máy ở xa.
BeginSend()
Gửi khơng đồng bộ dữ liệu tới máy ở xa
Close()
Đóng kết nối.
Connect()
Thiết lập một Default remote host.
EndReceive()
Kết thúc nhận dữ liệu không đồng bộ ở trên
EndSend()
Kết thúc việc gửi dữ liệu không đồng bộ ở trên
Receive (ref IPEndPoint)
Nhận dữ liệu (đồng bộ) do máy ở xa gửi. (Đồng bộ có
nghĩa là các lệnh ngay sau lệnh Receive chỉ được

thực thi nếu Receive đã nhận được dữ liệu về. Cịn
nếu nó chưa nhận được – dù chỉ một chút – thì nó vẫn


Send()

cứ chờ (blocking))
Gửi dữ liệu (đồng bộ) cho máy ở xa.

Ví dụ 1: Tạo một UDPClient gắn vào cổng 10 và Gửi một gói tin "Hello" tới một ứng
dụng UDP khác đang chạy trên máy có địa chỉ là "127.0.0.1" và cổng 1000.
using System.Net;
using System.Net.Sockets;
public class UdpTest
{
const LOCAL_PORT = 10;
const REMOTE_PORT = 1000;
// Tạo một UDP và gắn (Bind) vào cổng 10
UpdCleint Sender = new UdpClient(LOCAL_PORT);
privte void Gửi_Dữ_Liệu()
{
// Chuyển chuỗi "Hello there !" thành mảng byte để gửi đi
Byte[] msg = System.Text.Encoding.UTF8.GetBytes("Hello there !");
// Gửi vào cổng 1000 của máy 127.0.0.1
Sender.Send(msg, msg.Length, "127.0.0.1", REMOTE_PORT);
}
}
Ví dụ 2: Tạo một UDPClient gắn vào cổng 1000 và nhận dữ liệu từ ứng dụng khác gửi
đến.
using System.Net;

using System.Text;
using System.Net.Sockets;
namespace Test
{
public class UdpTest
const LOCAL_PORT = 1000;
const REMOTE_PORT = 10;
UpdClient Receiver = new UdpClient(LOCAL_PORT);
private void Nhận_Dữ_Liệu()
{
IPEndPoint ep = new
IPEndPoint(IPAddress.Parse("127.0.0.1"), 100);
Byte[] msg = Receiver.Receive(ep);
String str;
str = Encoding.UTF8.GetString(msg);
'/Chuyển byte -> String
MessageBox.Show(str);
}
}
}


2.2.1.1 Lớp TCP (TCPClient)

Mục đích của lớp UDPClient ở trên là dùng cho lập trình với giao thức UDP,
với giao thức này thì hai bên khơng cần phải thiết lập kết nối trước khi gửi do vậy mức
độ tin cậy không cao. Để đảm bảo độ tin cậy trong các ứng dụng mạng, người ta còn
dùng một giao thức khác, gọi là giao thức có kết nối: TCP (Transport Control
Protocol). Trên Internet chủ yếu là dùng loại giao thức này, ví dụ như Telnet, HTTP,
SMTP, POP3… Để lập trình theo giao thức TCP, MS.NET cung cấp hai lớp có tên là

TCPClient và TCPListener.
Phương thức khởi tạo
TcpClient()
TcpClient(IPEndPoint)

TcpClient(String,Int32)

Các thuộc tính
Available
Client
Connected
Các hàm thành phần
Close()
Connect(RemoteHost,
RemotePort)
GetStream()

Bảng 1.3: Các thành phần của lớp TcpClient
Mô tả
Tạo một đối tượng TcpClient. Chưa đặt thơng số gì.
Tạo một TcpClient và gắn cho nó một EndPoint cục bộ.
(Gán địa chỉ máy cục bộ và số hiệu cổng để sử dụng trao
đổi thông tin về sau)
Tạo một đối tượng TcpClient và kết nối đến một máy có
địa chỉ và số hiệu cổng được truyền vào. RemoteHost có
thể là địa chỉ IP chuẩn hoặc tên máy.
Mô tả
Cho biết số byte đã nhận về từ mạng và có sẵn để đọc.
Trả về Socket ứng với TCPClient hiện hành.
Trạng thái cho biết đã kết nối được đến Server hay chưa?

Mơ tả
Giải phóng đối tượng TcpClient nhưng khơng đóng kết
nối.
Kết nối đến một máy TCP khác có Tên và số hiệu cổng.
Trả về NetworkStream để từ đó giúp ta gửi hay nhận dữ
liệu. (Thường làm tham số khi tạo StreamReader và
StreamWriter để gửi và nhận dữ liệu dưới dạng xâu ký tự).
Khi đã gắn vào StreamReader và StreamWriter rồi thì ta
có thể gửi và nhận dữ liệu thông qua các phương thức
Readline, writeline tương ứng của các lớp này.

Từ các thành viên của lớp TcpClient ở trên ta thấy rằng, việc kết nối và thực hiện
gửi nhận rất đơn giản. Theo các trình tự sau:
- Bước 1: Tạo một đối tượng TcpClient.
- Bước 2: Kết nối đến máy chủ (Server) dùng phương thức Connect.
- Bước 3: Tạo 2 đối tượng StreamReader (Receive)và StreamWriter (Send) và
"nối" với GetStream của cpPClient.
- Bước 4:
+ Dùng đối tượng StreamWriter.Writeline/Write vừa tạo ở trên để gửi dữ liệu
đi.


Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×