Socket Network VB.Net Tutorial

' Quote  from Book
' Visual Basic.net Programming
' Publisher Water Publisher
' China, Beijing
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports System.IO
Imports System.Threading
Imports System.Windows.Forms
public class Pop3Receive
   public Shared Sub Main
        Application.Run(New Form1)
   End Sub
End class
Public Class Form1 : Inherits System.Windows.Forms.Form
    Public Sub New()
        MyBase.New()
        InitializeComponent()
    End Sub
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub
    Private components As System.ComponentModel.IContainer
    Friend WithEvents txtMailContent As System.Windows.Forms.TextBox
    Friend WithEvents btnMailReceive As System.Windows.Forms.Button
    Friend WithEvents Label1 As System.Windows.Forms.Label
    Friend WithEvents Label2 As System.Windows.Forms.Label
    Friend WithEvents Label3 As System.Windows.Forms.Label
    Friend WithEvents Label4 As System.Windows.Forms.Label
    Friend WithEvents txtID As System.Windows.Forms.TextBox
    Friend WithEvents txtPassWord As System.Windows.Forms.TextBox
    Friend WithEvents txtServer As System.Windows.Forms.TextBox
    Friend WithEvents txtPort As System.Windows.Forms.TextBox
    Friend WithEvents lstMailList As System.Windows.Forms.ListBox
    Friend WithEvents Label5 As System.Windows.Forms.Label
    Friend WithEvents txtNumber As System.Windows.Forms.TextBox
    Friend WithEvents Label6 As System.Windows.Forms.Label
    Friend WithEvents txtSize As System.Windows.Forms.TextBox
    Friend WithEvents btnDelete As System.Windows.Forms.Button
    Friend WithEvents btnQUIT As System.Windows.Forms.Button
     Private Sub InitializeComponent()
        Me.lstMailList = New System.Windows.Forms.ListBox()
        Me.txtMailContent = New System.Windows.Forms.TextBox()
        Me.txtID = New System.Windows.Forms.TextBox()
        Me.txtServer = New System.Windows.Forms.TextBox()
        Me.txtPort = New System.Windows.Forms.TextBox()
        Me.txtPassWord = New System.Windows.Forms.TextBox()
        Me.btnMailReceive = New System.Windows.Forms.Button()
        Me.Label1 = New System.Windows.Forms.Label()
        Me.Label2 = New System.Windows.Forms.Label()
        Me.Label3 = New System.Windows.Forms.Label()
        Me.Label4 = New System.Windows.Forms.Label()
        Me.Label5 = New System.Windows.Forms.Label()
        Me.txtNumber = New System.Windows.Forms.TextBox()
        Me.txtSize = New System.Windows.Forms.TextBox()
        Me.Label6 = New System.Windows.Forms.Label()
        Me.btnDelete = New System.Windows.Forms.Button()
        Me.btnQUIT = New System.Windows.Forms.Button()
        Me.SuspendLayout()
        '
        'lstMailList
        '
        Me.lstMailList.ItemHeight = 12
        Me.lstMailList.Location = New System.Drawing.Point(20, 48)
        Me.lstMailList.Name = "lstMailList"
        Me.lstMailList.Size = New System.Drawing.Size(666, 112)
        Me.lstMailList.TabIndex = 8
        '
        'txtMailContent
        '
        Me.txtMailContent.Location = New System.Drawing.Point(20, 176)
        Me.txtMailContent.Multiline = True
        Me.txtMailContent.Name = "txtMailContent"
        Me.txtMailContent.ScrollBars = System.Windows.Forms.ScrollBars.Both
        Me.txtMailContent.Size = New System.Drawing.Size(666, 344)
        Me.txtMailContent.TabIndex = 9
        Me.txtMailContent.Text = ""
        '
        'txtID
        '
        Me.txtID.Location = New System.Drawing.Point(727, 40)
        Me.txtID.Name = "txtID"
        Me.txtID.Size = New System.Drawing.Size(164, 21)
        Me.txtID.TabIndex = 0
        Me.txtID.Text = ""
        '
        'txtServer
        '
        Me.txtServer.Location = New System.Drawing.Point(727, 200)
        Me.txtServer.Name = "txtServer"
        Me.txtServer.Size = New System.Drawing.Size(164, 21)
        Me.txtServer.TabIndex = 3
        Me.txtServer.Text = ""
        '
        'txtPort
        '
        Me.txtPort.Location = New System.Drawing.Point(727, 144)
        Me.txtPort.Name = "txtPort"
        Me.txtPort.Size = New System.Drawing.Size(164, 21)
        Me.txtPort.TabIndex = 2
        Me.txtPort.Text = "110"
        '
        'txtPassWord
        '
        Me.txtPassWord.Location = New System.Drawing.Point(727, 93)
        Me.txtPassWord.Name = "txtPassWord"
        Me.txtPassWord.PasswordChar = Microsoft.VisualBasic.ChrW(42)
        Me.txtPassWord.Size = New System.Drawing.Size(164, 21)
        Me.txtPassWord.TabIndex = 1
        Me.txtPassWord.Text = ""
        '
        'btnMailReceive
        '
        Me.btnMailReceive.Location = New System.Drawing.Point(727, 240)
        Me.btnMailReceive.Name = "btnMailReceive"
        Me.btnMailReceive.Size = New System.Drawing.Size(164, 24)
        Me.btnMailReceive.TabIndex = 6
        Me.btnMailReceive.Text = "Check Mail"
        '
        'Label1
        '
        Me.Label1.Location = New System.Drawing.Point(727, 16)
        Me.Label1.Name = "Label1"
        Me.Label1.Size = New System.Drawing.Size(143, 16)
        Me.Label1.TabIndex = 7
        Me.Label1.Text = "Account"
        '
        'Label2
        '
        Me.Label2.Location = New System.Drawing.Point(727, 176)
        Me.Label2.Name = "Label2"
        Me.Label2.Size = New System.Drawing.Size(143, 16)
        Me.Label2.TabIndex = 8
        Me.Label2.Text = "Server"
        '
        'Label3
        '
        Me.Label3.Location = New System.Drawing.Point(727, 128)
        Me.Label3.Name = "Label3"
        Me.Label3.Size = New System.Drawing.Size(143, 16)
        Me.Label3.TabIndex = 9
        Me.Label3.Text = "port"
        '
        'Label4
        '
        Me.Label4.Location = New System.Drawing.Point(727, 72)
        Me.Label4.Name = "Label4"
        Me.Label4.Size = New System.Drawing.Size(143, 16)
        Me.Label4.TabIndex = 10
        Me.Label4.Text = "Password"
        '
        'Label5
        '
        Me.Label5.Location = New System.Drawing.Point(730, 275)
        Me.Label5.Name = "Label5"
        Me.Label5.Size = New System.Drawing.Size(153, 13)
        Me.Label5.TabIndex = 11
        Me.Label5.Text = "Total"
        '
        'txtNumber
        '
        Me.txtNumber.Location = New System.Drawing.Point(730, 299)
        Me.txtNumber.Name = "txtNumber"
        Me.txtNumber.Size = New System.Drawing.Size(153, 21)
        Me.txtNumber.TabIndex = 4
        Me.txtNumber.Text = ""
        '
        'txtSize
        '
        Me.txtSize.Location = New System.Drawing.Point(731, 355)
        Me.txtSize.Name = "txtSize"
        Me.txtSize.Size = New System.Drawing.Size(153, 21)
        Me.txtSize.TabIndex = 5
        Me.txtSize.Text = ""
        '
        'Label6
        '
        Me.Label6.Location = New System.Drawing.Point(731, 331)
        Me.Label6.Name = "Label6"
        Me.Label6.Size = New System.Drawing.Size(153, 13)
        Me.Label6.TabIndex = 13
        Me.Label6.Text = "Size(k)"
        '
        'btnDelete
        '
        Me.btnDelete.Location = New System.Drawing.Point(492, 8)
        Me.btnDelete.Name = "btnDelete"
        Me.btnDelete.Size = New System.Drawing.Size(194, 24)
        Me.btnDelete.TabIndex = 7
        Me.btnDelete.Text = "Delete"
        '
        'btnQUIT
        '
        Me.btnQUIT.Location = New System.Drawing.Point(732, 395)
        Me.btnQUIT.Name = "btnQUIT"
        Me.btnQUIT.Size = New System.Drawing.Size(164, 24)
        Me.btnQUIT.TabIndex = 6
        Me.btnQUIT.Text = "Quit"
        '
        'Form1
        '
        Me.AutoScaleBaseSize = New System.Drawing.Size(6, 14)
        Me.ClientSize = New System.Drawing.Size(911, 533)
        Me.Controls.AddRange(New System.Windows.Forms.Control() {Me.btnQUIT, Me.btnDelete, Me.txtSize, Me.Label6, Me.txtNumber, Me.Label5, Me.Label4, Me.Label3, Me.Label2, Me.Label1, Me.btnMailReceive, Me.txtPassWord, Me.txtPort, Me.txtServer, Me.txtID, Me.txtMailContent, Me.lstMailList})
        Me.Name = "Form1"
        Me.Text = "Form1"
        Me.ResumeLayout(False)
    End Sub
    Dim myTcpClient As New TcpClient()
    Dim myNetworkStream As NetworkStream
    Dim blnDelete As Boolean = False
    Private Sub btnMailReceive_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnMailReceive.Click
        Dim strMessage
        ConnectToMailServer()
        Dim t As New Thread(AddressOf GetMailNumber)
        t.Start()
    End Sub
    Public Sub ConnectToMailServer()
        Try
            Dim strReturnMessage As String
            myTcpClient.Connect(txtServer.Text, Integer.Parse(txtPort.Text))
            myNetworkStream = myTcpClient.GetStream()
            Dim myStreamReader As New StreamReader(myNetworkStream)
            strReturnMessage = myStreamReader.ReadLine() + vbCrLf
            strReturnMessage += SendCommand(myNetworkStream, "USER " + txtID.Text) + vbCrLf
            strReturnMessage += SendCommand(myNetworkStream, "PASS " + txtPassWord.Text) + vbCrLf
            MessageBox.Show(strReturnMessage)
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub
    Private Sub GetMailNumber()
        Dim strMessage(2) As String
        Dim strMessageLine As String
        strMessageLine = SendCommand(myNetworkStream, "STAT")
        strMessage = strMessageLine.Split(" ")
        txtNumber.Text = strMessage(1)
        txtSize.Text = (Long.Parse(strMessage(2)) / 1000).ToString
        GetMailList(Long.Parse(strMessage(1)))
    End Sub
    Private Sub GetMailList(ByVal lngNumber As Long)
        Dim strReturnMessage As String
        Dim lngLoop As Long
        Dim lngIndex As Long
        Try
            For lngLoop = 0 To lngNumber - 1
                lngIndex = lngLoop + 1
                strReturnMessage = "[" + lngIndex.ToString + "]" + SendCommand(myNetworkStream, "LIST " + lngIndex.ToString)
                lstMailList.Items.Add(strReturnMessage)
            Next
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub
    Private Function SendCommand(ByRef pNetStream As NetworkStream, ByVal pstrCommand As String) As String
        Try
            Dim strCommand = pstrCommand + vbCrLf
            Dim bteCommand() As Byte = Encoding.ASCII.GetBytes(strCommand)
            Dim myStreamReader As StreamReader
            Dim sstrLine As String
            Dim strLine As String
            pNetStream.Write(bteCommand, 0, bteCommand.Length)
            myStreamReader = New StreamReader(pNetStream)
            strLine = myStreamReader.ReadLine()
            Return strLine
        Catch ex As Exception
            Return ex.Message
        End Try
    End Function
    Private Sub lstMailList_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lstMailList.SelectedIndexChanged
        If blnDelete = False Then
            Dim t As New Thread(AddressOf GetMessage)
            t.Start()
        End If
    End Sub
    Private Sub GetMessage()
        Dim strMessageContent As String = ""
        Dim intRead As Integer
        Dim strCommand = "RETR " + (lstMailList.SelectedIndex + 1).ToString + vbCrLf
        Dim bteCommand() As Byte = Encoding.ASCII.GetBytes(strCommand)
        Dim myStreamReader As StreamReader
        txtMailContent.Text = ""
        Try
            myNetworkStream.Write(bteCommand, 0, bteCommand.Length)
            myStreamReader = New StreamReader(myNetworkStream)
            AnalyMessage(myStreamReader)
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub
    Private Sub AnalyMessage(ByVal pStreamReader As StreamReader)
        Dim strReadLine As String = ""
        Dim sstrReadLine As String = ""
        Do While (sstrReadLine = Nothing Or sstrReadLine.Length = 0)
            sstrReadLine = pStreamReader.ReadLine
        Loop
        txtMailContent.Text += vbCrLf + "--- Header --" + vbCrLf
        Do While sstrReadLine.Trim.Length <> 0
            sstrReadLine = pStreamReader.ReadLine
            txtMailContent.Text += vbCrLf + sstrReadLine
        Loop
        txtMailContent.Text += vbCrLf + "--- Body --" + vbCrLf
        Do
            sstrReadLine = pStreamReader.ReadLine
            If sstrReadLine.Trim() = "." Then Exit Do
            If sstrReadLine <> Nothing Then txtMailContent.Text += vbCrLf + sstrReadLine
        Loop
    End Sub
    Private Sub btnDelete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDelete.Click
        Dim strReturnMessage As String
        Dim intDelete As Integer
        intDelete = lstMailList.SelectedIndex + 1
        Try
            strReturnMessage = SendCommand(myNetworkStream, "DELE " + intDelete.ToString)
            txtMailContent.Text = strReturnMessage
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
        blnDelete = True
        lstMailList.Items.RemoveAt(intDelete - 1)
        blnDelete = False
    End Sub
    Private Sub btnQUIT_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnQUIT.Click
        Dim strReturnMessage As String
        Try
            strReturnMessage = SendCommand(myNetworkStream, "QUIT")
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    End Sub
End Class