24/05/2018, 19:25

Lớp TCPListener

TCPListerner 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 (Ví dụ như SMTP Server, FTP Server, DNS Server, POP3 Server hay server tự định nghĩa ….). Ứng dụng server khác với ứng dụng Client ở chỗ nó luôn luôn ...

TCPListerner 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 (Ví dụ như SMTP Server, FTP Server, DNS Server, POP3 Server hay server tự định nghĩa ….). Ứng dụng server khác với ứng dụng Client ở chỗ nó luôn luôn thực hiện lắng nghe và chấp nhận các kết nối đến từ Client.

Constructor method
Name Description
TcpListe ner (Port: Int32) Tạo một TcpListener và lắng nghe tại cổng chỉ định.
TcpListener (IPEndPoint) Tạo một TcpListener với giá trị Endpoint truyền vào.
TcpListener (IPAddress, Port: 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.

Public Methods (see also Protected Methods )

  Name Description
AcceptSocket Chấp nhận một yêu cầu kết nối đang chờ.
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 lệnh này cho đến khi nào có một kết nối đến – “Blocking”)
Pending Cho biết liệu có kết nối nào đang chờ đợi 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.

Khi AcceptTcpCLient, th­êng t¹o riªng mét Client ®Ó giao tiÕp víi client võa ®­îc Accept

Tạo một server trong đó, khi có một client kết nối đến thì server chuyển xâu đó thành chữ HOA và gửi trả lại cho Client.

Listing 3: Xây dựng một ứng dụng Server đơn giản

Imports System.Net.Sockets

Imports System.Net

Imports System.IO

Imports System.Threading

Public Class frmServer

Dim TCPServer As New System.Net.Sockets.TcpListener(21)

Dim Thoat As Boolean = False

Dim Clients(100) As TcpClient

Dim CurrClient As Integer = 0

-------------------------------------------------------------------------------------------------------------------------

Sub Xử_Lý_Kết_Nối()

Dim LastClient As Integer = CurrClient - 1

Dim Con As TcpClient = Clients(LastClient)

Dim Doc As New StreamReader(Con.GetStream)

Dim Ghi As New StreamWriter(Con.GetStream)

Dim S As String

While Thoat = False

Application.DoEvents()

If Doc.EndOfStream = False Then

S = Doc.ReadLine

'MsgBox("Client đã gửi xâu: " & S)

'// Xử lý tại đây: (Ví dụ chuyển thành chữ HOA)

S = S.ToUpper

Ghi.WriteLine(S) '//Gửi lại cho Client...

Ghi.Flush()

End If

End While

End Sub

-------------------------------------------------------------------------------------------------------------------------

Sub Nghe_Kết_Nối()

Do While Thoat = False

Clients(CurrClient) = TCPServer.AcceptTcpClient()

CurrClient += 1

'MsgBox("Đã có " & (CurrClient + 1) & " kết nối !")

Dim Th As New Thread(AddressOf Xử_Lý_Kết_Nối)

Th.Start()

Loop

End Sub

-------------------------------------------------------------------------------------------------------------------------

Private Sub frmClose(ByVal s As Object, ByVal e As FormClosingEventArgs) Handles Me.FormClosing

Thoat = True

End Sub

-------------------------------------------------------------------------------------------------------------------------

Private Sub Form1_Load(ByVal s As Object, ByVal e As EventArgs) Handles Me.Load

TCPServer.Start()

Nghe_Kết_Nối()

End Sub

End Class

Lưu ý: Vì phương thức AcceptTCPClient() luôn bị khóa (blocking) cho đến khi nào có một kết nối đến. Do vậy, để ứng dụng có thể thoát bình thường, ta nên thêm lệnh sau vào trước dòng Clients(CurrClient) = TCPServer.AcceptTcpClient():

If TCPServer.Pending = False Then Continue Do

Tức là ta chỉ AcceptTcpClient() khi có kết nối đến !

0