1. Trang chủ
  2. » Thể loại khác

Luận văn tìm hiểu ngôn ngữ lập trình c sharp và viết ứng dụng chat trong mạng LAN

34 10 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

Tiêu đề Tìm hiểu ngôn ngữ lập trình C Sharp và viết ứng dụng Chat trong mạng LAN
Người hướng dẫn Thạc Sĩ Đỗ Văn Chiểu
Trường học Trường Đại học dân lập Hải Phòng
Chuyên ngành Công nghệ thông tin
Thể loại luận văn
Năm xuất bản 2014
Thành phố Hải Phòng
Định dạng
Số trang 34
Dung lượng 0,94 MB

Cấu trúc

  • 1.1. Lời nói đầu (3)
  • 1.2. Mạng nội bộ - LAN (Local Area Netword) (3)
  • 1.3. Mô hình Client – Server (4)
  • Chương 2 Tìm hiểu về C# (7)
    • 2.1. Tổng quan về C# (7)
    • 2.2. Các thành phần cơ bản (7)
    • 2.3. Cấu trúc một chương trình C# (13)
    • 2.4. Lập trình mạng với C# (13)
    • 2.5. Lập trình với C# Socket helper classes (17)
    • 2.6. Lập trình với thread (20)
  • Chương 3. Phân tích và thiết kế chương trình (23)
    • 3.1. Cấu trúc chung của chương trình (23)
    • 3.2. Phân tích và thiết kế (24)
      • 3.2.1 Viết ứng dụng Client (ChatNDraw) (24)
      • 3.2.2 Viết ứng dụng Server (PrismServerAdmin) (27)
  • Chương 4. Chương trình thực nghiệm (30)
    • 4.1. Giao diện chương trình Server (30)
    • 4.2. Giao diện chương trình Client (31)
  • Chương 5. Tổng kết và hướng phát triển của đồ án (33)
    • 5.1 Những kết quả đạt được (33)
    • 5.2 Những vấn đề tồn tại (33)
    • 5.3 Hướng phát triển của đồ án (33)
    • 5.4 Tài liệu Tham khảo (33)

Nội dung

Mạng nội bộ - LAN (Local Area Netword)

Mạng nội bộ là tập hợp các máy tính và thiết bị công nghệ thông tin được kết nối trong một khu vực địa lý hạn chế, chẳng hạn như tòa nhà, văn phòng, hoặc khuôn viên trường đại học Những đặc điểm nổi bật của mạng nội bộ bao gồm khả năng chia sẻ tài nguyên, quản lý dữ liệu hiệu quả và cung cấp kết nối nhanh chóng giữa các thiết bị.

- Băng thông lớn có khả năng chạy các ứng dụng trực tuyến như xem phim, hội thảo qua mạng

- Phạm vi bị giới hạn bởi các thiết bị

- Chi phí các thiết bị triển khai mạng tương đối rẻ

Mạng LAN ngày càng trở nên phổ biến vì cho phép người dùng chia sẻ tài nguyên quan trọng như máy in, ổ đĩa CD-ROM và phần mềm ứng dụng Đối với các công ty lớn, việc mở rộng quy mô hệ thống mạng là rất cần thiết, nhằm đảm bảo việc trao đổi thông tin diễn ra nhanh chóng, hiệu quả và tiết kiệm chi phí.

Mô hình Client – Server

Thuật ngữ server đề cập đến các chương trình thực hiện dịch vụ trên mạng, chấp nhận và xử lý yêu cầu từ các client Client gửi yêu cầu đến server và chờ phản hồi thông qua giao tiếp IPC (Interprocess Communication) Để giao tiếp, client và server cần tuân theo một giao thức, mà client phải tuân thủ để lấy thông tin từ server Mặc dù có thể tạo giao thức riêng, thường thì điều này chỉ khả thi ở tầng ứng dụng Nhiều giao thức chuẩn như TCP/IP, SNA của IBM, OSI, ISDN, và X.25 đã được phát triển để đáp ứng nhu cầu mạng hiện nay Máy chứa chương trình server được gọi là máy chủ, trong khi máy chứa chương trình client được gọi là máy tớ Mô hình client/server cho phép các máy tính giao tiếp hiệu quả hơn, mở rộng khả năng truyền thông liên tiến trình trên các máy tính cá nhân.

Mô hình client-server là chuẩn mực cho các ứng dụng trên mạng, trong đó máy tính hoạt động như client có nhu cầu dịch vụ, trong khi máy tính khác đóng vai trò server có khả năng đáp ứng các yêu cầu đó Khái niệm client-server mang tính tương đối, cho phép một máy tính có thể vừa là client vừa là server tùy thuộc vào tình huống Thông thường, client là máy tính cá nhân, trong khi server là những máy tính cấu hình mạnh, chứa cơ sở dữ liệu và ứng dụng để phục vụ nhu cầu của client.

Mô hình client-server hoạt động với một tiến trình trên server luôn chờ yêu cầu từ các tiến trình client, có thể nằm trên cùng hệ thống hoặc trên các hệ thống khác qua mạng Tiến trình client thường được khởi tạo từ lệnh của người dùng, gửi yêu cầu đến server để nhận các dịch vụ Server sẽ xác định tính hợp lệ của yêu cầu từ client, phục vụ và trả kết quả, sau đó tiếp tục chờ yêu cầu mới Các dịch vụ mà server cung cấp bao gồm dịch vụ thời gian, dịch vụ in ấn, dịch vụ file, và thực thi các lệnh từ client.

