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

Đồ án lập trình mạng : xây dựng chương trình remore desktop- ứng dụng socket

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 (626.07 KB, 33 trang )

ĐẠI HỌC ĐÀ NẴNG
TRƯỜNG ĐẠI HỌC BÁCH KHOA
KHOA CÔNG NGHỆ THÔNG TIN
ĐỒ ÁN LẬP TRÌNH MẠNG
ĐỒ ÁN LẬP TRÌNH MẠNG
ĐỀ TÀI :
ĐỀ TÀI :
XÂY DỰNG CHƯƠNG TRÌNH REMOTE DESKTOP
XÂY DỰNG CHƯƠNG TRÌNH REMOTE DESKTOP
Sinh viên : Trần Quốc Nhật Trung
Lớp : 12TLT.CNTT
GVHD : Nguyễn Võ Quang Đông
Đà Nẵng – Tháng 12/2013
Xây dựng chương trình Remote Desktop
MỤC LỤC
MỤC LỤC 2
LỜI MỞ ĐẦU 3
LỜI CẢM ƠN 4
Chương I: Giới thiệu về lập trình .Net và ngôn ngữ C# 5
Chương II: Giới thiệu lập trình mạng trong Net Framework 9
CHƯƠNG 3: CHƯƠNG TRÌNH REMOTE DESKTOP 18
KÊT LUẬN 32
TÀI LIỆU THAM KHẢO 33
SVTH: Trần Quốc Nhật Trung GVHD: Nguyễn Võ Quang Đông
2
Xây dựng chương trình Remote Desktop
LỜI MỞ ĐẦU
Sự phát triển như vũ bão của ngành công nghệ thông tin kéo theo đó là các dịch vụ
mạng ngày càng phát triển, mở rộng và hoàn thiện hơn, tuy vẫn tồn tại nhiều khuyết điểm
song không ít tiện lợi từ công nghệ đem lại cho xã hội loài người sự nhanh chóng và chính
xác


Ngôn ngữ lập trình là một phần không thể thiếu trong việc xây dựng nên một thế giới
công nghệ linh hoạt và mạnh mẽ. Không gian làm việc Microsoft .Net tổng hợp bởi bốn bộ
ngôn ngữ lập trình: C#, VB.NET, Managed C++, and J# .NET. ở đó có sự chồng gối lên nhau
của các ngôn ngữ, và được định nghĩa trong FCL (framework class library). Hỗ trợ cho lập
trình viên phát triển các ứng dụng mạng với kích thước nhẹ và mạnh mẽ trong xử lý.
Dựa trên kiến thức lập trình mạng với C#, từ ý tưởng xây dựng một chương trình có
khả năng tương tác với máy tính từ xa thông qua hệ thống mạng, chương trình Remote
desktop được xây dựng, dựa theo mô hình Client-Server hỗ trợ các tính năng cơ bản tương tác
với máy tính từ xa như tắt máy, khởi động lại máy, ngủ đông, khóa máy, chạy một số ứng
dụng, gửi thông điệp, gửi một file hay lấy 1 file từ máy đang điều khiển… sử dụng ngôn ngữ
lập trình C#.
SVTH: Trần Quốc Nhật Trung GVHD: Nguyễn Võ Quang Đông
3
Xây dựng chương trình Remote Desktop
LỜI CẢM ƠN
Lời đầu tiên em xin được bày tỏ lòng biết ơn chân thành tới thầy giáo Nguyễn Võ
Quang Đông , giảng viên khoa CNTT trường ĐH Bách Khoa Đà Nẵng, thầy đã trực tiếp
hướng dẫn và chỉ bảo tận tình trong suốt quá trình em thực hiện đồ án thời gian qua.
.Em xin chân thành cảm ơn các thầy giáo, cô giáo trong trường trường ĐH Bách
Khoa Đà Nẵng và đặc biệt là các thầy cô trong bộ môn tin học, đã giúp e có thêm những kiến
thức để hoàn thành đồ án này .
Một lần nữa em xin chân thành cảm ơn!
Đà Nẵng, ngày 15 tháng 12 năm 2013
Sinh viên thực hiện
Trần Quốc Nhật Trung
SVTH: Trần Quốc Nhật Trung GVHD: Nguyễn Võ Quang Đông
4
Xây dựng chương trình Remote Desktop
Chương I: Giới thiệu về lập trình .Net và ngôn ngữ C#
1.1.Giới thiệu về ngôn ngữ C#:

