Đồ án lập trình mạng : xây dựng chương trình remore desktop- ứng dụng socket.java. ngôn ngữ C# .lập trình ứng dụng mạng.
Trang 1TRƯỜNG ĐẠI HỌC BÁCH KHOA KHOA CÔNG NGHỆ THÔNG TIN
ĐỒ ÁN LẬP TRÌNH MẠNG
ĐỀ TÀI : XÂY DỰNG CHƯƠNG TRÌNH REMOTE DESKTOP
Lớp : 12TLT.CNTT
GVHD : Nguyễn Võ Quang Đông
Đà Nẵng – Tháng 12/2013
Trang 2MỤC LỤC
MỤC LỤC 1
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
1.1.Giới thiệu về ngôn ngữ C#: 5
1.2 Kiến trúc Net 6
1.3.Ngôn ngữ C# 8
Chương II: Giới thiệu lập trình mạng trong Net Framework 9
2.1 Sử dụng các lớp hỗ trợ được xây dựng từ lớp Socket 9
2.1.1 Lớp TCPClient 9
2.1.2 Lớp TCPListener 10
2.1.3 Lớp UDPClient 11
2.2 Socket không đồng bộ 12
2.2.1 Mô hình xử lý sự kiện của Windows 12
2.2.2 Sử dụng Socket không đồng bộ 13
2.3 Sử dụng Thread trong các ứng dụng mạng 15
2.3.1 Một số khái niệm 15
2.3.2 Sử dụng Thread trong chương trình Net 16
2.3.3 Sử dụng Threadpool trong các chương trình Net 17
CHƯƠNG 3: CHƯƠNG TRÌNH REMOTE DESKTOP 18
3.1 Giới thiệu giao thức Remote Desktop: 18
3.2 Cơ chế hoạt động của Remote Desktop: 18
3.2.1 Connection Initiation 18
3.2.2 Basic Settings Exchange 18
3.2.3 Channel ConnectionClient 18
3.2.4 RDP Sercurity Commencement 19
3.2.5 Secure Settings Exchange: 19
3.2.6 Licensing: 19
3.2.7 Capabilities Negotiation: 19
3.2.8 Connection Finalization: 20
3.3.Chương trình: 20
3.3.1 Yêu cầu bài toán: 20
3.3.2 Giao diện chương trình: 20
3.3.3 Code chương trình: 22
Trang 3KÊT LUẬN 32
Kết quả đạt được: 32
TÀI LIỆU THAM KHẢO 33
Tài liệu: 33
Trang 4LỜ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ểmsong 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ínhxá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ớicô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 nhaucủa các ngôn ngữ, và được định nghĩa trong FCL (framework class library) Hỗ trợ cho lậptrì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 Remotedesktop đượ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ácvớ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ố ứngdụ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#
Trang 5LỜ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áchKhoa Đà 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ếnthứ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ệnTrần Quốc Nhật Trung
Trang 6Chươ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ệctổ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 classlibrary)
Microsoft .Net bao gồm 2 phần chính: Framework và Intergrated DevelopmentEnviroment (IDE) Framework cung cấp những gì cần thiết và căn bản, là khuôn dạng haymô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 ứngdụ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ônngữ 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ăngcủ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áttriể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à BizTalkServer, 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
Trang 7 Các phần mềm client như Windows XP và Windows CE giúp người phát triển phânphố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ụ WebXML,ứ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 trongmô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ênInternet, 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ầnmềm và sự tranh chấp về phiên bản
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)
Trang 8Để 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ệncá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ềukiể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ụngdự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ìnhdự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êndesktop 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ụngclient 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 tronglĩ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àythường sử dụng những cửa sổ, menu, toolbar, button hay các thành phần GUI khác, và chúngthườ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 webtrê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ậptà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áccử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
1.3.Ngôn ngữ C#
Trang 9Ngô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ệmlậ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ậptrì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ĩanhữ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 đốitượ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ầnkhai 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 tinheader 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 chophép lưu trữ metadata với mã nguồn cho một lớp
Trang 10Chươ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ảithiế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
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ôngtin 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à địachỉ IP chuẩ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 để đọcClient Trả về socket ứng với TCPClient hiện hànhConnected Trạng thái cho biết đã kết nối được đến
server hay chưa ?
Trang 11GetStream Trả về NetworkStream để từ đó giúp ta gửi
hay nhận dữ liệu (thường làm tham số khitạ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 quacá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ụngserver.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
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:
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 đếnkhi 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
Trang 12không? ( True = có).
Start Bắt đầu lắng nghe các yêu cầu kết nối
2.1.3 Lớp UDPClient
Giao thức UDP (user datagram protocol hay user define protocol) là một giao thức phikế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ẵnsà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ềumá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 :
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,
AddressFamilyUdpClient (String, Int32) Tạo một UdpClient và thiết lập với một
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ênEndSend Kết thúc việc gửi dữ liệu không đồng bộ ở
trênReceive Nhận dữ liệu (đồng bộ) do máy tính ở xa
gửiSend Gửi dữ liệu (đồng bộ) cho máy ở xa
Trang 132.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
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
public WindowSample () {
Button button1 = new Button();
button1.Parent = this ; button1.Click += new EventHandler (ButtonClick)
} Void ButtonClick (object ofj.EventArgs ea) {
} }
Trang 14BeginAccept () 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, objectstate)
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);
Trong đó phương thức Connected thường được viết như sau:
public static void Connected(IAsyncResult iar) {
Socket sock = (Socket)iar.AsyncState;
Trang 15Để 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, intsize, SocketFlags sockflag, AsyncCallback callback, objectstate)
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.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ônghướ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,intsize,SocketFlags sockflag, EndPoint ep, AsyncCallbackcallback, 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);
Trang 16Nhậ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);
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ựchiệ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à 1tuyến (Thread) Trong 1 ứng dụng Thread khởi tạo đầu tiên gọi là Thread sơ cấp hay Threadchí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:
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âulệnh đứng sau Join)
Trang 17Resume () Tiếp tục chạy thread đã tạm ngừng –
suspendedSleep () 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ủathread chuyển từ trạng thái hiện hành sangRunning
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:
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
threadpoolPriority Sets or gets giá trị để chỉ định độ ưu tiên
( dành nhiều hay ít CPU cho thread) Caonhấ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#