Tìm hiểu về C#

Tổng quan về C#

C# là ngôn ngữ lập trình hướng đối tượng, tích hợp đầy đủ các đặc tính của các ngôn ngữ trước đó như C++ và Java Được phát triển cho nền tảng Net framework, C# mang lại tiềm năng lớn trong việc xây dựng các ứng dụng hệ thống và mạng internet.

C# là một trình biên dịch hướng Net, nghĩa là tất cả các mã của C# luôn luôn chạy trên môi trường Net Framework C# là một ngôn ngữ lập tình mới:

- Nó được thiết kế riêng để dùng cho Microsoft’s Net Framework ( Một nền khá mạnh cho sự phát triển, triển khai, thực hiện và phân phối các ứng dụng )

- Nó là một ngôn ngữ hoàn toàn hướng đối tượng được thiết kế dựa trên kinh nghiệm của các ngôn ngữ hướng đối tượng khác

C# là một ngôn ngữ lập trình độc lập, được thiết kế để tạo mã đích trong môi trường NET Mặc dù C# không phải là một phần của NET, nhưng nó có những đặc trưng riêng mà NET không hỗ trợ, cũng như một số tính năng của NET không được C# hỗ trợ.

Các thành phần cơ bản

+) Một biến dùng để lưu trữ giá trị mang một kiểu dữ liệu nào đó Cú pháp C# sau đây để khai báo một biến :

Trong lập trình, modifier như public, private, protected xác định quyền truy cập, trong khi datatype như int, long, float chỉ định kiểu dữ liệu Identifier là tên biến, và để tạo một biến, chúng ta cần khai báo kiểu dữ liệu và gán cho biến một tên duy nhất Biến có thể được khởi tạo giá trị ngay khi khai báo hoặc gán giá trị mới bất cứ lúc nào trong chương trình.

Hằng là một biến đặc biệt với giá trị không thay đổi trong suốt chương trình Mặc dù biến là công cụ mạnh mẽ, việc làm việc với hằng yêu cầu chúng ta phải bảo đảm rằng giá trị của nó luôn được giữ nguyên và không bị thay đổi.

2.2.3 Định danh Định danh là tên mà người lập trình chỉ định cho các kiểu dữ liệu, các phương thức, biến, hằng, hay đối tượng Một định danh phải bắt đầu với một ký tự chữ cái hay dấu gạch dưới,các ký tự còn lại phải là ký tự chữ cái, chữ số, dấu gạch dưới.Theo qui ước đặt tên của Microsoft thì đề nghị sử dụng cú pháp lạc đà (camel notation) bắtđầu bằng ký tự thường để đặt tên cho các biến là cú pháp Pascal (Pascal notation) với ký tự đầu tiên hoa cho cách đặt tên hàm và hầu hết các định danh còn lại

Trong C#, các định danh không được trùng với các từ khóa đã được định nghĩa, vì vậy bạn không thể tạo biến với tên giống như class hay int Hơn nữa, C# phân biệt giữa ký tự thường và ký tự hoa, do đó hai biến bienNguyen và bienguyen được coi là khác nhau hoàn toàn.

C# là một ngôn ngữ lập trình mạnh mẽ với hệ thống kiểu dữ liệu chặt chẽ, yêu cầu lập trình viên khai báo kiểu của từng đối tượng như số nguyên, số thực, chuỗi, và kiểu điều khiển Điều này giúp trình biên dịch phát hiện và ngăn chặn lỗi bằng cách chỉ cho phép gán các kiểu dữ liệu tương thích với nhau Kiểu dữ liệu của một đối tượng không chỉ xác định tính hợp lệ mà còn cung cấp thông tin cho trình biên dịch về kích thước của đối tượng đó.

C# chia thành hai loại kiểu dữ liệu chính: kiểu xây dựng sẵn (built-in) do ngôn ngữ cung cấp và kiểu do người dùng định nghĩa (user-defined) do lập trình viên tạo ra Hai loại này được phân thành dữ liệu kiểu trị và kiểu tham chiếu.

Nghĩa là trên một chương trình C# dữ liệu được lưu trữ một hoặc hai nơi tuỳ theo đặc thù của kiểu dữ liệu

Sự phân chia giữa kiểu dữ liệu giá trị và kiểu dữ liệu tham chiếu trong bộ nhớ là do cách lưu trữ khác nhau Kiểu dữ liệu giá trị được lưu giữ với kích thước thực trong bộ nhớ stack, trong khi địa chỉ của kiểu dữ liệu tham chiếu được lưu trong stack, còn đối tượng thực sự thì nằm trong bộ nhớ heap.

C# hỗ trợ kiểu con trỏ giống như C++, nhưng ít được sử dụng và chỉ áp dụng khi làm việc với mã unmanaged, tức là mã được tạo ra bên ngoài môi trường NET, chẳng hạn như các đối tượng COM.

Kiểu giá trị được định nghĩa trước (Predefined Value Types)

Kiểu dữ liệu bẩm sinh (The built-in value types) trình bày ban đầu như integer và floating-point numbers, character, và Boolean types

- Câu lệnh điều kiện if :

Cú pháp như sau: if (biểu thức điều kiện)

]