Microsoft .Net không phải là một ngôn ngữ lập trình, đó là một không gian làm việc
tổng hợp bởi bốn bộ ngôn ngữ lập trình: C#, VB.NET, Managed C++, and J# .NET. Ở đó có
sự chồng gối lên nhau của các ngôn ngữ, và được định nghĩa trong FCL (framework class
library).
Microsoft .Net bao gồm 2 phần chính: Framework và Intergrated Development
Enviroment (IDE). Framework cung cấp những gì cần thiết và căn bản, là khuôn dạng hay
môi trường hỗ trợ các hạ tầng cơ sở theo một quy ước nhất định để công việc được thuận tiện.
IDE cung cấp một môi trường giúp chúng ta triển khai dễ dàng và được nhanh chóng các ứng
dụng dựa trên nền tảng .Net.
Thành phần Framework là quan trọng nhất .NET là cốt lõi và tinh hoa của môi trường,
còn IDE chỉ là công cụ để phát triển dựa trên nền tảng đó thôi. Trong .NET toàn bộ các ngôn
ngữ C#, Visual C++ hay Visual Basic.NET đều dùng cùng một IDE.
Microsoft .NET là nền tảng cho việc xây dựng và thực thi các ứng dụng phân tán thế
hệ kế tiếp. Bao gồm các ứng dụng từ client đến server và các dịch vụ khác. Một số tính năng
của Microsoft .NET cho phép những nhà phát triển sử dụng như sau:
• Một mô hình lập trình cho phép nhà phát triển xây dựng các ứng dụng dịch vụ web và
ứng dụng client với Extensible Markup Language (XML).
• Tập hợp dịch vụ XML Web, như Microsoft .NET My Services cho phép nhà phát
triển đơn giản và tích hợp người dùng kinh nghiệm.
• Cung cấp các server phục vụ bao gồm: Windows 2000, SQL Server, và BizTalk
Server, tất cả điều tích hợp, hoạt động, và quản lý các dịch vụ XML Web và các ứng dụng
SVTH: Trần Quốc Nhật Trung GVHD: Nguyễn Võ Quang Đông
5
Xây dựng chương trình Remote Desktop
• Các phần mềm client như Windows XP và Windows CE giúp người phát triển phân
phối sâu và thuyết phục người dùng kinh nghiệm thông qua các dòng thiết bị.
• Nhiều công cụ hỗ trợ như Visual Studio .NET, để phát triển các dịch vụ Web
XML,ứng dụng trên nền Windows hay nền web một cách dể dàng và hiệu quả.
1.2. Kiến trúc .Net
Mô hình kiến trúc của .Net:

.NET Framework là một platform mới làm đơn giản việc phát triển ứng dụng trong
môi trường phân tán của Internet. .NET
Framework được thiết kế đầy đủ để đáp ứng theo quan điểm sau:
Để cung cấp một môi trường lập trình hướng đối tượng vững chắc, trong đó mã nguồn
đối tượng được lưu trữ và thực thi một cách cục bộ. Thực thi cục bộ nhưng được phân tán trên
Internet, hoặc thực thi từ xa.
Để cung cấp một môi trường thực thi mã nguồn mà tối thiểu được việc đóng gói phần
mềm và sự tranh chấp về phiên bản.
SVTH: Trần Quốc Nhật Trung GVHD: Nguyễn Võ Quang Đông
Web Service Web Forms Windows Forms
Data and XML classes
(ADO.NET, SQL, XSLT, XPath, XML, etc.)
Framwork Base Classes
(IO, string, net, security, threading, text, reffection, collection, etc.)
Common Language Runtime
(Debug, exception, type checking, JIT compiler)
Windows FlatForm
(Debug, exception, type checking, JIT compiler)
6
Xây dựng chương trình Remote Desktop
Để cung cấp một môi trường thực thi mã nguồn mà đảm bảo việc thực thi an toàn mã
nguồn, bao gồm cả việc mã nguồn được tạo bởi hãng thứ ba hay bất cứ hãng nào mà tuân thủ
theo kiến trúc .NET.
Để cung cấp một môi trường thực thi mã nguồn mà loại bỏ được những lỗi thực hiện
các script hay môi trường thông dịch.
Để làm cho những người phát triển có kinh nghiệm vững chắc có thể nắm vững nhiều
kiểu ứng dụng khác nhau. Như là từ những ứng dụng trên nền Windows đến những ứng dụng
dựa trên web.
Để xây dựng tất cả các thông tin dựa triên tiêu chuẩn công nghiệp để đảm bảo rằng mã
nguồn trên .NET có thể tích hợp với bất cứ mã nguồn khác.

