原创 用Socket做简单聊天程序(VB.net)(转帖)

2008-11-15 10:58 4729 7 7 分类: 软件与OS

http://blog.csdn.net/chendazhi/archive/2006/05/18/744130.aspx



有位网友发贴问我一个聊天的问题,不好拒绝;也看到最近VB.net版问这个的人很多,就写了一个放在这里。


本例只适合初学用Socket编程的人,因而力求简单,让老鸟见笑了J


另本示例用的是vs2005


1、服务端


Imports System.Net<?XML:NAMESPACE PREFIX = O />


Imports System.Net.Sockets


Imports System.Threading


Imports System.Text


Imports System.Diagnostics


 


Public Class frmServer


 


    '服务端的Socket


    Dim listener As Socket


    '与客户端会话的Socket


    Dim mySocket As Socket


    '服务端的运行状态


    Dim IsRun As Boolean = False


    '监听接收数据线程


    Dim myThread As Thread


 


    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load


        myThread = New Thread(AddressOf Listen)


        myThread.Start()


    End Sub


 


    Public Sub Listen()


        Dim bytes() As Byte = New [Byte](1024) {}


        Dim data As String = String.Empty


        Dim tokens() As String


 


        Dim localEndPoint As New IPEndPoint(Net.IPAddress.Parse("127.0.0.1"), 11000)


        '初始化socket


        listener = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)


        '绑定端口


        listener.Bind(localEndPoint)


        '开始监听


        listener.Listen(10)


 


        BeginInvoke(New EventHandler(AddressOf AddInfo), "服务端已启动,正在等待连接......")


 


        mySocket = listener.Accept()


        IsRun = True


 


        While True


            Dim bytesRec As Integer = mySocket.Receive(bytes)


            data = Encoding.UTF8.GetString(bytes, 0, bytesRec)


 


            tokens = data.Trim.Split("|")


            Select Case tokens(0) '分析接收到的数据,可自己定义更多一些


                Case "Chat"


                    BeginInvoke(New EventHandler(AddressOf AddInfo), tokens(1))  'Invoke保证线程安全


                Case "Exit"


                    IsRun = False


                    BeginInvoke(New EventHandler(AddressOf AddInfo), tokens(1))  'Invoke保证线程安全


                    mySocket.Shutdown(SocketShutdown.Both)


                    mySocket.Close()


                    Exit Sub


            End Select


        End While


 


    End Sub


 


    '发送信息


    Private Sub btnSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSend.Click


        Dim msg As Byte() = Encoding.UTF8.GetBytes("Chat|" + TextBox1.Text)


        mySocket.Send(msg)


        ListBox1.Items.Add("本地信息: " + TextBox1.Text)


 


        TextBox1.Text = ""


    End Sub


 


    '非UI线程调用窗体控件,保证线程安全。与聊天实现无关。


    Sub AddInfo(ByVal sender As System.Object, ByVal e As System.EventArgs)


        ListBox1.Items.Add("远程信息: " + sender.ToString)


    End Sub


 


    '关闭窗口时发关退出信息并清理资源


    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing


        If IsRun Then


            Dim msg As Byte() = Encoding.UTF8.GetBytes("Exit|服务端退出: " + Me.Handle.ToString)


            Dim bytesSent As Integer = mySocket.Send(msg)


        End If


        listener.Close()


        mySocket = Nothing


        myThread.Abort()


    End Sub


 


End Class


 


2、客户端


Imports System.Net


Imports System.Net.Sockets


Imports System.Text


Imports System.Threading


 


Public Class frmClient


    '客户端Socket


    Dim cliSocket As Socket


    '连接状态


    Dim IsConnected As Boolean = False


    '接收信息线程


    Dim myThread As Thread


 


    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load


        Dim remoteEP As New IPEndPoint(Net.IPAddress.Parse("127.0.0.1"), 11000)


        cliSocket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)


        Try


            cliSocket.Connect(remoteEP)


            ListBox1.Items.Add("连接服务端成功!")


            IsConnected = True


 


            myThread = New Thread(AddressOf ReciveMsg)


            myThread.Start()


        Catch ex As Exception


            ListBox1.Items.Add(ex.Message)


        End Try


    End Sub


 


    Sub ReciveMsg()


        Dim bytes() As Byte = New Byte(1024) {}


        Dim data As String = String.Empty


        Dim tokens() As String


 


        While True


            Dim bytesRec As Integer = cliSocket.Receive(bytes)


            data = Encoding.UTF8.GetString(bytes, 0, bytesRec)


 


            tokens = data.Trim.Split("|")


            Select Case tokens(0) '分析接收到的数据,可自己定义更多一些


                Case "Exit"


                    IsConnected = False


                    BeginInvoke(New EventHandler(AddressOf AddInfo), tokens(1))   'Invoke保证线程安全


                    cliSocket.Shutdown(SocketShutdown.Both)


                    cliSocket.Close()


                    Exit Sub


                Case "Chat"


                    BeginInvoke(New EventHandler(AddressOf AddInfo), tokens(1))   'Invoke保证线程安全


            End Select


 


        End While


 


    End Sub


 


    '发送信息


    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click


        Dim msg As Byte() = Encoding.UTF8.GetBytes("Chat|" + TextBox1.Text)


        Dim bytesSent As Integer = cliSocket.Send(msg)


 


        ListBox1.Items.Add("本地信息: " + TextBox1.Text)


        TextBox1.Text = ""


    End Sub


 


    '非UI线程调用窗体控件,保证线程安全。与聊天实现无关。


    Sub AddInfo(ByVal sender As System.Object, ByVal e As System.EventArgs)


        ListBox1.Items.Add("远程信息: " + sender.ToString)


    End Sub


 


    '关闭窗口时发关退出信息并清理资源


    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing


        If IsConnected Then


            Dim msg As Byte() = Encoding.UTF8.GetBytes("Exit|客户端退出: " + Me.Handle.ToString)


            Dim bytesSent As Integer = cliSocket.Send(msg)


            myThread.Abort()


        End If


 


    End Sub


End Class


 


源程序下载:



VB聊天程序.rar



PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
7
关闭 站长推荐上一条 /3 下一条