2012-07-27 2 views
1

채팅 용 채팅 서버를 만들었습니다. 거기 나는 그 (것)들을 채팅하는 것을 허용 할 클라이언트 pc 's를 연결한다. 내 경우에는 서버를 통해 연결을 허용하지만 다른 사람들과 채팅 할 수 없어 내 응용 프로그램을 사용합니다. 제 코드를보고 수정하십시오. 여기 내 코드가있다.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

답변

1

하나, 당신은 두 번째, 당신은 포트 8888를 열어야합니다, 공용 IP 주소를 지정해야 귀하의 라우터.

변경 : clientSocket.Connect ("192.168.1.215", 8888) :

clientSocket.Connect ("", 8888)

그리고 내부 LAN IP에 포트 8888을 전달해야합니다 : 192.168.1.215

또한 전적으로 안전하지 않으므로 트리플 DES를 사용하여 문자열을 암호화하고 해독합니다. 약간의 보안은 있지만 적어도 보안은 있습니다.

네트워킹 버드에 대해 자세히 알아보십시오.

관련 문제