.NET Framework có hai thành phần chính: Common Language Runtime (CLR) và thư
viện lớp .NET Framework. CLR là nền tảng của .NET Framework.
Phát triển ứng dụng Client:
Những ứng dụng client cũng gần với những ứng dụng kiểu truyền thống được lập trình
dựa trên Windows. Đây là những kiểu ứng dụng hiển thị những cửa sổ hay những form trên
desktop cho phép người dùng thực hiện một thao tác hay nhiệm vụ nào đó. Những ứng dụng
client bao gồm những ứng dụng như xử lý văn bản, xử lý bảng tính, những ứng dụng trong
lĩnh vực thương mại như công cụ nhập liệu, công cụ tạo báo cáo Những ứng dụng client này
thường sử dụng những cửa sổ, menu, toolbar, button hay các thành phần GUI khác, và chúng
thường truy cập các tài nguyên cục bộ như là các tập tin hệ thống, các thiết bị ngoại vi như
máy in.
Một loại ứng dụng client khác với ứng dụng truyền thống như trên làActiveX control
(hiện nay nó được thay thế bởi các Windows Form control) được nhúng vào các trang web
trên Internet. Các ứng dụng này cũng giống như những ứng dụng client khác là có thể truy cập
tài nguyên cục bộ.
Những lớp .NET Framework chứa trong .NET Framework được thiết kế cho việc sử
dụng phát triển các GUI. Điều này cho phép người phát triển nhanh chóng và dễ dàng tạo các
cửa sổ, button, menu, toolbar, và các thành phần khác trong các ứng dụng được viết phục vụ
cho lĩnh vực thương mại.
SVTH: Trần Quốc Nhật Trung GVHD: Nguyễn Võ Quang Đông
7
Xây dựng chương trình Remote Desktop
1.3.Ngôn ngữ C#
Ngôn ngữ C# khá đơn giản, chỉ khoảng 80 từ khóa và hơn mười mấy kiểu dữ liệu
được xây dựng sẵn. Tuy nhiên, ngôn ngữ C# có ý nghĩa cao khi nó thực thi những khái niệm
lập trình hiện đại. C# bao gồm tất cả những hỗ trợ cho cấu trúc, thành phần component, lập
trình hướng đối tượng.
Phần cốt lõi hay còn gọi là trái tim của bất cứ ngôn ngữ lập trình hướng đối tượng là
sự hỗ trợ của nó cho việc định nghĩa và làm việc với những lớp. Những lớp thì định nghĩa
những kiểu dữ liệu mới, cho phép người phát triển mở rộng ngôn ngữ để tạo mô hình tốt hơn

để giải quyết vấn đề. Ngôn ngữ C# chứa những từ khóa cho việc khai báo những kiểu lớp đối
tượng mới và những phương thức hay thuộc tính của lớp, và cho việc thực thi đóng gói, kế
thừa, và đa hình, ba thuộc tính cơ bản của bất cứ ngôn ngữ lập trình hướng đối tượng.
Trong ngôn ngữ C# mọi thứ liên quan đến khai báo lớp điều được tìm thấy trong phần
khai báo của nó. Định nghĩa một lớp trong ngôn ngữ C# không đòi hỏi phải chia ra tập tin
header và tập tin nguồn giống như trong ngôn ngữ C++. Hơn thế nữa, ngôn ngữ C# hỗ trợ
kiểu XML, cho phép chèn các tag XML để phát sinh tự động các document cho lớp.
Ngôn ngữ C# cung cấp những đặc tính hướng thành phần (component-oriented), như
là những thuộc tính, những sự kiện. Lập trình hướng thành phần được hỗ trợ bởi CLR cho
phép lưu trữ metadata với mã nguồn cho một lớp.
SVTH: Trần Quốc Nhật Trung GVHD: Nguyễn Võ Quang Đông
8
Xây dựng chương trình Remote Desktop
Chương II: Giới thiệu lập trình mạng trong Net Framework
2.1 Sử dụng các lớp hỗ trợ được xây dựng từ lớp Socket
2.1.1 Lớp TCPClient
Giao thức UDP là giao thức phi kết nôi, 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 ko 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:
Constructor method
Tên Mô tả
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 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.
Một số thuộc tính:
Tên Mô tả
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 ?
SVTH: Trần Quốc Nhật Trung GVHD: Nguyễn Võ Quang Đông
9
Xây dựng chương trình Remote Desktop
Một số phương thức:
Tên Mô tả
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.
2.1.2. Lớ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:
Phương thức khởi tạo
Tên Mô tả
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:
Tên Mô tả
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
SVTH: Trần Quốc Nhật Trung GVHD: Nguyễn Võ Quang Đông
10
Xây dựng chương trình Remote Desktop
không? ( True = có).
Start Bắt đầu lắng nghe các yêu cầu kết nối
Stop Dừng việc nghe
2.1.3. Lớ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.
Phương thức khởi tạo :

