• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Tạo một ứng dụng vb chat cho 2 người

Các bài viết hướng dẫn, giúp các bạn hiểu và tiếp cận với Visual Basic nhanh hơn
Hình đại diện của người dùng
nhochoclaptrinh
Thành viên danh dự
Thành viên danh dự
Bài viết: 514
Ngày tham gia: T.Bảy 28/05/2011 12:10 pm
Has thanked: 15 time
Been thanked: 83 time

Tạo một ứng dụng vb chat cho 2 người

Gửi bàigửi bởi nhochoclaptrinh » T.Năm 13/10/2011 10:12 am

Tên bài viết: Tạo một vb Chat cho 2 người
Tác giả: nhochoclaptrinh
Vui lòng chỉ rõ nguồn từ Caulacbovb khi trích dẫn



Phần một: Cấu trúc engine và cách thức truyền gói tin + tạo Database bằng Access
Mình mới biết làm cái webservice trên VB .net nay có ý tưởng này nên viết bài này để các bạn tham khảo.
Dùng cả hai công cụ VB6, Visual Web Devaloper(VB.net - framework 3.5): vb6 để tạo cái Application còn VWD để tạo cái web-service trên host, Host dùng ở đây là SOMEE.COM(free).
Cách thức:
Trên host somee có một access database lưu dữ liệu chat, dùng web-service để thực hiện lấy tin chat, đăng tin chat.
Dưới Client có app bằng vb6 để gửi yêu cầu lên webservice
(Chỉ dùng cho 2 người chat, nếu muốn các bạn hãy phát triển thêm)



Xây dựng một CSDL Access (format 2000~2003), có password: 123, và một table tên : tbl_chat với các field: user_name; user_msg; user_msgdate
Xem Video tại đây: http://www.youtube.com/watch?v=l7h4kZh54h8

Sửa lần cuối bởi nhochoclaptrinh vào ngày T.Bảy 15/10/2011 6:39 pm với 3 lần sửa.