Các câu lệnh if nằm lồng rất khó đọc, khó gỡ rối Khi bạn có một loạt lựa chọn phức tạp thì nên sử dụng câu lệnh switch

Cú pháp nhƣ sau: switch (biểu thức) { casce biểu thức ràng buộc: câu lệnh câu lệnh nhảy [default: câu lệnh mặc định]

C# cung cấp bốn loại vòng lặp: for, while, do while và foreach, giúp lập trình viên thực hiện các đoạn mã lặp lại cho đến khi điều kiện lặp được thỏa mãn.

- Vòng lặp for: cú pháp: for ([ phần khởi tạo] ; [biểu thức điều kiện]; [bước lặp])

- Vòng lặp while (The while Loop)

Cú pháp như sau : while (Biểu thức)

- Vòng lặp do while (The do…while Loop) do

while ( điều kiện )

-Vòng lặp foreach (The foreach Loop)

Vòng lặp foreach cho phép lặp qua các tập hợp hoặc mảng, là một câu lệnh lặp mới không có trong ngôn ngữ C/C++ Cú pháp chung của câu lệnh foreach như sau:

Cú pháp như sau: foreach ( in < tên tập hợp>)

Ta dùng câu lệnh break khi muốn ngưng ngang xương việc thi hành và thoát khỏi vòng lặp

Câu lệnh continue trong lập trình được sử dụng trong vòng lặp để khởi động lại vòng lặp mà không thực hiện các lệnh còn lại trong thân vòng lặp tại một thời điểm nhất định.

Câu lệnh return trong lập trình được sử dụng để thoát khỏi một hàm trong một lớp, đồng thời trả quyền điều khiển về phía hàm gọi Nếu hàm có kiểu dữ liệu trả về, câu lệnh return phải trả về đúng kiểu dữ liệu đó; nếu không, câu lệnh có thể được sử dụng mà không cần biểu thức.

+ Các phép toán số học :+ , - , * , / , % ;

+ Các phép toán tăng giảm: ++ , ;

+ Các phép toán quan hệ : ==,!= , < , > , =;

Lớp là một cấu trúc quan trọng để tạo ra các đối tượng, mỗi đối tượng bao gồm dữ liệu và các phương thức để truy cập dữ liệu đó Lớp xác định các thuộc tính và hàm mà mỗi thể hiện của lớp có thể sở hữu.

Hàm thành phần (Function Members):

Bao gồm các thuộc tính và các phương thức Chúng ta sử dụng các từ khoá sau để bổ nghĩa cho một phương thức :

Trong lập trình, có nhiều cách để ẩn phương thức kế thừa với các mức độ truy cập khác nhau Phương thức `public` cho phép truy cập từ bất kỳ đâu, trong khi phương thức `protected` chỉ có thể được truy xuất từ lớp hiện tại hoặc lớp dẫn xuất Phương thức `internal` cho phép truy cập trong cùng một assembly, và phương thức `private` chỉ có thể được truy cập từ bên trong lớp mà nó thuộc về.

Phương thức static không thể được ghi đè trong một lớp cụ thể, trong khi phương thức virtual có thể bị ghi đè bởi lớp dẫn xuất Phương thức abstract yêu cầu lớp dẫn xuất phải ghi đè, và phương thức override cho phép ghi đè một phương thức ảo đã được kế thừa hoặc trừu tượng Phương thức sealed ghi đè một phương thức ảo kế thừa nhưng không cho phép ghi đè từ các lớp kế thừa tiếp theo Cuối cùng, phương thức extern được thực thi từ bên ngoài, thường là từ một ngôn ngữ lập trình khác.

Cấu trúc một chương trình C#

Một chương trình C# bao gồm các thành phần như sơ đồ dưới đây:

- Các tệp *.cs là các tệp chứa mã nguồn của một chương trình C#

Mỗi tệp *.cs chứa các namespace, và nếu không có namespace nào được chỉ định, trình biên dịch sẽ tự động cung cấp một namespace mặc định Bên trong mỗi namespace, có thể bao gồm các cấu trúc (structs), giao diện (interfaces) và các khai báo hằng (enums).

- Trong mỗi namespace, là phần mô tả các lớp đối tượng có trong chương trình

Lập trình mạng với C#

C# là một ngôn ngữ lập trình mạnh mẽ cho phát triển ứng dụng mạng, với nhiều lớp đối tượng tích hợp sẵn như socket và TCPListener, giúp đơn giản hóa quá trình lập trình mạng.

Lập trình mạng với socket

Sau đây là những thành phần hỗ trợ lập trình Socket trong C#:

Đối tượng IPAddress đại diện cho một địa chỉ IP đơn, cho phép sử dụng giá trị này trong nhiều phương thức của socket để thể hiện địa chỉ IP Constructor mặc định của lớp này được định nghĩa là: public IPAddress(long address).

Constructor mặc định sẽ nhận giá trị long và chuyển đổi thành địa chỉ IP, nhưng trong thực tế, phương thức này hiếm khi được sử dụng.

Việc lập trình địa chỉ IP thành một số long là một thách thức đối với các lập trình viên Thay vào đó, có nhiều phương thức khác của IPAddress được sử dụng phổ biến để tạo và lưu trữ các địa chỉ IP.

Equals Compares two IP addresses

GetHashCode Returns a hash value for an IPAddress object

GetType Returns the type of the IP address instance

HostToNetworkOrder Converts an IP address from host byte order to network byte order

IsLoopBack Indicates whether the IP address is considered the loopback address

NetworkToHostOrder Converts an IP address from network byte order to host byte order Parse Converts a string to an IPAddress instance

ToString Converts an IPAddress to a string representation of the dotted decimal format of the IP address

Phương thức Parse() thường được sử dụng để tạo những thực thể của IPAddress:

IPAddress newaddress = IPAddress.Parse("192.168.1.1"); Định dạng này cho phép bạn chuyển đổi một chuỗi thể hiện địa chỉ IP theo cách viết thông dụng thành một đối tượng IPAddress

Lớp IPAddress cũng cung cấp 4 thuộc tính chỉ đọc để trình bày các địa chỉ IP đặc biệt được sử dụng trong chương trình:

Any : Sử dụng để trình bày bất kỳ địa chỉ IP nào có trên hệ thống cục bộ

Broadcast : Sử dụng để trình bày địa chỉ broadcast trong LAN

Loopback : Sử dụng để trình bày địa chỉ loopback trên hệ thống cục bộ

None : Sử dụng để thể hiện không có giao diện mạng trong hệ thống

.NET Framework sử dụng đối tượng IPEndPoint để đại diện cho một cặp địa chỉ IP và cổng (TCP hoặc UDP) Đối tượng IPEndPoint rất hữu ích trong việc kết nối các socket tới địa chỉ cục bộ hoặc khi thiết lập kết nối tới một địa chỉ từ xa.

Hai constructors được sử dụng để tạo thực thể IPEndPoint:

IPEndPoint(long address, int port)

IPEndPoint(IPAddress address, int port)

Cả hai hàm khởi tạo sử dụng hai tham số: một địa chỉ IP, có thể là giá trị long hoặc đối tượng IPAddress, và một số hiệu cổng.

Create Creates an EndPoint object from a SocketAddress object

Equals Compares two IPEndPoint objects

GetHashCode Returns a hash value for an IPEndPoint object

GetType Returns the type of the IPEndPoint instance

Serialize Creates a SocketAddress instance of the IPEndPoint instance

ToString Creates a string representation of the IPEndPoint instance

Lớp SocketAddress trong namespace System.Net là một lớp đặc biệt, đại diện cho một biến thể của đối tượng IPEndPoint Nó cho phép lưu trữ một thực thể IPEndPoint và tái tạo lại đối tượng này thông qua phương thức Create().

1 byte trình bày AddressFamily của đối tượng

1 byte thể hiện kích thước của đối tượng

2 bytes là số hiệu cổng của đối tượng

Những byte còn lại lưu trữ địa chỉ IP của đối tượng

Ngoài các phương thức, lớp IPEndPoint còn bao gồm 3 thuộc tính có thể đọc/ghi từ một thực thể:

Address Gets or sets the IP address property

AddressFamily Gets the IP address family

Port Gets or sets the TCP or UDP port number

Các thuộc tính của IPEndPoint cho phép truy cập thông tin về các thành phần riêng lẻ của đối tượng, bao gồm địa chỉ và cổng Ngoài ra, chúng cũng có thể được sử dụng để thiết lập các giá trị cụ thể cho một IPEndPoint đã tồn tại.

MaxPort Giá trị cổng lớn nhất có thể chấp nhận được

MinPort Giá trị cổng nhỏ nhất có thể chấp nhận được

Namespace System.Net.Sockets bao gồm những lớp cung cấp giao diện thực tới các hàm Winsock APIs ở mức thấp

Hạt nhân của namespace System.Net.Sockets là lớp Socket Nó cung cấp cho trình quản lý C# đoạn mã thực thi của Winsock API Constructor của lớp Socket là:

The basic format of the Socket constructor, Socket(AddressFamily af, SocketType st, ProtocolType pt), is similar to that of Unix sockets It utilizes three parameters to define the type of socket to be created.

AddressFamily để định nghĩa kiểu mạng

SocketType để định nghĩa kiểu dữ liệu của kết nối

ProtocolType định nghĩa giao thức mạng

Mỗi tham số trên có thể được sử dụng bằng các hằng được mô tả trong bảng dưới

Stream Tcp Connection-oriented communication

Raw Icmp Internet Control Message Protocol

Raw Raw Plain IP packet communication

Sử dụng những giá trị hằng giúp người lập trình dễ nhớ tất cả các tùy chọn, ví dụ:

Socket newsock = Socket(AddressFamily.InterNetwork,

Một số thuộc tính của lớp Socket cho phép truy xuất thông tin từ một đối tượng Socket đã được khởi tạo Các thuộc tính này được liệt kê và mô tả trong bảng dưới đây.

AddressFamily Gets the address family of the Socket

Available Gets the amount of data that is ready to be read

Blocking Gets or sets whether the Socket is in blocking mode

Connected Gets a value that indicates if the Socket is connected to a remote device Handle Gets the operating system handle for the Socket

LocalEndPoint Gets the local EndPoint object for the Socket

ProtocolType Gets the protocol type of the Socket

RemoteEndPoint Gets the remote EndPoint information for the Socket

SocketType Gets the type of the Socket

Lập trình với C# Socket helper classes

.NET Framework cung cấp giao diện socket và một giao diện đơn giản, giúp lập trình mạng trở nên dễ dàng hơn Để lập trình với giao diện này, có ba lớp đối tượng chính được sử dụng.

Mỗi lớp trong chương trình được thiết kế để hỗ trợ một socket đặc biệt, giúp đơn giản hóa giao diện lập trình cho các chức năng cụ thể Lớp TcpClient và TcpListener được sử dụng để phát triển các ứng dụng TCP client và server, trong khi lớp UDP được sử dụng để tạo ra các ứng dụng UDP.

TCP là giao thức kết nối đáng tin cậy cho phép hai máy tính giao tiếp qua mạng Để thiết lập kết nối TCP, một máy tính đóng vai trò server và lắng nghe trên một endpoint cụ thể, bao gồm địa chỉ IP và số port Máy tính còn lại là client, gửi yêu cầu kết nối đến endpoint mà server đang lắng nghe Khi kết nối được thiết lập, cả hai máy tính có thể trao đổi thông điệp thông qua System.Net.Sockets.NetworkStream, cho phép gửi bất kỳ kiểu dữ liệu nào bằng cách ghi vào NetworkStream.

Những phương thức của lớp Tcpclient được sử dụng để tạo ra những chương trình network client theo mô hình hướng kết nối

+Sử dụng phương thức Connect()

+Kết nối trực tiếp không cần sử dụng phương thức Connect()

Phương thức getStream() tạo ra một đối tượng NetworkStream, cho phép gửi và nhận byte qua socket Khi sở hữu một NetworkStream cho socket, bạn có thể sử dụng các phương thức Read() và Write() để di chuyển dữ liệu vào và ra một cách hiệu quả.

Lớp TcpClient là một socket client dành cho chương trình Client, trong khi lớp TcpListener được sử dụng cho chương trình server (socket server) Các constructor của lớp này cũng rất đơn giản, với ba kiểu constructor khác nhau.

 TcpListener(int port) nối kết với một cổng cục bộ

 TcpListener(IPEndPoint ie) kết nối với một EndPoint cục bộ

 TcpListener(IPAddress addr,int port) kết nối tới một IPAddress và cổng cục bộ

Khuôn dạng này cho phép tạo ra các đối tượng TcpListener, và sau khi đối tượng được khởi tạo, bạn có thể bắt đầu lắng nghe các kết nối mới bằng phương thức Start().

Sau khi khởi động phương thức Start(), bạn cần sử dụng phương thức AcceptSocket() hoặc AcceptTcpClient() để chấp nhận yêu cầu kết nối từ Client Hai phương thức này cho phép thiết lập kết nối và trả về một đối tượng Socket hoặc TcpClient Với sự tiện lợi của lớp TcpListener, hầu hết người dùng sẽ chọn phương thức AcceptTcpClient() để tạo đối tượng TcpClient mới cho kết nối mới.

Khi một đối tượng TcpClient mới được khởi tạo cho kết nối, bạn có thể sử dụng các phương thức chuẩn của TcpClient để bắt đầu giao tiếp với client.

Lớp UdpClient cung cấp một giao diện đơn giản cho các socket UDP, phù hợp cho những ứng dụng yêu cầu socket không hướng nối UDP là một giao thức không kết nối, khác với mô hình client-server truyền thống, vì vậy các socket UDP chỉ cần chờ để truyền dữ liệu mà không cần thiết lập kết nối tới một địa chỉ cụ thể.

Constructor của UdpClient tương tự như TcpClient, cho phép chỉ định thông tin cần thiết để tạo một socket UDP hoặc tham chiếu đến một cổng UDP trên một địa chỉ từ xa.

Phương thức Receive() cho phép nhận dữ liệu qua giao thức UDP mà không cần thiết lập phiên kết nối Khi một cổng UDP nhận dữ liệu, bạn không cần biết nguồn gốc của nó Để bù đắp cho điều này, Receive() bao gồm tham số IPEndPoint, cung cấp thông tin về địa chỉ IP của host từ xa Đối tượng UdpClient được cấu hình để sử dụng cổng UDP mà ứng dụng của bạn muốn nhận gói dữ liệu Lưu ý rằng UdpClient trên máy từ xa thường được thiết lập với giá trị IPAddress.Any, giá trị này sẽ được thay thế bằng thông tin từ phương thức Receive().

Phương thức Send() của UdpClient có 3 khuôn dạng khác nhau Khi UdpClient tham chiếu đến một host xa, không cần chỉ định địa chỉ đích cho dữ liệu Ngược lại, nếu UdpClient không tham chiếu đến một host xa, địa chỉ đích phải được chỉ định rõ ràng Điều này có thể thực hiện bằng cách sử dụng một đối tượng IPEndPoint, một chuỗi hostname, hoặc một giá trị IP cùng với số hiệu cổng.

Lập trình với thread

Khi xây dựng ứng dụng Server, mục tiêu là phục vụ nhiều Client cùng lúc, yêu cầu mỗi ứng dụng Server cần có nhiều SocketClient hoạt động đồng thời Tuy nhiên, phương thức Receive() trên mỗi SocketClient sẽ bị chờ đợi khi không có dữ liệu kết nối, dẫn đến việc các kết nối khác bị khóa khi một kết nối đang được xử lý Để khắc phục vấn đề này, C# cung cấp công cụ lập trình Thread giúp xử lý đồng thời nhiều kết nối mà không bị gián đoạn.

Lớp `ProcessThread` trong namespace `System.Diagnostics` cho phép truy cập thông tin về các thread trong một tiến trình từ chương trình C# Lớp này bao gồm nhiều thuộc tính và phương thức hữu ích để lấy thông tin chi tiết về các thread đang hoạt động trong một tiến trình thực thi.

Các tiến trình có khả năng tạo ra một hoặc nhiều thread, với mỗi thread xác định một luồng thực thi đơn trong chương trình Khi chương trình chạy trên CPU, nó thực hiện các lệnh trong một luồng cho đến khi hoàn thành Việc này cho phép nhiều tác vụ được thực hiện đồng thời, với mỗi tác vụ chạy trên một luồng riêng biệt.

Chương trình đa luồng tạo ra các luồng từ luồng chính và cho phép thực thi đồng thời các luồng này, chia sẻ không gian nhớ với luồng chính Thông thường, luồng thứ hai được sử dụng để thực hiện các tác vụ tính toán, giúp luồng chính có thể phản ứng với các sự kiện Nếu không có luồng thứ hai, người dùng sẽ không thể tương tác với menu hoặc các nút lệnh trong khi chương trình đang thực hiện các phép toán.

Threads have several execution states defined by constants in NET, specifically within the System.Threading namespace The following table lists the possible states of a thread in the Windows operating system.

Initialized The thread has been initialized but not started

Ready The thread is waiting for a processor

Running The thread is currently using the processor

Standby The thread is about to use the processor

Terminated The thread is finished and is ready to exit

Transition The thread is waiting for a resource other than the processor Unknown The system is unable to determine the thread state

Wait The thread is not ready to use the processor

Một thread đơn lẻ có thể thay đổi trạng thái trong quá trình hoạt động của nó, chuyển đổi giữa các trạng thái như Running, Standby, Transition và Wait.

Hệ điều hành có khả năng chuyển đổi trạng thái của một thread đang chạy để thực thi một thread khác với độ ưu tiên cao hơn.

Lớp NET ProcessThread trong namespace System.Diagnostics cho phép truy cập các thread trong một tiến trình từ chương trình C# Nó bao gồm nhiều thuộc tính và phương thức để lấy thông tin về các thread, giúp bạn hiểu rõ hơn về luồng thực thi trong tiến trình.

BasePriority Gets the base priority of the thread

Container Gets the IContainer that contains the thread object

CurrentPriority Gets the current priority of the thread

Id Gets the unique thread identifier of the thread

IdealProcessor Sets the preferred processor for the thread to run on

PriorityBoostEnabled Gets or sets a value indicating whether the operating system should temporarily boost the priority of the thread when its main window has the focus

PriorityLevel Gets or sets the priority level of the thread

PrivilegedProcessorTime Gets the amount of time the thread has spent running code in the operating system core ProcessorAffinity Sets the processors that the thread can run on

Site Gets or sets the ISite of the thread object

StartAddress Gets the memory address of the function used to start the thread ThreadState Gets the current state of the thread

TotalProcessorTime Gets the total amount of time the thread has spent using the processor

UserProcessorTime Gets the amount of time the thread has spent running code in the application WaitReason Gets the reason the thread is in the Wait state

Phân tích và thiết kế chương trình

Cấu trúc chung của chương trình

Chương trình Chat được chia làm 3 projectsau:

SCG.Prism : Chứa các thành phần và các lớp gói gọn của chương trình như kết nối, giao diện …

Project này bao gồm các thành phần và các lớp quan trọng sau:

1 Thành phần PrismConnection – Cho phép một ứng dụng client kết nối và giao tiếp với một máy chủ Quy định rõ các đặc tính như địa chỉ máy chủ và số cổng của máy chủ, những phương thức để bắt đầu truyền thông, và những sự kiện để đáp ứng những hoạt động khác nhau như : vào chat, đến một người dùng mới vào một phòng chat, hoặc một thông điệp từ quản trị viên

2 Thành phần PrismServer- Gói gọn các hoạt động của PrismServer, cho phép nhiều client kết nối và giao tiếp thông qua những socket Đây là thành phần cơ bản của bất cứ ứng dụng máy chủ PrismServer nào, và cung cấp những thuộc tính của giao diện máy chủ người dùng vẫn còn được cập nhật

3 Lớp PrismUser – Đại diện cho một cá nhân riêng là người đã đăng nhập vào PrismServer Lớp này được sử dụng để đại diện cho người dùng trong client và ứng dụng server

4 Lớp PrismRoom – Đại diện cho một ―phòng chat‖ để có thể chứa một hoặc nhiều PrismUser người dùng có thể giao tiếp với nhau

PrismServerAdmin là máy chủ chịu trách nhiệm lắng nghe các kết nối từ Client qua cổng, đồng thời cung cấp giao diện người dùng để quản trị viên có thể theo dõi ai đã kết nối, hoạt động trên màn hình và lịch sử thực thi.

ChatNDraw: Có nhiệm vụ kết nối đến Server thông qua địa chỉ IP của Server, tạo và vào phòng chat, chat với những người dùng khác trong phòng chat.

Phân tích và thiết kế

3.2.1 Viết ứng dụng Client (ChatNDraw)

Một ứng dụng Client có khả năng kết nối và giao tiếp với PrismServer thông qua thành phần PrismConnection Trong môi trường WinForms, người dùng chỉ cần kéo thả các thành phần này vào form và thiết lập các thuộc tính trong quá trình thiết kế Để kết nối thành công, PrismConnection yêu cầu ba thuộc tính phải được cấu hình trước.

1 Host –Ghi rõ tên miền hoặc địa chỉ IP của máy chủ nơi mà PrismServer đang chạy

2 Port –Ghi rõ số cổng mà PrismServer đã cấu hình để sử dụng trong máy chủ

3 SubjectName –Khái niệm ―SubjectName‖ cung cấp khả năng cho nhiều ứng dụng client để sử dụng cho một PrismServer đơn, và chỉ nhận được các thông điệp đã được bắt nguồn từ cùng một client PrismServer sẽ hướng các thông điệp chỉ để kết nối với những Client mà dung chung cùng một chủ đề Bạn nên cung cấp một chuỗi giá trị tương ứng với tên ứng dụng của bạn a Kết nối

Các đặc tính đã được thiết lập nhằm đảm bảo các hoạt động diễn ra đúng cách để thiết lập một kết nối Hành động này sẽ tạm thời chặn các ứng dụng cho đến khi một kết nối được thiết lập thành công hoặc một ngoại lệ xảy ra.

Khi kết nối được thiết lập, bước tiếp theo là đăng nhập vào PrismServer bằng tài khoản và mật khẩu Thành phần PrismConnection cung cấp hai phương pháp đăng nhập: Login và LoginNew, cho phép người dùng đăng nhập bằng tên người dùng và mật khẩu hiện có hoặc đăng ký tài khoản mới Giao diện người dùng của client sẽ cung cấp hướng dẫn để người sử dụng có thể bắt đầu với từng phương thức đăng nhập.

Để đăng nhập vào máy chủ, hãy gọi Login và sử dụng tài khoản cùng mật khẩu đã đăng ký trước đó PrismConnection sẽ phản hồi bằng sự kiện LoginOK hoặc một sự kiện khác.

Loginerror Có thể có các lỗi là mật khẩu không hợp lệ, và không tìm thấy tài khoản người dùng trong đăng ký của máy chủ

Để đăng nhập vào máy chủ với tài khoản mới, bạn cần gọi LoginNew, sử dụng tham số đối tượng PrismUser chứa thông tin người dùng Thư viện có thành phần hộp thoại PrismUser InfoDialog giúp tạo PrismUser nhanh chóng PrismConnection sẽ phản hồi qua các sự kiện LoginOK hoặc Loginerror, trong đó có thể xảy ra lỗi như tài khoản đã tồn tại hoặc tài khoản không hợp lệ Trong ứng dụng máy client, bạn có thể tham khảo đặc tính ThisUser để tìm ví dụ về PrismUser cục bộ nhằm kết nối.

//Đoạn mã ví dụ Client kết nối PrismServer connection.Host = _frmLogin.txtHost.Text; connection.Port = (int)_frmLogin.numPort.Value; try

{ connection.Active = true; connection.Login(_frmLogin.txtUserName.Text, _frmLogin.txtPassword.Text); } catch (Exception error)

MessageBox.Show(error.Message, " Lỗi kết nối PrismServer ");

Mỗi máy client kết nối với một PrismServer sẽ chiếm lĩnh một PrismRoom riêng, cho phép chat và tương tác với các máy client khác trong cùng một phòng Ứng dụng trên máy client của bạn có thể hiển thị tất cả các ứng dụng của các PrismRoom đã được tạo ra, giúp chia sẻ các chủ đề một cách hiệu quả.

Thành phần PrismConnection thông báo cho máy client về việc tạo ra các PrismRooms mới qua sự kiện RoomAdded, cho phép nhận ngay lập tức các sự kiện này sau khi đăng nhập thành công vào các PrismRoom hiện có trên máy chủ Máy client sẽ hiển thị các phòng này qua các giao diện như ListBox hoặc ListView Khi một PrismRoom bị xóa, PrismConnection sẽ thông báo cho máy client thông qua sự kiện RoomRemoved Ngoài ra, PrismConnection cũng thông báo cho máy client khi người dùng vào hoặc rời khỏi PrismRoom thông qua các sự kiện UserAddedToRoom và UserLeftRoom.

Sau khi đăng nhập thành công vào máy client trong phòng mặc định hoặc phòng ngoài, PrismConnection thông báo cho máy client về việc tham gia phòng mới qua sự kiện JoinedRoom Sự kiện này đi kèm với UserAddedToRoom, chứa các đối tượng PrismUser đại diện cho các máy client đã kết nối Để tham gia vào các PrismRoom khác, người dùng cần gọi phương thức EnterRoom, trong khi việc tạo một PrismRoom mới yêu cầu gọi phương thức CreateRoom Sau khi thực hiện, người dùng sẽ nhận được các sự kiện như UserLeftRoom, UserAddedToRoom và JoinedRoom Nếu người dùng cuối cùng rời khỏi phòng, PrismServer sẽ tự động hủy phòng (trừ khi đó là phòng mặc định), và sự kiện RoomRemoved sẽ được kích hoạt Khi tạo phòng mới, người dùng sẽ nhận được sự kiện RoomAdded trước khi nhận UserAddedToRoom và JoinedRoom PrismRooms được thiết kế cho các trò chơi nhiều người chơi.

Phương thức CreateRoom yêu cầu hai tham số: tên phòng và số lượng tối đa người tham gia (0 để không giới hạn) Khi số lượng người tham gia vượt quá 0, PrismConnection sẽ kích hoạt sự kiện StartSignal khi đủ số lượng người chơi vào phòng, và máy chủ sẽ khóa phòng để ngăn chặn người chơi khác tham gia Tính năng này giúp quản lý số lượng người chơi trong trò chơi, đảm bảo rằng các trận đấu bắt đầu khi đủ người.

Trong PrismRoom, bạn có khả năng trao đổi chat và dữ liệu với các máy client khác Để gửi tin nhắn văn bản, hãy sử dụng phương thức SendChat Khi nhận được tin nhắn từ máy client khác trong phòng (không bao gồm máy cục bộ), sự kiện ChatMessageReceived sẽ được kích hoạt bởi PrismConnection.

"Data Messages" là chuỗi thông điệp được gửi đến các máy client trong phòng, được quản lý bộ nhớ giống như chatstrings Mục đích của thông điệp dữ liệu là tạo điều kiện thuận lợi cho các ứng dụng trên máy client thông qua việc gửi dữ liệu cụ thể, không thể chat Để gửi thông điệp dữ liệu, sử dụng hàm SendData và xử lý các sự kiện DataMessageReceived để đáp ứng với các thông điệp này.

ChatNDraw cung cấp mã nguồn hoàn chỉnh cho một ứng dụng đơn giản trên máy client, cho phép người dùng kết nối với PrismServer Người dùng có thể tạo và tham gia các phòng chat, trò chuyện với những người khác, cũng như chia sẻ và vẽ trên một bảng đen Ứng dụng cũng cho phép người dùng chỉnh sửa thông tin cá nhân và kiểm tra trạng thái của Server.

3.2.2 Viết ứng dụng Server (PrismServerAdmin)

Các thành phần của PrismServer là nền tảng chính cho ứng dụng máy chủ PrismServer, bao gồm quản lý đa chuỗi server socket, Subject Names, PrismRooms và PrismUsers, đồng thời định tuyến và xử lý thông điệp giữa các máy client PrismServer cung cấp nhiều tính năng để kiểm soát các hoạt động của máy chủ.

Port – Chỉ rõ số cổng mà máy chủ sẽ lắng nghe cho các kết nối trên

LobbyName là tên mặc định của PrismRoom cho các máy client mới được thêm vào Tính năng ProhibitSameIP cho phép cấm nhiều kết nối từ cùng một địa chỉ IP nếu được kích hoạt Tương tự, ProhibitSameUser Name sẽ ngăn chặn việc nhiều người dùng đăng nhập với cùng một tên nếu tùy chọn này được bật.

PingInterval – Kiểm soát những Client ping vào Server, những client ping không được đáp ứng như đã ra ngoài và không kết nối

Implementation – Cần thiết để thiết lập một số trường hợp của thành phần mà xuất phát từ PrismServerImplementation

Chương trình thực nghiệm

Giao diện chương trình Server

Giao diện của chương trình Server khi chưa có Client nào kết nối hiển thị rõ ràng Để Server bắt đầu lắng nghe, người dùng cần nhấn nút "Bắt đầu", và để kết thúc quá trình, chỉ cần sử dụng nút "Kết thúc" Đây là cách thức hoạt động của Server khi bắt đầu lắng nghe kết nối.

Giao diện chương trình Client

Giao diện Client khi chưa kết nối

Khi Client muốn kết nối người dùng phải nhấn vào nút ―Kết nối‖ Sau đó điền các thông tin vào bảng sau :

Nếu chưa đăng ký Tài khoản thì nhấn ― Tạo tài khoản ‖ để thực hiện đăng ký :

Giao diện người dùng sau khi kết nối thành công:

Tổng kết và hướng phát triển của đồ án

Những kết quả đạt được

Luận văn đã đạt được những kết quả sau:

- Xây dựng thành công ứng dụng Chát trên mô hình Client – Server cho phép nhiều người có thể chat với nhau trên mạng Lan

- Chương trình chạy tương đối ổn định

- Thực hiện được chức năng quản lý User

- Tìm hiểu ngôn ngữ lập trình C#.

Những vấn đề tồn tại

- Chưa thực hiện Chat được bằng tiếng việt

- Các tiện ích của hệ thống chưa nhiều như Voice và CAM.

Hướng phát triển của đồ án

Để hệ thống phát huy tối đa tiện ích cho người dùng, cần thiết phải cải tiến, bổ sung và khắc phục những điểm yếu cũng như các vấn đề còn tồn tại.

Thêm và tích hợp một số chức năng tiện ích khác.

Tài liệu Tham khảo

[1] Richard Blum, C# Network Programming, Sybex © 2003, ISBN:0782141765

[2] Kỹ thuật lập trình C#, Biên dịch từ cuốn Professional C#, 2nd Edition, Xuất bản bởi Wrox Press Ltd

[3] Andy Harris, Microsoft C# Programming for the Absolute Beginner, Premier Press ©

[4] Kỹ thuật lập trình ứng dụng C#.net toàn tập ,biên soạn Phạm Hữu Khang ,NXB Lao động – Xã hội , xuất bản năm 2005

[5] Mạng máy tính , tác giả Lê Đình Danh.

Ngày đăng: 05/08/2021, 21:55

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

TÀI LIỆU LIÊN QUAN

w