1. Trang chủ
  2. » Luận Văn - Báo Cáo

De tai screen monitoring v3

60 12 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 60
Dung lượng 2,32 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 ngoài để đảm bảo dữ liệu không bị truyền ra bên ngoài.

Trang 1

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 ngoài để đảm bảo dữ liệu không bị truyền ra bên ngoà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ậpvà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ơntrong đờ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ôngqua 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 đổiDatabase mà không cần sử dụng phần mềm bên ngoà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 đíchtrao đổ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ôitrườ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ìnhnà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ínhtrong 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àyhoạt động dựa trên mô hình Client – Server hoặc Point to Point và kết nối bằng mộttrong 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

Trang 2

Do những người thiết kế mong muốn phát triển một ngôn ngữ dễ đọc và quenthuộ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áncho 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áclớ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ạytrơ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ìnhJava, 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, taphải biên dịch lại

Trang 3

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ìnhthông dịch Không như C hay C++, trình biên dịch của Java chuyển mã nguồn thànhdạ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 codethành mã lệnh mà CPU thực thi được

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ặnkhô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 soát để đảm bảo mã an toà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 bytecode có đảm bảo các quy tắc an toàn trước khi thực thi

Trang 4

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ớihạ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ậychú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

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ươngthứ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 quá trình hoạt động của mộtchươ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ụnglập trình socket và thuật toá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 đếncá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 haicổ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áctiến trình khác

Trang 5

- 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 porttrên hệ thống cục bộ hay ở xa Khi đó nó có thể được dùng để gửi hay nhận dữ liệutrong 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

- 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ủacá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ườiquản trị

5.2 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ạigiữa các user thông qua sự điều khiển của một Server trong mạng LAN…

Trang 6

Chương 1: TỔNG QUAN LẬP TRÌNH MẠNG, PHƯƠNG PHÁP

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ênkiế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ànhthô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à cungcấp thiết bị tính toán như AIX của IBM, SINIX của Siemens, Digital UNIX của DEC),Windows9x/NT, NovellNetware,

Trang 7

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 giaothứ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ệungắ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êunhư 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êucầu

TCP (Transmission Control Protocol - "Giao thức điều khiển truyền vận") là mộttrong 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êncá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ơinhậ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ùngmộ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

Trang 8

- 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 conthà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ạngtrong 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

- 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

Trang 9

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 để đặtcho 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 trongmạng Phần Host_id chỉ chứa các bit 1 Địa chỉ này cũng không thể dùng đặtcho 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

Trang 10

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àomạ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ínhxá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ườinà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

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

Trang 11

Đị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óichung phân chia những "siêu khối" đến Cơ quan Internet khu vực, rồi từ đó lại phânchia thành những khối nhỏ hơn đến nhà cung cấp dịch vụ Internet và công ty.

- 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ếtnố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ậymức dộ tin cậy không cao Để đảm bảo độ tin cậy trong các ứng dụng mạng người tacòn sử dụng một giao thức khác gọi là giao thức có kết nối: TCP (transport controlprotocol) Để lập trình theo giao thức TCP, MS.NET cung cấp hai lớp có tên làTCPClient và TCPListener

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

Trang 12

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ỉ IPchuẩn hoặc tên máy

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

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:

Close Giải phóng đối tượng TcpClient nhưng không đóng

kết nốiConnect (RemoteHost,

Port)

Kết nối đến một máy TCP khác có tên và số hiệucổ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ồithì ta có thể gửi và nhận dữ liệu thông qua cácphương thức Readln, writeline tương ứng của cáclớp này

Trang 13

địnhTcpListener (IPAddress,

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 yêu cầu kết nối

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,

Trang 14

PUBLIC Method

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

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

Trang 15

Bắt đầu bằng End chỉ chức năng hoàn thành khi AsyncCallback đươc gọi

Requests Started By … Description of Request Requests Ended BY …BeginAccept () To accept an incoming

connection

EndAccept ()

BeginConnect () To connect to a remote host EndConnect ()

BeginReceive () To retrieve data from a socket EndReceive ()

BeginReceiveFrom () To retrieve data from a specific

remote host

EndReciveFrom()

BeginSend () To send data from a socket EndSend ()

BeginSendTo () To send data to a specific remote

host

EndSendTo ()

Để 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ứcBeginConnect() 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);

