客户端到客户端直接通过服务器vb.net进行聊天

时间:2015-04-28 06:44:58

标签: vb.net sockets

使用套接字编程,我正在使用vb.net开发一个聊天应用程序。我已经设法使用服务器和多客户端建立群聊。现在我想通过服务器建立客户端直接聊天,并希望列出所有连接的客户端。如果有人能指导我会非常有帮助。

Imports System.Net.Sockets
Imports System.Text
Module Module1
Dim clientsList As New Hashtable
Sub Main()
    Dim serverSocket As New TcpListener(8888)
    Dim clientSocket As TcpClient
    Dim counter As Integer

    serverSocket.Start()
    msg("Chat Server Started ....")
    counter = 0

    While (True)
        counter += 1
        clientSocket = serverSocket.AcceptTcpClient()

        Dim bytesFrom(10024) As Byte
        Dim dataFromClient As String

        Dim networkStream As NetworkStream = _
        clientSocket.GetStream()
        networkStream.Read(bytesFrom, 0, CInt(clientSocket.ReceiveBufferSize))
        dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom)
        dataFromClient = _
        dataFromClient.Substring(0, dataFromClient.IndexOf("$"))

        clientsList(dataFromClient) = clientSocket

        broadcast(dataFromClient + " Joined ", dataFromClient, False)

        msg(dataFromClient + " Joined chat room ")
        Dim client As New handleClinet
        client.startClient(clientSocket, dataFromClient, clientsList)
    End While

    clientSocket.Close()
    serverSocket.Stop()
    msg("exit")
    Console.ReadLine()
End Sub

Sub msg(ByVal mesg As String)
    mesg.Trim()
    Console.WriteLine(" >> " + mesg)
End Sub
Private Sub broadcast(ByVal msg As String, _
ByVal uName As String, ByVal flag As Boolean)
    Dim Item As DictionaryEntry
    For Each Item In clientsList
        Dim broadcastSocket As TcpClient
        broadcastSocket = CType(Item.Value, TcpClient)
        Dim broadcastStream As NetworkStream = _
                broadcastSocket.GetStream()
        Dim broadcastBytes As [Byte]()

        If flag = True Then
            broadcastBytes = Encoding.ASCII.GetBytes(uName + " says : " + msg)
        Else
            broadcastBytes = Encoding.ASCII.GetBytes(msg)
        End If

        broadcastStream.Write(broadcastBytes, 0, broadcastBytes.Length)
        broadcastStream.Flush()
    Next
End Sub

Public Class handleClinet
    Dim clientSocket As TcpClient
    Dim clNo As String
    Dim clientsList As Hashtable

    Public Sub startClient(ByVal inClientSocket As TcpClient, _
    ByVal clineNo As String, ByVal cList As Hashtable)
        Me.clientSocket = inClientSocket
        Me.clNo = clineNo
        Me.clientsList = cList
        Dim ctThread As Threading.Thread = New Threading.Thread(AddressOf doChat)
        ctThread.Start()
    End Sub

    Private Sub doChat()
        'Dim infiniteCounter As Integer
        Dim requestCount As Integer
        Dim bytesFrom(10024) As Byte
        Dim dataFromClient As String
        Dim sendBytes As [Byte]()
        Dim serverResponse As String
        Dim rCount As String
        requestCount = 0

        While (True)
            Try
                requestCount = requestCount + 1
                Dim networkStream As NetworkStream = _
                        clientSocket.GetStream()
                networkStream.Read(bytesFrom, 0, CInt(clientSocket.ReceiveBufferSize))
                dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom)
                dataFromClient = _
        dataFromClient.Substring(0, dataFromClient.IndexOf("$"))
                msg("From client - " + clNo + " : " + dataFromClient)
                rCount = Convert.ToString(requestCount)

                broadcast(dataFromClient, clNo, True)
            Catch ex As Exception
                MsgBox(ex.ToString)
            End Try
        End While
    End Sub

End Class
End Module

0 个答案:

没有答案