Tên 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 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

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 Mô tả
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.
SVTH: Trần Quốc Nhật Trung GVHD: Nguyễn Võ Quang Đông
11
Xây dựng chương trình Remote Desktop
2.2. Socket không đồng bộ

2.2.1. Mô 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
2.2.2. Sử 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
Bắt đầu yêu cầu Mô tả yêu cầu Kêt thúc yêu cầu
SVTH: Trần Quốc Nhật Trung GVHD: Nguyễn Võ Quang Đông
Event
Aplication
Button1
clicked
Window OS
class WindowSample
{
public WindowSample ()
{
.
.
Button button1 = new Button();
button1.Parent = this ;
button1.Click += new EventHandler
(ButtonClick)
.

.
.
}
Void ButtonClick (object ofj.EventArgs ea)
{
.
.
}
}
12
Xây dựng chương trình Remote Desktop
BeginAccept () Chấp nhận 1 kết nối đến EndAccept ()
BeginConnect () Để kết nối đến máy chủ từ
xa
EndConnect ()
BeginReceive () Lấy dữ liệu từ socket EndReceive ()
BeginReceiveFrom () Lấy dữ liệu từ máy chủ từ
xa cụ thể
EndReciveFrom()
BeginSend () Gửi dữ liệu từ socket EndSend ()
BeginSendTo () Gửi dữ liệu từ một máy chủ
từ xa cụ thể
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ứ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");
}
SVTH: Trần Quốc Nhật Trung GVHD: Nguyễn Võ Quang Đông
13
Xây dựng chương trình Remote Desktop
}
Để 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,
newAsyncCallback(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);
SVTH: Trần Quốc Nhật Trung GVHD: Nguyễn Võ Quang Đông
14
Xây dựng chương trình Remote Desktop
}
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,ref
iep,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);
}
2.3. Sử dụng Thread trong các ứng dụng mạng
2.3.1. Mộ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.
2.3.2. Sử dụng Thread trong chương trình .Net
Để sử dụng Thread trong .NET ta sử dụng namespace System.ThreadingMột số
phương thức thường dùng:
Tên Mô tả
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).
SVTH: Trần Quốc Nhật Trung GVHD: Nguyễn Võ Quang Đông
15
Xây dựng chương trình Remote Desktop
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:
Tên Mô tả
CurrentThread 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 Trả về giá trị của thread là một phần của
threadpool
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…)
Tạo một tuyến trong C#
……
Thread newThread=newThread(new ThreadStart(newMethod));
…….
}
void newMethod()
{
. . .
}

SVTH: Trần Quốc Nhật Trung GVHD: Nguyễn Võ Quang Đông
16
Xây dựng chương trình Remote Desktop
2.3.3. Sử dụng Threadpool trong các chương trình .Net
Phương thức Mô tả
BindHandle () Gắn kết với hệ điều hành để xử lý các
thread pool
GetAvailableThreads() Trả về số lượng chủ đề hiện có để sử dụng
trong các threadpool
GetMaxThreads () Trả về số lượng chủ đề lớn nhất hiện có
trong các threadpool
QueueUserWorkItem () Hàng đợi, người sử dụng chờ đợi một đối
tượng WaitHandle
UnsafeQueueUserWorkItem () Hàng đợi đợi một người dùng chưa xác
thực nhưng không truyền gọi stack đến các
thread pool.
UnsafeRegisterWaitForSingleObject
()
Đăng kí một đại diện không tin cậy chờ đợi
một đối tượng
SVTH: Trần Quốc Nhật Trung GVHD: Nguyễn Võ Quang Đông
17
Xây dựng chương trình Remote Desktop
CHƯƠNG 3: CHƯƠNG TRÌNH REMOTE DESKTOP
3.1. Giới thiệu giao thức Remote Desktop:
Giao thức Remote Desktop là kết nối cơ bản với giao diện đồ họa được thiết kế để tạo
điều kiện thuận lợi cho người sử dụng tương tác với một hệ máy tính từ xa bằng cách cập nhật
những thông tin đồ họa đến từ máy tính từ xa tới người sử dụng và đồng bộ thông tin quản lý
của người dùng tương tác đến máy tính ở xa, giống như đang ngồi tại chính máy đó.
Giao thức này cũng cung cấp một cơ chế cho phép đơn giản hóa việc truyền thông

