02/10/2018, 00:07

Viết ứng dụng Chat sử dụng giao thức P2P (Peer to Peer) bằng VB.NET

Hôm nay, mình hướng dẫn các bạn viết ứng dụng Chat truyền thông tin giữa các máy nội bộ cùng mạng LAN , bài viết này mình sử dụng giao thức P2P (peer to peer) hay còn gọi là mạng ngang hàng. Và bạn có thể sử dụng ứng dụng này để áp dụng cho gọi hàm hay đồng ...

Hôm nay, mình hướng dẫn các bạn viết ứng dụng Chat truyền thông tin giữa các máy nội bộ cùng mạng LAN, bài viết này mình sử dụng giao thức P2P (peer to peer) hay còn gọi là mạng ngang hàng. Và bạn có thể sử dụng ứng dụng này để áp dụng cho gọi hàm hay đồng bộ dữ liệu giữa các máy nội bộ với nhau. Khi nhận được lệnh mình sẽ gọi hàm cho chương trình bên kia thực hiện. Tùy theo nhu cầu, bạn có thể ứng dụng hợp lý cho ứng dụng riêng của mình.

Hình ảnh ứng dụng Chat:

Viết ứng dụng Chat P2P bằng VB.net

I. Giới thiệu giao thức P2P:

Cũng như tất cả các bạn đều biết, hầu như mọi dịch vụ ma Internet cung cấp ngày nay đều dựa trên mô hình client/server. Theo mô hình này thì một máy khách (client) sẽ kết nối với một máy chủ thông qua một giao thức nhất định (WWW, FTP, Telnet, email ...) . Nói chung, mô hình client/server có rất nhiều điểm ưu việt bao gồm ư điểm nổi bật là mọi xử lý sẽ nằm trên server do đó sẽ tránh cho clients những tính toán nặng nề.

Tuy nhiên, khi mà Internet phát triển với tốc độ chóng mặt như ngày nay thì mô hình client/server có một nhược điểm quan trọng. Khi số lượng clients tăng đến một mức độ nào đó thì nhu cầu về tải và băng thông tăng lên dẫn đến việc máy chủ không có khả năng cung cấp dịch vụ cho các máy khách thêm vào.

Để giải quyết vấn đề trên và còn nhiều vấn đề khác của mô hình client/server, công nghệ mạng ngang hàng P2P (peer to peer technology) được tin tưởng sẽ là lời giải cho các vấn đề trên. Vậy P2P là gì và nó có những ưu và nhược điểm như thế nào ?? !!

Đáng lý ra thì chỉ cần có hình minh hoạ thì sẽ dễ dàng hơn cho mọi người hiểu được, tuy nhiên Gadfly không biết cách chèn hình trong diễn đàn nên đành cáo lỗi vậy, đành phải cố gắng giải thích bằng lời và sẽ chèn hình vào sau. Nói chung mô hình client/server là có một server (máy chủ) ở trung tâm, các máy khách ở ngoài, mỗi máy khách sẽ có một liên kết tới máy chủ, còn mô hình P2P là các máy đều có vai trò như nhau và một máy sẽ có liên kết tới mọi máy khác. Thật ra, mô hình P2P vừa nêu không thật sự là mô hình P2P trong thực tế nhưng nó giúp cho các bạn có cái nhìn khái quát về P2P

Vậy ưu điểm của P2P là gì :
Đầu tiên P2P dựa trên các cơ chế nhất định để tìm kiếm các máy tính khác đang có trên mạng, P2P cho phép các máy tính này vừa đóng vai trò là máy chủ vừa là máy khách để cung cấp xác định và cung cấp các dịch vụ có sẵn trên mạng P2P. Theo cơ chế này thì P2P đã giải quyết được vấn đề quá tải, cũng như vấn đề server đột nhiên chết giữa chừng làm ngưng việc cung cấp dịch vụ mà mô hình client/server thường gặp. Nguyên nhân là trong mạng P2P, dịch vụ được cung cấp bởi nhiều điểm chứ không phải là một.
P2P còn nhiều ưu điểm khác như tận dụng được tài nguyên của tất cả các máy trong mạng, có phân bố lưu lượng thông tin hợp lý để tránh tằc nghẽn trên mạng.

Nhược điểm của P2P 
Nhược điểm của P2P là vì tài nguyên của mạng nằm trên các máy tính cá nhân và không phải lúc nào các máy này cũng liên kết với mạng nên có thể dẫn tới sư biến mất của một dịch vụ trong khoảng thời gian nhất định. Tuy nhiên nhược điểm này có thể khắc phục khi số lượng thành viên trên mạng P2P đủ lớn, lúc đó sẽ có nhiều điểm cung cấp dịch vụ cho toàn mạng hơn.

II. Hướng dẫn viết ứng dụng

Ở bài viết này mình sẽ sử dụng thư viện System.Net.Socket

- Đầu tiên các bạn cần import thư viện cần thiết vào

Imports System.Net.Sockets
Imports System.Threading
Imports System.IO

- Tiếp đến, bạn khai báo biến TcpClient và ở ví dụ này mình ứng dụng của mình lắng nghe ở port 65535, các bạn có thể thay đổi port khác, không nhất thiết phải mặc định là port này, miễn sao không trùng với các port mà các ứng dụng khác đang chạy.

Dim Listener As New TcpListener(65535)
Dim Client As New TcpClient
Dim Message As String = ""

- Viết hàm GetComputerName để lấy tên máy của mình đang sử dụng hay còn gọi là Hostname

Public Function GetComputerName()
        Dim computerName As String
        computerName = System.Net.Dns.GetHostName
        Return computerName
End Function

- Viết sự kiện cho form load

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim ListThead As New Thread(New ThreadStart(AddressOf Listenning))
        Listener.Start()
End Sub

- Viết một function Listener để luôn lắng nghe nhận và truyền dữ liệu

 Private Sub Listenning()
        Listener.Start()
 End Sub

- Viết sự kiện khi Timer tick

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        If Listener.Pending = True Then
            Message = ""
            Client = Listener.AcceptTcpClient()
            Dim Reader As New StreamReader(Client.GetStream)
            While Reader.Peek > -1
                Message = Message + Convert.ToChar(Reader.Read()).ToString

            End While
            RichTextBox1.AppendText(Message)
        End If
End Sub

- Đóng lắng nghe port khi đóng ứng dụng

Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
        Listener.Stop()
End Sub

- Và cuối cùng là viết sự kiện cho nút gởi tin nhắn.

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Client = New TcpClient(TextBox1.Text, 65535)
        Dim Writer As New StreamWriter(Client.GetStream)
        Dim tenmay As String = "@" & GetComputerName & " say: "
        Writer.Write(tenmay & TextBox2.Text + vbLf)
        Writer.Flush()
End Sub

- Vậy là xong, bây giờ các bạn có thể chạy và thưởng thức thành quả

Các bạn có thể tham khảo video mình hướng dẫn chi tiết thực hiện bên dưới:

Cám ơn các bạn đã xem bài viết. Hãy like and share giúp mình nha các bạn.

Các bạn có thể Đăng ký kênh Youtube của mình ở góc phải bên trên màn hình.

Mọi thắc mắc về bài viết các bạn có thể hỏi ở http://hoidap.laptrinhvb.net để được support.

Download source code Chat with P2P

Tags: lập trình socketlập trình
0