65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 DotNet 的聊天应用程序

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.91/5 (21投票s)

2007 年 7 月 5 日

1分钟阅读

viewsIcon

93039

downloadIcon

20067

使用 VB.Net (并发服务器) 的聊天应用程序

下载 ServerForm.zip - 192.9 KB

下载 ClientForm.zip - 196.7 KB

Screenshot - Server_Form1.jpg

Screenshot - Client_after_Conn.jpg

引言

使用 VB.Net 中的套接字编程实现的简单聊天应用程序。此应用程序使用 TCP 协议进行通信。因此,它是一种面向连接且可靠的服务……

背景

主要背景是 VB.NET 中的套接字编程,它使用 System.Net.Sockets 命名空间…

客户端套接字::: TcpClient 类

服务器套接字:: TcpListner 类

套接字是 IP_Address 和 PortNo 的组合。当我们创建套接字时,必须提供 IP、Port No 和协议…

这里 DotNet 提供了 TcpClient 类,默认使用 TCP 协议。我们只需要提供 IP 和 PortNo 即可…

同样,对于 TcpListner 类也是如此……

使用代码

Connect 子例程会将连接请求发送到给定 ip 的服务器

连接接收函数使用线程启动…因为接收函数会进入无限循环,所以我们必须使用线程启动接收函数。否则,您的主进程将进入无限循环…

// Public Sub Connect()
        Try
            ipHostinfo = Dns.Resolve(Txtserver.Text)
            ipAdd = ipHostinfo.AddressList(0)
            remoteEP = New IPEndPoint(ipAdd, 11000)
            sender.Connect(remoteEP)
            th = New System.Threading.Thread(AddressOf Receive)
            th.Start()
            i = 1
            MessageBox.Show("Client Connected With Server->" + Txtserver.Text)
        Catch ex As Exception
            MessageBox.Show(ex.Message)

        End Try
        
    End Sub

如果我们使用多线程架构,我们会遇到一个主要问题,称为:跨线程问题

使用委托函数解决此问题。这里是解决方案

 If Me.List.InvokeRequired Then
            Dim d As New SetDisplay(AddressOf Proccessdata)
            Me.Invoke(d, New Object() {str})
        Else
            Me.List.Items.Add(str)
Public Sub Receive()
        Dim bytes(100000) As Byte
        Dim bytesRec As Integer
   A:      While True
            bytes = New Byte(100000) {}
            bytesRec = sender.Receive(bytes)
            If bytesRec > 0 Then
                Data = Encoding.ASCII.GetString(bytes, 0, bytesRec)
                Exit While
            End If
           End While
        'List.Items.Add(Data)
        'MessageBox.Show(Data)
        Proccessdata(Data)
        ActionData(Data)
        GoTo A
End Sub
        Try
            msg = Encoding.ASCII.GetBytes(Txtmsg.Text)
            Me.sender.Send(msg)
            Txtmsg.Text = ""
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try

关注点


Screenshot - Cd_Drive.jpg

这是客户端屏幕的一部分。一个有趣的点是我们可以从客户端表单控制服务器光驱…

您可以在服务器机器上从客户端屏幕打开记事本、画笔、计算器……

您可以从服务器锁定和释放客户端电脑的鼠标……

您可以从服务器关闭和重启客户端电脑……

您可以从服务器捕获客户端屏幕的照片……

历史

在此处保持您所做的任何更改或改进的实时更新。

© . All rights reserved.