chuyên dụng mở rộng giữa người sử dụng máy tính trực tiếp và những thành phần chạy trên
máy tính ở xa .
3.2. Cơ chế hoạt động của Remote Desktop:
3.2.1. Connection Initiation
Client thực hiện kết nối đến server bằng cách gửi gói tin yêu cầu kết nối PDU x.224.
Server phản hồi lại với gói xác nhận kết nối x.224. Từ điểm này tất cả các dữ liệu giữa client
và server sẽ được bao bọc trong gói x.224 PDU.
3.2.2. Basic Settings Exchange
Sự trao đổi cấu hình giữa client và server được thực hiện thông qua việc sử dụng kết
nối ban đầu MCS (MCS connect Initial) và gói phúc đáp MCS PDUs (MCS Connect
Reponse.) Một kết nối PDU ban đầu chứa yêu cầu kết nối thời gian thực GCC (GCC
Conference Create Request), trong khi một kết nối phúc đáp PDU chứa một phúc đáp kết nối
GCC (GCC Conference Create Response). Hai gói Điều khiển Hội nghị Chung “Generic
Conference Control” (GCC) này chứa đựng ghép nối những khối cấu hình cài đặtdữ liệu (dữ
liệu lõi, dữ liệu bảo mật và dữ liệu mạng…) nào được đọc bởi client và Server.
3.2.3. Channel ConnectionClient
Gửi một MCS Erect Domain Request PDU, tiếp theo là một MCS Attach User
Request PDU đính kèm danh tính người dùng chính với miền. Server phúc đáp bằng MCS
Attach User Response PDU với id kênh người phục vụ. client sẽ tiến hành kết nối vào kênh
người sử dụng, kênh nhập/xuất (I/O) và tất cả các kênh ảo (kênh nhập/xuất, IDs kênh ảo cố
định tồn tại từ dữ liệu nhúng trong gói GCC) và sử dụng tập hợp MCS Channel Join Request
PDUs. Server xác nhận lại mỗi kênh với MCS Channel Confirm PDU. (Client chỉ gửi gói
Channel Join Request sau khi đã nhận Channel Join Confirm PDU từ yêu cầu gửi trước
SVTH: Trần Quốc Nhật Trung GVHD: Nguyễn Võ Quang Đông
18
Xây dựng chương trình Remote Desktop
đó.)Từ điểm này, tất cả dữ liệu được gửi kế tiếp từ client đến server đều được đóng gói trong
MCS Send Data Request PDU, trong khi dữ liệu gửi đi từ server đến client được đóng gói
trong MCS Send Data Indication PDU. Đây là dữ liệu được đóng gói bởi Dữ liệu X.224 PDU.
3.2.4. RDP Sercurity Commencement

