2012-02-19 100 views
0

即使服務器正在報告它正在發送消息,我的客戶端程序仍然卡在NetworkStream.Read上。客戶端和服務器在同一臺計算機上運行。卡住套接字消息接收

全部服務器代碼(控制檯應用程序)

Imports System.Net.Sockets 
Imports System.Text 

Module Module1 
    Sub Main() 
     'Dim address As New System.Net.IPAddress("127.0.0.1") 
     'Dim serverSocket As New TcpListener(address, 8888) 
     Dim serverSocket As New TcpListener(8888) 
     Dim clientSocket As TcpClient 
     Dim counter As Integer 

     serverSocket.Start() 
     msg("Server Started") 
     counter = 0 
     While (True) 
      counter += 1 
      clientSocket = serverSocket.AcceptTcpClient() 
      msg("Client No:" + Convert.ToString(counter) + " started!") 
      Dim client As New handleClient 
      client.startClient(clientSocket, Convert.ToString(counter)) 
     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 

    Public Class handleClient 
     Dim clientSocket As TcpClient 
     Dim clNo As String 
     Public Sub startClient(ByVal inClientSocket As TcpClient, ByVal clineNo As String) 
      Me.clientSocket = inClientSocket 
      Me.clNo = clineNo 
      Dim ctThread As Threading.Thread = New Threading.Thread(AddressOf doChat) 
      ctThread.Start() 
     End Sub 
     Private Sub doChat() 
      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) 
        serverResponse = "Server to client(" + clNo + ") " + rCount 
        sendBytes = Encoding.ASCII.GetBytes(serverResponse) 
        networkStream.Write(sendBytes, 0, sendBytes.Length) 
        networkStream.Flush() 
        msg(serverResponse) 
       Catch ex As Exception 
        MsgBox(ex.ToString) 
       End Try 

      End While 

     End Sub 
    End Class 

End Module 

完整的客戶端代碼(窗體應用程序)

Public Class CSocketClient 
    Dim clientSocket As New System.Net.Sockets.TcpClient() 
    Dim serverStream As NetworkStream 

    'Connect 
    Public Sub init(ByVal address As String, ByVal port As Integer) 
     clientSocket.Connect(address, port) 
    End Sub 

    'Run once 
    Public Sub runOnce() 
     sendMSG("Message1 from Client$") 
     receiveMSG() 
     sendMSG("Message2 from Client$") 
     receiveMSG() 
    End Sub 

    'Send msg 
    Public Sub sendMSG(ByVal msg As String) 
     Dim serverStream As NetworkStream = clientSocket.GetStream() 
     Dim outStream As Byte() = System.Text.Encoding.ASCII.GetBytes(msg) 
     serverStream.Write(outStream, 0, outStream.Length) 
     serverStream.Flush() 
    End Sub 

    'Receive msg 
    Public Sub receiveMSG() 
     Dim inStream(10024) As Byte 
     Dim buffSize As Integer = clientSocket.ReceiveBufferSize 
     MsgBox("X") 
     serverStream.Read(inStream, 0, buffSize) 
     MsgBox("Y") 
     Dim returndata As String = System.Text.Encoding.ASCII.GetString(inStream) 
     MsgBox("Data from Server : " & returndata) 
    End Sub 
End Class 

要使用客戶端:

Dim client As New CSocketClient 
client.init("127.0.0.1", 8888) 
client.runOnce() 

我加MsgBox("X")and MsgBox("Y")來驗證它沒有通過serverStream.Read。 「X」彈出很好,它永遠不會到達Y.

任何人都可以告訴爲什麼發生這種情況?

回答

0

修正了它。發送和接收需要共享相同的NetworkStream ..愚蠢的錯誤!

Public Sub runOnce() 
    Dim serverStream As NetworkStream = clientSocket.GetStream() 
    sendMSG("Message1 from Client$", serverStream) 
    receiveMSG(serverStream) 
End Sub