2012-07-27 132 views
1

我已創建聊天服務器。在那裏我連接客戶端電腦,可以聊天。在我的情況下,服務器允許我連接,但我無法與其他人聊天使用我的應用程序。請查看我的代碼並更正它。這是我的代碼。vb.net多線程聊天客戶端和服務器

客戶端代碼:

Imports System.Net.Sockets 
    Imports System.Text 
    Public Class Form1 
     Dim clientSocket As New System.Net.Sockets.TcpClient() 
     Dim serverStream As NetworkStream 
     Dim readData As String 
     Dim infiniteCounter As Integer 

     Private Sub Button1_Click(ByVal sender As System.Object, _ 
      ByVal e As System.EventArgs) Handles Button1.Click 
      Dim outStream As Byte() = _ 
      System.Text.Encoding.ASCII.GetBytes(TextBox2.Text + "$") 
      serverStream.Write(outStream, 0, outStream.Length) 
      serverStream.Flush() 
     End Sub 

     Private Sub msg() 
      If Me.InvokeRequired Then 
       Me.Invoke(New MethodInvoker(AddressOf msg)) 
      Else 
       TextBox1.Text = TextBox1.Text + Environment.NewLine + " >> " + readData 
      End If 
     End Sub 

     Private Sub Button2_Click(ByVal sender As System.Object, _ 
     ByVal e As System.EventArgs) Handles Button2.Click 
      readData = "Conected to Chat Server ..." 
      msg() 
      clientSocket.Connect("192.168.1.215", 8888) 
      'Label1.Text = "Client Socket Program - Server Connected ..." 
      serverStream = clientSocket.GetStream() 

      Dim outStream As Byte() = _ 
      System.Text.Encoding.ASCII.GetBytes(TextBox3.Text + "$") 
      serverStream.Write(outStream, 0, outStream.Length) 
      serverStream.Flush() 

      Dim ctThread As Threading.Thread = New Threading.Thread(AddressOf getMessage) 
      ctThread.Start() 
     End Sub 

     Private Sub getMessage() 
      For infiniteCounter = 1 To 2 
       infiniteCounter = 1 
       serverStream = clientSocket.GetStream() 
       Dim buffSize As Integer 
       Dim inStream(10024) As Byte 
       buffSize = clientSocket.ReceiveBufferSize 
       serverStream.Read(inStream, 0, buffSize) 
       Dim returndata As String = _ 
       System.Text.Encoding.ASCII.GetString(inStream) 
       readData = "" + returndata 
       msg() 
      Next 
     End Sub 
    End Class 

服務器端代碼:

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 infiniteCounter As Integer 
     Dim counter As Integer 

     serverSocket.Start() 
     msg("Chat Server Started ....") 
     counter = 0 
     infiniteCounter = 0 
     For infiniteCounter = 1 To 2 
      infiniteCounter = 1 
      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) 
     Next 

     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 
      For infiniteCounter = 1 To 2 
       infiniteCounter = 1 
       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 
      Next 
     End Sub 

    End Class 
End Module 
+0

您需要提出具體問題,而不是「爲我修復我的代碼」。如果你沒有努力提出一個問題,那麼這裏的任何人都不可能有動力去幫助你。 – Michael 2012-07-27 14:06:12

回答

1

一,你需要指定你的公網IP地址,第二,你需要上打開端口8888你的路由器。

變化:clientSocket.Connect( 「192.168.1.215」,8888),以:

clientSocket.Connect( 「」,8888)

,並確保轉發端口8888到您的內部網絡IP: 192.168.1.215

此外,這是完全不安全的,我會使用三重DES加密和解密字符串。有一點安全性,但至少是安全性。

瞭解一下網絡的萌芽。