Nếu phương pháp tiêu chuẩn bảo mật RDP đang được sử dụng và mã hóa có hiệu lực
(điều này được xác định bằng cách kiểm tra các dữ liệu nhúng trong GCC Conference Create
Response packet) sau đó client gửi một Security Exchange PDU có chứa một mật mã 32-byte
ngẫu nhiên số đến Server. Con số này ngẫu nhiên được mã hóa với khóa công khai của máy
chủ (khóa công khai của máy chủ, cũng như tạo ra một máy chủ 32-byte số ngẫu nhiên, được
cả hai thu được từ các dữ liệu nhúng trong Hội nghị GCC gói Tạo đáp ứng). Các client và
server sau đó sử dụng hai 32-byte số ngẫu nhiên để tạo ra các phím phiên sử dụng để mã hóa
và xác nhận tính toàn vẹn của lưu lượng RDP tiếp theo. Từ điểm này, tất cả lưu lượng RDP
tiếp theo có thể được mã hóa và một tiêu đề an ninh được bao gồm với các dữ liệu nếu mã hóa
có hiệu lực (các Thông tin khách hàng và PDUs cấp Giấy phép có một ngoại lệ trong họ luôn
luôn có một tiêu đề an ninh). Các Header Security sau các X.224 và MCS Headers và cho biết
dù dữ liệu đính kèm được mã hóa. Ngay cả khi mã hóa có hiệu lực máy chủ đến lưu lượng
khách hàng có thể không phải luôn luôn được mã hóa, trong khi khách hàng đến máy chủ lưu
lượng truy cập sẽ luôn luôn được mã hóa bởi Microsoft RDP triển khai (mã hóa của PDUs
cấp phép là tùy chọn).
3.2.5. Secure Settings Exchange:
(Sự Trao đổi những thiết đặt An toàn): An toàn dữ liệu máy client (như là username,
mật khẩu, auto-reconnect cookie) là gửi đến server sử dụng Client Info PDU.
3.2.6. Licensing:
Mục đích của việc trao đổi cấp phép để đồng bộ chung một giấy phép từ server đến
client. Client cần lưu trữ giấy phép này và thông qua những kết nối đó gửi giấy phép đến
server xác thực.Tuy nhiên, trong một só trường hợp client không được cấp giấy phép đến nơi
lưu trữ. Trên thực tế, những gói được trao đổi trong thời gian pha này của giao thức phụ thuộc
cơ chế cấp phép từ server.
3.2.7. Capabilities Negotiation:
Server gửi tập hợp những khả năng mà nó hỗ trợ đến client trong một Demand Active
PDU. Client trả lời với những khả năng có thể bằng cách gửi gói Confirm Active PDU.3.2.8.
SVTH: Trần Quốc Nhật Trung GVHD: Nguyễn Võ Quang Đông
19
Xây dựng chương trình Remote Desktop

3.2.8. Connection Finalization:
Client và server gửi PDU xuyên suốt quá trình kết nối. PDU từ client tới server và từ
server tới client được trao đổi trong suốt pha truyền .Sau khi client nhận Font Map PDU nó có
thể bắt đầu điều khiển chuột và phím đến server, nó tiến hành tương tác với Remote computer
với giao diện đồ họa.
3.3.Chương trình:
3.3.1. Yêu cầu bài toán:
Dựa trên nên tảng giao thức Remote Desktop có sẵn, tiến hành xây dựng mô hình
Client-Server hỗ trợ các tính năng cơ bản tương tác với máy tính từ xa như tắt máy, khởi động
lại máy, ngủ đông, khóa máy, chạy một số ứng dụng, gửi thông điệp … sử dụng ngôn ngữ lập
trình C#.
3.3.2. Giao diện chương trình:
 Chương trình server:
SVTH: Trần Quốc Nhật Trung GVHD: Nguyễn Võ Quang Đông
20
Xây dựng chương trình Remote Desktop
 Chương trình Client:
- Nhập ip và port để kết nối đến server :
Tiếp quản chuột và bàn phím để điều khiển:
SVTH: Trần Quốc Nhật Trung GVHD: Nguyễn Võ Quang Đông
21
Xây dựng chương trình Remote Desktop
Màn hình điều khiển :
3.3.3. Code chương trình:
 Code chương trình server :