Trang 16

 Trong đó phương thức Connected thường được viết như sau:

public static void Connected(IAsyncResult iar)

Để 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ứckhô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)

Trang 17

Để 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:

Trang 18

• 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);

Trang 19

- 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êngbiệ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ìnhthì 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ỗithự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

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

Trang 20

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

BindHandle () Binds an operating system handle to the

thread poolGetAvailableThreads() Gets the number of worker threads

available for use in the thread poolGetMaxThreads () Gets the maximum number of worker

threads available in the thread poolQueueUserWorkItem () Queues a user delegate waiting for a

WaitHandle objectUnsafeQueueUserWorkItem () Queues an unsafe user delegate to the

thread pool but does not propagate the calling stack onto the worker threadUnsafeRegisterWaitForSingleObject () Registers an unsafe delegate waiting for a

WaitHandle object

Trang 21

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ấuchấ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 toán cho từng thànhphầ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

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 Clienttrên tất cả các Card mạng (sử dụng khi xây dựngServer) 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

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

Trang 22

GetAddressByte () Chuyển địa chỉ thành mảng Byte.

HostToNetworkOrder() Đảo thứ tự Byte của một số cho đúng với thứ tự Byte

trong địa chỉ IPAddress

IsLoopback() 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)));

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ượngUDP, TCP…

Bảng 1.2: Các thành viên của lớp IpEndPoint

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ẽ

Address Trả về hoặc thiết lập địa chỉ IP cho Endpoint (trả

về một đối tượng IPAddress)

Trang 23

AddressFamily Lấy về loại giao thức mà Endpoint này đang sử

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

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

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ỉ đượcthực thi nếu Receive đã nhận được dữ liệu về Cònnếu nó chưa nhận được – dù chỉ một chút – thì nó vẫn

Trang 24

cứ chờ (blocking))

Send() 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

// 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);

UpdClient Receiver = new UdpClient(LOCAL_PORT);

private void Nhận_Dữ_Liệu()

{

IPEndPoint ep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 100);

}

Trang 25

Bảng 1.3: Các thành phần của lớp TcpClient

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(String,Int32) 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

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 để 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ứcReadline, 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ệngử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

Trang 26

+ Dùng đối tượng StreamReader.Readline/Read vừa tạo ở trên để đọc dữ liệuvề.

Bảng 1.4: Các thành phần của lớp TcpListener

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

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

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 lệnh này cho đến khi nào có mộtkết nối đến – “Blocking”)

Pending() Cho biết liệu có kết nối nào đang chờ đợi khôngStart() Bắt đầu lắng nghe các yêu cầu kết nối

Ví dụ: Tạo một server trong đó, khi có một client kết nối đến thì server chuyển xâu đó

thành chữ HOA và gửi trả lại cho Client

TcpListener TCPServer = new TcpListener(21);

bool Thoat = false;

TcpClient[] Clients = new TcpClient[101];

int CurrClient = 0;

public void Xu_Ly_Ket_Noi()

Trang 27

int LastClient = CurrClient - 1;

TcpClient Con = Clients(LastClient);

StreamReader Doc = new StreamReader(Con.GetStream()); StreamWriter Ghi = new StreamWriter(Con.GetStream()); string S = null;

while (Thoat == false)

private void frmClose(object s, FormClosingEventArgs e)

}

Trang 28

1.3 Sơ lược về lập trình đa luồng

1.3.1 Khái niệm Luồng (Thread)

Một luồng (Thread) là một chuỗi liên tiếp những sự thực thi trong chương trình.

Trong một chương trình C#, việc thực thi bắt đầu bằng phương thức main() và tiếp tụccho đến khi kết thúc hàm main() Cấu trúc này rất hay cho những chương trình có mộtchuỗi xác định những nhiệm vụ liên tiếp Nhưng thường thì một chương trình cần làmnhiều công việc hơn vào cùng một lúc Ví dụ trong Internet Explorer khi ta đang tảimột trang web thì ta nhấn nút back hay một link nào đó, để làm việc này InternetExplorer sẽ phải làm ít nhất là 03 việc:

1) Lấy dữ liệu được trả về từ Internet cùng với các tập tin đi kèm

2) Thể hiện trang Web

3) Xem người dùng có nhập để làm thứ gì khác không

Để đơn giản vấn đề này ta giả sử Internet Explorer chỉ làm 02 công việc:

1) Trình bày trang Web

2) Xem người dùng có nhập gì không

Để thực hành việc này ta sẽ viết một phương thức dùng để lấy và thể hiện trang Web.Giả sử rằng việc trình bày trang Web mất nhiều thời gian (do phải thi hành các đoạnjavascript hay các hiệu ứng nào đó …) Vì vậy sau một khoảng thời gian ngắn khoảng1/12 giây, phương thức sẽ kiểm tra xem người dùng có nhập gì không Nếu có thì nó

sẽ đuơc xử lí, nếu không thì việc trình bày trang sẽ được tiếp tục Và sau 1/12 giâyviệc kiểm tra sẽ được lặp lại Tuy nhiên viết phương thức này thì rất phức tạp do đó ta

sẽ dùng kiến trúc event trong Window nghĩa là khi việc nhập xảy ra hệ thống sẽ thôngbáo cho ứng dụng bằng cách đưa ra một event Ta sẽ cập nhật phương thức để chophép dùng các event:

• Ta sẽ viết một bộ xử lí event để đáp ứng đối với việc nhập của người dùng

• Ta sẽ viết một phương thức để lấy và trình bày dữ liệu Phương thức này đượcthực thi khi ta không làm bất cứ điều gì khác

Ta hãy xem cách phương thức lấy và trình bày trang web làm việc: đầu tiên nó sẽ tựđịnh thời gian Trong khi nó đang chạy, máy tính không thể đáp ứng việc nhập củangười dùng Do đó nó phải chú ý đến việc định thời gian để gọi phương thức kiểm traviệc nhập của người dùng, nghĩa là phương thức vừa chạy vừa quan sát thời gian Bêncạnh đó nó còn phải quan tâm đến việc lưu trữ trạng thái trước khi nó gọi phương thứckhác để sau khi phương thức khác thực hiện xong nó sẽ trả về đúng chỗ nó đã dừng.Vào thời Window 3.1 đây thực sự là những gì phải làm để xử lí tình huống này Tuynhiên ở NT3.1 và sau đó là Windows 95 trở đi đã có việc xử lí đa luồng điều này làmviệc giải quyết vấn đề tiện lợi hơn Dưới đây chúng ta sẽ tìm hiểu một vài lớp cơ bản

Trang 29

trong ngôn ngữ lập trình C# và vấn đề đồng bộ hóa (Synchronization) trong lập trình

đa luồng

1.3.2 Khảo sát namespace System.Threading

Namespace System.Threading cung cấp một số kiểu dữ liệu cho phép bạn thựchiện lập trình đa luồng Ngoài việc cung cấp những kiểu dữ liệu tượng trưng cho mộtluồng cụ thể nào đó, namespace này còn định nghĩa những lớp có thể quản lý mộtcollection các luồng (ThreadPool), một lớp Timer đơn giản (không dựa vào GUI) vàcác lớp cung cấp truy cập được đồng bộ vào dữ liệu được chia sẽ sử dụng

Bảng 1.5: Một số lớp của namespace System.Threading

Interlocked Lớp này dùng cung cấp truy cập đồng bộ hóa vào dữ liệu

được chia sẽ sử dụng (shared data)

Moniter Lớp này cung cấp việc đồng bộ hóa các đối tượng luồng sử

dụng khóa chốt (lock) và tín hiệu chờ (wait signal)

Mutex Lớp này cung cấp việc đồng bộ hóa sơ đẳng có thể được

dùng đối với inter process synchronization

Thread Lớp này tượng trưng cho một luồng được thi hành trong lòng

Common Language Runtime Sử dụng lớp này bạn có khảnăng bổ sung những luồng khác trong cùng AppDomain

