2013-04-22 118 views
0

我對編寫控制檯應用程序很陌生。我無法弄清楚爲什麼這會在控制檯中創建一堆額外的行,並寫入它收到的消息。我確信這是愚蠢的,但我是在最後的手段,因爲谷歌上沒有人顯然這與vb.net愚蠢。提前致謝!控制檯應用程序添加額外的行,爲什麼?

Sub Main() 
    Do 
     Console.WriteLine("Waiting for connection...") 
     server.Start() 
     client = server.AcceptTcpClient() 
     Console.WriteLine("Connected") 
     Do 
      stream = client.GetStream() 
      Dim recvBytes(client.ReceiveBufferSize) As Byte 
      stream.Read(recvBytes, 0, client.ReceiveBufferSize) 
      Dim recvText As String = Encoding.ASCII.GetString(recvBytes) 
      Console.WriteLine(recvText) 
      responses = Console.ReadLine 
      If responses = "close" Then 
       stream.Close() 
       client.Close() 
       server.Stop() 
       Environment.Exit(0) 
      Else 
       Dim sendBytes() As Byte = Encoding.ASCII.GetBytes(responses) 
       stream.Write(sendBytes, 0, sendBytes.Length) 
       Console.WriteLine("Message Sent") 
      End If 
      If client.Connected = False Then 
       Console.WriteLine("Client is no longer connected") 
       Exit Do 
      End If 
     Loop 
    Loop 
End Sub 
+3

「額外的行」是什麼意思? – SLaks 2013-04-22 19:47:18

+3

在調用'WriteLine'之前,您確定您的'recvText'包含數據嗎? – Matthew 2013-04-22 19:47:58

+0

也許你的意思是使用'Console.Write(recvText)'(而不是'WriteLine') – JDB 2013-04-22 20:13:34

回答

0

我相信下面一行將返回一個空字符串

Dim recvText As String = Encoding.ASCII.GetString(recvBytes) 

所以你打印出前行,只是驗證它是否是空的。修改代碼如下:

Sub Main() 
Do 
    Console.WriteLine("Waiting for connection...") 
    server.Start() 
    client = server.AcceptTcpClient() 
    Console.WriteLine("Connected") 
    Do 
     stream = client.GetStream() 
     Dim recvBytes(client.ReceiveBufferSize) As Byte 
     stream.Read(recvBytes, 0, client.ReceiveBufferSize) 
     Dim recvText As String = Encoding.ASCII.GetString(recvBytes) 
     If recvText <> "" Then Console.WriteLine(recvText) 
     responses = Console.ReadLine 
     If responses = "close" Then 
      stream.Close() 
      client.Close() 
      server.Stop() 
      Environment.Exit(0) 
     Else 
      Dim sendBytes() As Byte = Encoding.ASCII.GetBytes(responses) 
      stream.Write(sendBytes, 0, sendBytes.Length) 
      Console.WriteLine("Message Sent") 
     End If 
     If client.Connected = False Then 
      Console.WriteLine("Client is no longer connected") 
      Exit Do 
     End If 
    Loop 
Loop 

End Sub 
+0

我相信你可能是對的。然而,在實施你的建議和我想到的其他一些事情之後,我仍然沒有擺脫爲編寫消息的代碼行和後面的console.readline()之間的巨大死區空間。在連接消息並將消息發送到此控制檯應用程序的窗體應用程序中,我徹底修剪了所有內容並且我有一個狀態標籤,我發送一個字符串來報告發送字符,這些字符都是合適的。 – 2013-04-22 22:27:37

+0

然後,當它寫入控制檯時,我還修剪它和recvText.Length.ToString,它最終報告它已經收到八千個字符串中的一些奇數字符。 – 2013-04-22 22:31:07

+0

如果你嘗試不同的編碼會發生什麼?在你使用ASCII的那一刻,看看這個鏈接來測試它:http://msdn.microsoft.com/en-ca/library/system.text.encoding(v=vs.71).aspx – Alex 2013-04-23 00:39:15

0

我遇到的問題與receivebuffer大小有關。一旦我真的設置了它,然後使用字符串生成器來建立最終的字符串;一切都很好。感謝所有的建議。這些建議導致了一些非常有趣且非常需要的關於我沒有考慮過的事情的閱讀,事實證明,這需要更加關注。

相關問題