• Lắng nghe kết nối trên cổng 1338:
public void startListening() {
try {
listener = new TcpListener(port);
listener.Start();

mainSocket = listener.AcceptSocket();
s = new NetworkStream(mainSocket);
eventWatcher
= new Thread(new ThreadStart(waitForKeys));
eventWatcher.Start();
while(true) {
Bitmap screeny
= new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen
.Bounds.Height, PixelFormat.Format32bppArgb);
Graphics theShot = Graphics.FromImage(screeny);
theShot.ScaleTransform(.25F, .25F);
theShot.CopyFromScreen(Screen.PrimaryScreen.Boun
ds.X, Screen.PrimaryScreen.Bounds.Y,0, 0, Screen.PrimaryScreen.Bound
s.Size, CopyPixelOperation.SourceCopy);
BinaryFormatter bFormat = new BinaryFormatter();
bFormat.Serialize(s, screeny);
Thread.Sleep(imageDelay);
theShot.Dispose();
SVTH: Trần Quốc Nhật Trung GVHD: Nguyễn Võ Quang Đông
22
Xây dựng chương trình Remote Desktop
screeny.Dispose();
}
}
catch(Exception) {
if(mainSocket.IsBound)
mainSocket.Close();
if(listener != null)
listener.Stop();


}
}
• Đợi để nhận dữ liệu và các lệnh từ client:
private void waitForKeys()
{
try
{
String temp = "";
StreamReader reader = new StreamReader(s);
do
{
temp = reader.ReadLine();
if (temp.StartsWith("CDELAY"))
{
imageDelay
= int.Parse(temp.Substring(6 , temp.Length - 6));
}
else if (temp.StartsWith("LCLICK"))
{
mouse_event(MOUSE_LEFTDOWN | MOUSE_LEFTUP
, Cursor.Position.X, Cursor.Position.Y, 0, 0);
}
else if (temp.StartsWith("RCLICK"))
{
mouse_event(MOUSE_RIGHTDOWN | MOUSE_RIGHT
UP, Cursor.Position.X, Cursor.Position.Y, 0, 0);
}

else if (temp.StartsWith("SHUTDOWN"))
{

mainSocket.Close();
listener.Stop();
Environment.Exit(0);
}
else if (temp.StartsWith("LDOWN"))
{
mouse_event(MOUSE_LEFTDOWN, Cursor.Positi
on.X, Cursor.Position.Y, 0, 0);
}
else if (temp.StartsWith("LUP"))
{
mouse_event(MOUSE_LEFTUP, Cursor.Position
SVTH: Trần Quốc Nhật Trung GVHD: Nguyễn Võ Quang Đông
23
Xây dựng chương trình Remote Desktop
.X, Cursor.Position.Y, 0, 0);
}
else if (temp.StartsWith("RDOWN"))
{
mouse_event(MOUSE_RIGHTDOWN, Cursor.Posit
ion.X, Cursor.Position.Y, 0, 0);
}
else if (temp.StartsWith("RUP"))
{
mouse_event(MOUSE_RIGHTUP, Cursor.Positio
n.X, Cursor.Position.Y, 0, 0);
}

else if (temp.StartsWith("M"))
{

int xPos = 0, yPos = 0;
try
{
xPos
= int.Parse(temp.Substring(1, temp.IndexOf(' ')));
yPos
= int.Parse(temp.Substring(temp.IndexOf('
'), temp.Length - temp.IndexOf(' ')));
Cursor.Position
= new Point(xPos, yPos);
continue;
}
catch (Exception)
{

}
}

else
{
SendKeys.SendWait(temp);
}
}
while (temp != null);
}
catch (Exception)
{

}
}

SVTH: Trần Quốc Nhật Trung GVHD: Nguyễn Võ Quang Đông
24
Xây dựng chương trình Remote Desktop
 Code chương trình client:
• Kết nối đến server thông qua địa chỉ ip và port:
private void startConnect()
{
try
{
connector
= new TcpClient(ipAddress.Text.ToString(), int.Parse(port.Te
xt.ToString()));

mouseAndKeyboard.Enabled = true;
mouseAndKeyboard.Show();
this.Height = 283;
client = new Form2(connector,this);
client.Show();
}
catch (Exception problem)
{
MessageBox.Show("Địa chỉ ip không hợp lệ,
Cổng không hợp lệ, Lỗi kết nối internet, hoặc không kết nối
đến client được vì một số lý do; \n Kiểm tra dữ liệu đã nhập
\n**************************************************\n" + pr
oblem.ToString(), "Bạn đã kết nối thất bại !");
showConnect();
}
}
private void showConnect()

{
ipAddress.ReadOnly = false;
port.ReadOnly = false;
disconnectButton.Hide();
disconnectButton.Enabled = false;
connectButton.Show();
connectButton.Enabled = true;

mouseAndKeyboard.Enabled = false;
mouseAndKeyboard.Hide();
mouseAndKeyboard.ForeColor = Color.Blue;
mouseAndKeyboard.Text = "Tiếp quản chuột và bàn
phím";


this.Width = 202;
this.Height = 124;
}
SVTH: Trần Quốc Nhật Trung GVHD: Nguyễn Võ Quang Đông
25

×