Sad eyes never lie :((

Hình đại diện của người dùng
tungblt
Điều hành viên
Điều hành viên
Bài viết: 549
Ngày tham gia: T.Hai 22/12/2008 5:22 pm
Đến từ: quy nhơn
Has thanked: 6 time
Been thanked: 76 time
Liên hệ:

Re: Tạo một ứng dụng vb chat cho 2 người

Gửi bàigửi bởi tungblt » T.Năm 13/10/2011 7:10 pm

chờ phần 2 :)

Hình đại diện của người dùng
nhochoclaptrinh
Thành viên danh dự
Thành viên danh dự
Bài viết: 514
Ngày tham gia: T.Bảy 28/05/2011 12:10 pm
Has thanked: 15 time
Been thanked: 83 time

Re: Tạo một ứng dụng vb chat cho 2 người

Gửi bàigửi bởi nhochoclaptrinh » T.Năm 13/10/2011 10:25 pm

Phần 2: Tạo web service cho ứng dụng chat + kết nối CSDL
A. Kết nối CSDL
Để tiện kết nối và giảm tính lung tung trong phần code kết nối CSDL, mình đã tạo một Class bằng VB.net (DLL) để add vào webservices với mục đích Class này đơn giản hóa các thao tác kết nối CSDL, nội dung như sau:
Tên class: Kernel (nghe hấp dẫn)
  1. Imports Microsoft.VisualBasic
  2. Public Class SmartKernel
  3.     Private db As ADODB.Connection
  4.     Private rs As ADODB.Recordset
  5.  
  6.     Private DbAddr As String
  7.     'Tải Class và Lấy đường dẫn CSDL
  8.     Public Sub New(ByVal sDataAddr As String)
  9.         MyBase.New()
  10.         DbAddr = sDataAddr
  11.     End Sub
  12.  
  13.     'Kết nối dữ liệu
  14.     Public Sub DataConnecting()
  15.         db = New ADODB.Connection : rs = New ADODB.Recordset
  16.         Dim CnnStr As String 'Chuỗi tạo kêt nối
  17.         CnnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & DbAddr & ";Persist Security Info=False;Jet OLEDB:Database Password=123"
  18.         'chuỗi kết nối với mật mã CSDL là 123
  19.         db.Open(CnnStr)
  20.     End Sub
  21.     '
  22.     'Kết nối đến bảng
  23.     Public Sub OpenTable(ByVal sTableName As String)
  24.         Dim SQLstr As String = "Select * From " & sTableName
  25.         rs.LockType = 3
  26.         rs.Open(SQLstr, db, 3, 3)
  27.     End Sub
  28.     'Lấy dữ liệu ở Fields
  29.     Public Function GetFields(ByVal sFieldName As String) As Object
  30.         Return rs.Fields(sFieldName).Value
  31.     End Function
  32.     'Đóng kết nối
  33.     Public Sub CloseConnection()
  34.         rs.Close() : db.Close()
  35.         rs = Nothing : db = Nothing
  36.     End Sub
  37.     'Cập nhật dữ liệu cho Fields
  38.     Public Sub SetFieldsData(ByVal sFieldName As String, ByVal oData As Object)
  39.         rs.Fields(sFieldName).Value = oData
  40.     End Sub
  41.     Public Sub UpdateData()
  42.         rs.Update()
  43.     End Sub
  44.     'Thêm Fields
  45.     Public Sub NewItems()
  46.         rs.AddNew()
  47.     End Sub
  48.     'Xóa Fields
  49.     Public Sub DeleteFields()
  50.         rs.Delete()
  51.     End Sub
  52.     'Làm tươi bảng
  53.     Public Sub RefreshTable()
  54.         rs.Requery()
  55.     End Sub
  56.     'Các giá trị enum, dùng để tiện xem trong viết code
  57.     Public Enum rsCursor As Integer
  58.         MoveNext = 0
  59.         Previous = 1
  60.         MoveFirst = 2
  61.         MoveLast = 3
  62.     End Enum
  63.     Public Enum rsAddr As Integer
  64.         BOF = 0
  65.         EOF = 1
  66.     End Enum
  67.     'Xem xét con trỏ đang BOF hay EOF
  68.     Public Function BOF_EOF(ByVal eAddr As rsAddr) As Boolean
  69.         Select Case eAddr
  70.             Case rsAddr.BOF
  71.                 Return rs.BOF
  72.             Case rsAddr.EOF
  73.                 Return rs.EOF
  74.         End Select
  75.     End Function
  76.     'Di chuyển con trỏ trên table
  77.     Public Function RecCount() As Object
  78.         Return rs.RecordCount
  79.     End Function
  80.     Public Sub Cursor(ByVal eMove As rsCursor)
  81.         Select Case eMove
  82.             Case rsCursor.MoveFirst
  83.                 rs.MoveFirst()
  84.             Case rsCursor.MoveLast
  85.                 rs.MoveLast()
  86.             Case rsCursor.MoveNext
  87.                 rs.MoveNext()
  88.             Case rsCursor.Previous
  89.                 rs.MovePrevious()
  90.         End Select
  91.     End Sub
  92. End Class
  93.  


B: Tạo một webservice
Hầu hết các website ngày nay được truy cập bởi người dùng thông qua trình duyệt, các Web Services sẽ được truy cập bởi các chương trình máy tính.
Gọi các Web Service, ASP.NET hỗ trợ một số giao thức để gọi các Web Service:
- HTTP-GET
- HTTP-POST
- SOAP
Trong ứng dụng chat, mình sẽ dùng giao thức SOAP (sử dụng XML trong cả khi gửi request và nhận response.)

Cái CLASS đã được cập nhật thêm các bạn hãy xem nhé.


Xem Video: http://www.youtube.com/watch?v=9kQrnxRXZJQ
Sad eyes never lie :((

Hình đại diện của người dùng
nhochoclaptrinh
Thành viên danh dự
Thành viên danh dự
Bài viết: 514
Ngày tham gia: T.Bảy 28/05/2011 12:10 pm
Has thanked: 15 time
Been thanked: 83 time

Re: Tạo một ứng dụng vb chat cho 2 người

Gửi bàigửi bởi nhochoclaptrinh » T.Bảy 15/10/2011 9:05 pm

Phần 3: Xử lý CSDL trên WebService



Xem xong phần 1, và 2, mình sẽ tạo tiếp WebService trên các đối tượng đã tạo ở phần 1 và 2.
Mở Visual WebDeveloper 2008
Bây giờ sang khung Solution, chọn mở Service.vb,
Dưới dòng
  1. Inherits System.Web.Services.WebService

Mình sẽ khai báo Class SmartKernel,

Tiếp theo sẽ là hàm lấy 20 tin nhắn mới nhất trong CSDL, còn ngoài 20 tin thì Xóa đi:
  1.     Private Function GetAllMsg() As String
  2.         'Kết nối CSDL
  3.         Kernel = New SmartKernel(Server.MapPath("chat.mdb"))
  4.         'Mở table
  5.         Kernel.DataConnecting() : Kernel.OpenTable("tbl_chat")
  6.         Kernel.RefreshTable()
  7.         '
  8.         Dim i As Integer
  9.         Dim sMes As String
  10.         '
  11.         If Kernel.RecCount > 0 Then
  12.             Kernel.Cursor(SmartKernel.rsCursor.MoveLast)
  13.             For i = 1 To CInt(Kernel.RecCount)
  14.                 If i <= 20 Then
  15.                     sMes = sMes & _
  16.                " >From:" & Kernel.GetFields("user_name") & " (" & CDate(Kernel.GetFields("user_msgdate")).ToShortTimeString & _
  17.                ").br." & Kernel.GetFields("user_msg") & ".br."
  18.                     'Chuỗi .br. thì xuống Client ta sẽ dùng hàm replace xử lý thành <br>.
  19.                 Else
  20.                     Kernel.DeleteFields()
  21.                 End If
  22.                 Kernel.Cursor(SmartKernel.rsCursor.Previous)
  23.             Next
  24.         Else
  25.             sMes = "Chua co du lieu"
  26.         End If
  27.         '
  28.         Kernel.CloseConnection()
  29.         Return sMes
  30.         ''
  31.     End Function


Code trên dựa vào Class SmartKernel để tiện dùng,
Tiếp theo sẽ là thủ tục đăng tin mới:
  1.     Private Sub PostMsg(ByVal UserName As String, ByVal UserMsg As String)
  2. 'Tạo kết nối
  3.         Kernel = New SmartKernel(Server.MapPath("chat.mdb"))
  4.         Kernel.DataConnecting()
  5. 'Mở table
  6.         Kernel.OpenTable("tbl_chat")
  7. 'Field mới
  8.         Kernel.NewItems()
  9.         Kernel.SetFieldsData("user_name", UserName)
  10.         Kernel.SetFieldsData("user_msg", UserMsg)
  11. 'Cập nhật
  12.         Kernel.UpdateData()
  13.         Kernel.CloseConnection()
  14.     End Sub

Thế là xong hai phần cơ bản, bây giờ ta sẽ tạo 2 webMethod để dùng cái Function và Sub trên, sẽ được gọi từ Client:
Dán tiếp code sau:

  1.   <WebMethod()> _
  2.     Public Function GetMsg() As String
  3.         Return GetAllMsg()
  4.     End Function
  5.     <WebMethod()> _
  6.     Public Function NewMsg(ByVal UID As String, ByVal UMSG As String) As String
  7.         Call PostMsg(UID, UMSG)
  8.         Return GetAllMsg()
  9.     End Function


Xong, phần 4 sẽ hướng dẫn đưa WebService này lên SOMEE.COM (host ASP.NET miễn phí).
Toàn bộ Code ở cửa sổ Service.vb của( Service.asmx):
  1. Imports System.Web
  2. Imports System.Web.Services
  3. Imports System.Web.Services.Protocols
  4.  
  5. ' To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
  6. ' <System.Web.Script.Services.ScriptService()> _
  7. <WebService(Namespace:="http://tempuri.org/")> _
  8. <WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
  9. <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
  10. Public Class Service
  11.      Inherits System.Web.Services.WebService
  12.     Private Kernel As SmartKernel
  13.     Private Function GetAllMsg() As String
  14.         'Kết nối CSDL
  15.         Kernel = New SmartKernel(Server.MapPath("chat.mdb"))
  16.         'Mở table
  17.         Kernel.DataConnecting() : Kernel.OpenTable("tbl_chat")
  18.         Kernel.RefreshTable()
  19.         '
  20.         Dim i As Integer
  21.         Dim sMes As String
  22.         '
  23.         If Kernel.RecCount > 0 Then
  24.             Kernel.Cursor(SmartKernel.rsCursor.MoveLast)
  25.             For i = 1 To CInt(Kernel.RecCount)
  26.                 If i <= 20 Then
  27.                     sMes = sMes & _
  28.                " >From:" & Kernel.GetFields("user_name") & " (" & CDate(Kernel.GetFields("user_msgdate")).ToShortTimeString & _
  29.                ").br." & Kernel.GetFields("user_msg") & ".br."
  30.                     'Chuỗi .br. thì xuống Client ta sẽ dùng hàm replace xử lý thành <br>.
  31.                 Else
  32.                     Kernel.DeleteFields()
  33.                 End If
  34.                 Kernel.Cursor(SmartKernel.rsCursor.Previous)
  35.             Next
  36.         Else
  37.             sMes = "Chua co du lieu"
  38.         End If
  39.         '
  40.         Kernel.CloseConnection()
  41.         Return sMes
  42.         ''
  43.     End Function
  44.  
  45.     Private Sub PostMsg(ByVal UserName As String, ByVal UserMsg As String)
  46.         Kernel = New SmartKernel(Server.MapPath("db.mdb"))
  47.         Kernel.DataConnecting()
  48.         Kernel.OpenTable("tbl_chat")
  49.         Kernel.NewItems()
  50.         Kernel.SetFieldsData("user_name", UserName)
  51.         Kernel.SetFieldsData("user_msg", UserMsg)
  52.         Kernel.UpdateData()
  53.         Kernel.CloseConnection()
  54.     End Sub
  55.  
  56.     <WebMethod()> _
  57.     Public Function GetMsg() As String
  58.         Return GetAllMsg()
  59.     End Function
  60.     <WebMethod()> _
  61.     Public Function NewMsg(ByVal UID As String, ByVal UMSG As String) As String
  62.         Call PostMsg(UID, UMSG)
  63.         Return GetAllMsg()
  64.     End Function
  65.  
  66. End Class
  67.  
  68.  

Hình đại diện của người dùng
nhochoclaptrinh
Thành viên danh dự
Thành viên danh dự
Bài viết: 514
Ngày tham gia: T.Bảy 28/05/2011 12:10 pm
Has thanked: 15 time
Been thanked: 83 time

Re: Tạo một ứng dụng vb chat cho 2 người

Gửi bàigửi bởi nhochoclaptrinh » CN 16/10/2011 9:54 am

Phần 4, đưa service lên host


Đầu tiên, bạn tìm đến file web.config trong thư mục của cái service ta đã tạo.
Tìm đến Code này
[xml] <!--
The <customErrors> section enables configuration
of what to do if/when an unhandled error occurs
during the execution of a request. Specifically,
it enables developers to configure html error pages
to be displayed in place of a error stack trace.

<customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
<error statusCode="403" redirect="NoAccess.htm" />
<error statusCode="404" redirect="FileNotFound.htm" />
</customErrors>
-->[/xml]
Bây giờ bạn xóa tất cả các code trong phần đó và thay bằng dòng này:
[xml]<customErrors mode="Off"></customErrors>[/xml]

Sau đó đăng ký một hosting SOmeeFree, vào trang SOMEE.COM
Đăng ký và kích hoạt thành công tài khoản, sau đó bạn post lên hosting cả cái WebService này.
Bạn có thể xem cái webservice mình đã làm:
vbChat.7z
(35.32 KiB) Đã tải 448 lần
Sad eyes never lie :((

Hình đại diện của người dùng
nhochoclaptrinh
Thành viên danh dự
Thành viên danh dự
Bài viết: 514
Ngày tham gia: T.Bảy 28/05/2011 12:10 pm
Has thanked: 15 time
Been thanked: 83 time

Re: Tạo một ứng dụng vb chat cho 2 người

Gửi bàigửi bởi nhochoclaptrinh » CN 16/10/2011 10:48 am

Phần 5: TẠO ỨNG DỤNG VB CHAT kết Nối với WEBSERVICE
Mấy hôm nay, bận nên không viết bài chi tiết được bạn hãy down về xem nhé,
:D
Tập tin đính kèm
vbChatClient.7z
(57.13 KiB) Đã tải 503 lần
Sad eyes never lie :((

Hình đại diện của người dùng
tungblt
Điều hành viên
Điều hành viên
Bài viết: 549
Ngày tham gia: T.Hai 22/12/2008 5:22 pm
Đến từ: quy nhơn
Has thanked: 6 time
Been thanked: 76 time
Liên hệ:

Re: Tạo một ứng dụng vb chat cho 2 người

Gửi bàigửi bởi tungblt » T.Ba 15/11/2011 8:26 pm

có code php k bạn .. asp.net k test dc

Hình đại diện của người dùng
nhochoclaptrinh
Thành viên danh dự
Thành viên danh dự
Bài viết: 514
Ngày tham gia: T.Bảy 28/05/2011 12:10 pm
Has thanked: 15 time
Been thanked: 83 time

Re: Tạo một ứng dụng vb chat cho 2 người

Gửi bàigửi bởi nhochoclaptrinh » T.Tư 16/11/2011 11:01 pm

Mình thì ko rành php lắm, nhưng code asp.net trên đã test và OK hết rồi, (sao lại test ko được, cần phải cài visual web developer).
Mình đã đóng gói thành file exe bạn có thể đem về và chat thử nhé (chat vs mình :D ) !
Tập tin đính kèm
chatdemo.7z
sạch virrus
(19.72 KiB) Đã tải 348 lần
Sad eyes never lie :((

Hình đại diện của người dùng
tungblt
Điều hành viên
Điều hành viên
Bài viết: 549
Ngày tham gia: T.Hai 22/12/2008 5:22 pm
Đến từ: quy nhơn
Has thanked: 6 time
Been thanked: 76 time
Liên hệ:

Re: Tạo một ứng dụng vb chat cho 2 người

Gửi bàigửi bởi tungblt » T.Sáu 18/11/2011 8:59 am

Test thành công.. để mình test lại trên some xem sao

Hình đại diện của người dùng
tungblt
Điều hành viên
Điều hành viên
Bài viết: 549
Ngày tham gia: T.Hai 22/12/2008 5:22 pm
Đến từ: quy nhơn
Has thanked: 6 time
Been thanked: 76 time
Liên hệ:

Re: Tạo một ứng dụng vb chat cho 2 người

Gửi bàigửi bởi tungblt » T.Sáu 18/11/2011 9:20 am

k được ... bị lỗi file web.config

Server Error in '/' Application.

Configuration Error

Description: An error occurred during the processing of a configuration file required to service this request. Please review the specific error details below and modify your configuration file appropriately.

Parser Error Message: It is an error to use a section registered as allowDefinition='MachineToApplication' beyond application level. This error can be caused by a virtual directory not being configured as an application in IIS.

Source Error:


Line 84: ASP.NET to identify an incoming user.
Line 85: -->
Line 86: <authentication mode="Windows" />
Line 87: <!--
Line 88: The <customErrors> section enables configuration

Source File: d:\DZHosts\LocalUser\qn20\www.qnrap.somee.com\chat\web.config Line: 86

Version Information: Microsoft .NET Framework Version:2.0.50727.5448; ASP.NET Version:2.0.50727.5420

Hình đại diện của người dùng
tungblt
Điều hành viên
Điều hành viên
Bài viết: 549
Ngày tham gia: T.Hai 22/12/2008 5:22 pm
Đến từ: quy nhơn
Has thanked: 6 time
Been thanked: 76 time
Liên hệ:

Re: Tạo một ứng dụng vb chat cho 2 người

Gửi bàigửi bởi tungblt » T.Sáu 18/11/2011 9:49 am

cậu viết dc phần phân trang k ? tui làm dc unicode r :)

Hình đại diện của người dùng
bangnhatquang68
Guru
Guru
Bài viết: 791
Ngày tham gia: T.Ba 26/01/2010 12:44 pm
Đến từ: Vĩ tuyến 17
Has thanked: 20 time
Been thanked: 38 time
Liên hệ:

Re: Tạo một ứng dụng vb chat cho 2 người

Gửi bàigửi bởi bangnhatquang68 » T.Sáu 18/11/2011 1:45 pm

chuyển bài sang .net dc ko bạn. mình thấy toàn code họ .net phải vb6 đâu :D
Mời anh em lên facebook giao lưu nào!
http://www.facebook.com/groups/145823032176611/

Hình đại diện của người dùng
nhochoclaptrinh
Thành viên danh dự
Thành viên danh dự
Bài viết: 514
Ngày tham gia: T.Bảy 28/05/2011 12:10 pm
Has thanked: 15 time
Been thanked: 83 time

Re: Tạo một ứng dụng vb chat cho 2 người

Gửi bàigửi bởi nhochoclaptrinh » T.Bảy 19/11/2011 12:34 pm

@tungblt: Cái lỗi là do bạn đặt cả project vào thư mục chat, bạn cần đặt cái project vào thư mục gốc, như thế này:www.qnrap.somee.com\web.config, đừng có bỏ tất cả vào thư mục chat, bỏ vào cái thư mục gốc ấy !
@bangnhatquang68: em viết topic này chủ yếu là .net hỗ trợ cho cái client chat vb6 thôi, nhưng cái vb6 em cho hết vào một file nén rồi, còn nếu qua .net thì dùng client vb.net thì sẽ đơn giản hơn nhiều ! em dùng vb6 để chạy tốt mà không cần dotnetframework
Sad eyes never lie :((

Hình đại diện của người dùng
tungblt
Điều hành viên
Điều hành viên
Bài viết: 549
Ngày tham gia: T.Hai 22/12/2008 5:22 pm
Đến từ: quy nhơn
Has thanked: 6 time
Been thanked: 76 time
Liên hệ:

Re: Tạo một ứng dụng vb chat cho 2 người

Gửi bàigửi bởi tungblt » T.Bảy 19/11/2011 5:48 pm

à .. cậu viết dùm mấy cái code del đi .. mỗi lần muốn xóa là phải del cái db ..up cái khác :-<

Hình đại diện của người dùng
nhochoclaptrinh
Thành viên danh dự
Thành viên danh dự
Bài viết: 514
Ngày tham gia: T.Bảy 28/05/2011 12:10 pm
Has thanked: 15 time
Been thanked: 83 time

Re: Tạo một ứng dụng vb chat cho 2 người

Gửi bàigửi bởi nhochoclaptrinh » T.Hai 21/11/2011 7:28 am

Nếu thế thì bạn cần tạo một cột ID trong bảng tin nhắn, dựa vào ID để xóa tin nhắn
Trong Class thao thác với CSDL bạn cho thêm code sau:
  1.     'Tìm kiếm đối tượng
  2.     Public Function FindData(ByVal sField As String, ByVal sValue As String) As Boolean
  3.         rs.MoveFirst() : rs.Find(sField & "='" & sValue & "'")
  4.         If Not rs.EOF Then Return True Else Return False
  5.     End Function
  6.  

code ở server:
  1.     <WebMethod()> _
  2.     public sub RemoveMsg( Byval  ID as string)
  3.         Kernel = New SmartKernel(Server.MapPath("db.mdb"))
  4.         Kernel.DataConnecting()
  5.         Kernel.OpenTable("tbl_chat")
  6.         If Kernel.RecCount > 0 Then
  7.             If Kernel.FindData("ID", ID)=true then
  8.                 kernel.DeleteFields()
  9.             end if
  10.         end if
  11.     end sub
  12.  
Sad eyes never lie :((

Hình đại diện của người dùng
NTN
Thành viên tâm huyết
Thành viên tâm huyết
Bài viết: 476
Ngày tham gia: T.Tư 05/02/2014 3:43 pm
Đến từ: Cao Lãnh, Đồng Tháp,Việt Nam
Has thanked: 19 time
Been thanked: 7 time
Liên hệ:

Re: Tạo một ứng dụng vb chat cho 2 người

Gửi bàigửi bởi NTN » T.Năm 06/02/2014 7:53 pm

Theo mình nghĩ thì sử dụng qua cổng COM1 và COM2 của máy tình thì được đấy giống như TeamViewer ấy !


Quay về “[VB] Bài viết hướng dẫn”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.0 khách