ThreadPool Lớp này quản lý những luồng có liên hệ với nhau trong cùng

một Process nào đó

Timer Cho biết một delegate có thể được triệu gọi vào một lúc được

khai báo nào đó Tác vụ wait được thi hành bởi luồng trongthread pool

WaitHandle Lớp này tượng trưng cho tất cả các đối tượng đồng bộ hóa

(cho phép multiple wait) vào lúc chạy

ThreadStart Lớp này là một delegate chỉ về hàm hành sự nào đó phải

được thi hành đầu tiên khi một luồng bắt đầu

TimerCallBack Delegate đối với Timer

WaitCallBack Lớp này là một delegate định nghĩa hàm hành sự kêu gọi lại

(callback) đối với ThreadPool user work item

1.3.2.1 Lớp Thread

Lớp sơ đẳng nhất trong tất cả các lớp thuộc Namespace System.Threading làlớp Thread Lớp này tượng trưng cho một vỏ bọc hướng đối tượng bao quanh một lộtrình thi hành trong lòng một AppDomain nào đó Lớp này định nghĩa một số hàmthực thi (cả static lẫn shared) cho phép bạn tạo mới những luồng từ luồng hiện hành,cũng như cho Sleep, Stop hay Kill một luồng nào đó

Bảng 1.6: Các thành phần static của lớp Thread

Trang 30

Các thành phần Static Mô tả

CurrentThread Thuộc tính read-only này trả về một quy chiếu về luồng

hiện đang chạy

GetData() Đi lấy vị trí từ slot được khai báo trên luồng hiện hành

đối với domain hiện hành trong luồng

SetData() Cho đặt để trị lên slot được khai báo trên luồng hiện hành

đối với domain hiện hành trong luồng

GetDomain()

GetDomainID()

Đi lấy một qui chiếu về AppDomain hiện hành (hoặc mãnhận diện ID của domain này) mà luồng hiện đang chạytrên đó

Sleep() Cho ngưng luồng hiện hành trong một thời gian nhất định

được khai báo

Ngoài ra lớp Thread cũng hổ trợ các thành viên cấp đối tượng.

Bảng 1.7: Các thành viên cấp đối tượng của lớp Thread

IsAlive Thuộc tính này trả về một trị boolean cho biết liệu xem luồng

đã khởi đông hay chưa

IsBackground Đi lấy hoặc đặt để giá trị cho biết liệu xem luồng là một

luồng nền hay không

Name Thuộc tính này cho phép bạn thiết lập một tên văn bản mang

tính thân thiện đối với luồng

Priority Đi lấy hoặc đặt để ưu tiên của một luồng Có thể được gán

một trị lấy từ enumeration ThreadPriority (chẳng hạn Normal, Lowest, Highest, BelowNormal, AboveNormal).

ThreadState Đi lấy hoặc đặt để tình trạng của luồng Có thế được gán từ

enumeration ThreadState (chẳng hạn Unstarted, Running, WaitSleepJoin, Suspended, SuspendRequested, AbortRequested, Stopped).

Interrup() Cho ngưng chạy luồng hiện hành

Join() Yêu cầu luồng chờ đối với luồng bị ngưng chạy

Resume() Tiếp tục lại đối với một luồng bị ngưng chạy

Start() Cho bắt đầu thi hành luồng được khai báo bởi delegate

ThreadStart

Suspend() Cho ngưng chạy một luồng Nếu luồng đã bị ngưng rồi, một

triệu gọi hàm Suspend() sẽ không có tác dụng.

1.3.2.2 Thao tác với luồng

Luồng được thao tác bằng cách dùng lớp Thread nằm trong Namespace

System.Threading Một thể hiện của luồng đại diện cho một luồng Ta có thể tạo cácluồng khác bằng cách khởi tạo một đối tượng Thread

Giả sử rằng ta đang viết 1 trình biên tập hình ảnh đồ hoạ, và người dùng yêu cầu thayđổi độ sâu của màu trong ảnh Ta bắt đầu khởi tạo một đối tượng luồng như sau:

Ngày đăng: 30/03/2021, 09:54

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w