2017-01-03 77 views
0

我已經嘗試了很多可能的解決方案,不同類型的寫入和讀取流和所有。但我似乎無法讓我的代碼工作。C#代碼在試圖從網絡流中讀取時掛起

我基本上只想發送消息到localhost:25565,然後用Console.WriteLine()從localhost:25565讀回消息。

public void Connect(String server, String message) 
    { 
     Int32 port = 25565; 
     string localhost = "127.0.0.1"; 
     IPAddress localAdd = IPAddress.Parse(localhost); 
     TcpListener listener = new TcpListener(localAdd, port); 
     Console.WriteLine("listening..."); 
     listener.Start(); 
     try 
     { 
      TcpClient client = new TcpClient(server, port); 
      client.NoDelay = true; 
      NetworkStream stream = client.GetStream(); 


      if (stream.CanWrite) 
      { 
       Console.WriteLine("You can write to this NetworkStream."); 


       StreamWriter writer = new StreamWriter(client.GetStream()); 
       writer.Write(message); 
       writer.Flush(); 

      } 
      else 
      { 
       Console.WriteLine("Sorry. You cannot write to this NetworkStream."); 
      } 

      Console.WriteLine("Sent: {0}", message); 

      String responseData = String.Empty; 

      Console.WriteLine("InBetween test"); 

      if(stream.CanRead) 
      { 
       Console.WriteLine("You can read this stream"); 

       StreamReader reader = new StreamReader(stream); 
       string recievedData = reader.ReadToEnd(); 
       Console.WriteLine(recievedData); 

      } 
      else 
      { 
       Console.WriteLine("Sorry. You cannot read from this NetworkStream."); 
      } 

      Console.WriteLine("All completed test"); 


      stream.Close(); 
      client.Close(); 
     } 
     catch (ArgumentNullException e) 
     { 
      Console.WriteLine("ArgumentNullException: {0}", e); 
     } 
     catch (SocketException e) 
     { 
      Console.WriteLine("SocketException: {0}", e); 
     } 

     Console.WriteLine("\n Press Enter to continue..."); 
     Console.Read(); 
    } 

這是我調試我的應用程序時出現的內容。 https://gyazo.com/95464cc4201c98ccd04cac004b0ea540

它停止後您可以閱讀這個流

非常感謝您的幫助。

+0

這似乎是的服務器代碼('TcpListener')和客戶端代碼('TcpClient')的混合,但在任何時候或者是分別連接到客戶機或服務器。查看['TcpClient.GetStream']的文檔(https://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.getstream.aspx):「您必須先調用Connect方法,」 – Richard

+0

謝謝你我會研究這個! – DarthFoot

回答

1

您錯過了監聽服務器套接字上的Accept調用。

下面是你的例子修改後的工作。 服務器部分現在在後臺線程中運行,因此服務器和客戶端可以並行運行。

public class Program 
{ 
    public static readonly int Port = 25565;  
    public static readonly string Localhost = "127.0.0.1"; 
    public static readonly string Host = "127.0.0.1"; 

    public static void RunServer() 
    { 
     // start the server 
     IPAddress localAdd = IPAddress.Parse(Localhost); 
     TcpListener listener = new TcpListener(localAdd, Port); 
     listener.Start(); 
     Console.WriteLine($"Server: Listening on {localAdd}:{Port}"); 
     // TODO proper exit from server 
     while (true) 
     { 
      // accept client socket -- note that we handle only one connection at a time 
      Socket cliSoc = listener.AcceptSocketAsync().Result; 
      Console.WriteLine($"Server: Client socket accepted, from {cliSoc.LocalEndPoint}"); 
      while (true) 
      { 
       if (!cliSoc.Connected) 
        break; 
       int bufLen = 1000; 
       byte[] buf = new byte[bufLen]; 
       int read = cliSoc.Receive(buf); 
       if (read == 0) 
        break; 
       string msg = System.Text.Encoding.ASCII.GetString(buf, 0, read); 
       Console.WriteLine($"Server: Read from socket: {read} '{msg}'"); 

       string response = "OK"; 
       byte[] responseArr = System.Text.Encoding.ASCII.GetBytes(response.ToCharArray()); 
       int sent = cliSoc.Send(responseArr); 
       Console.WriteLine($"Server: sent response ({sent} bytes)"); 

       cliSoc.Shutdown(SocketShutdown.Both); 
      } 
      Console.WriteLine($"Server: Client socket closed"); 
     } 
    } 

    public static void Connect(string message) 
    { 
     Task.Run(() => RunServer()); 

     try 
     { 
      TcpClient client = new TcpClient(); 
      client.ConnectAsync(Host, Port).Wait(); 
      client.NoDelay = true; 
      NetworkStream stream = client.GetStream(); 

      if (stream.CanWrite) 
      { 
       Console.WriteLine("Client: You can write to this NetworkStream."); 

       StreamWriter writer = new StreamWriter(stream); 
       writer.Write(message); 
       writer.Flush(); 
       Console.WriteLine($"Client: Wrote to stream ({message})."); 
      } 
      else 
      { 
       Console.WriteLine("Client: Sorry. You cannot write to this NetworkStream."); 
      } 

      String responseData = String.Empty; 

      Console.WriteLine("Client: Reading"); 

      if(stream.CanRead) 
      { 
       Console.WriteLine("Client: You can read this stream"); 

       StreamReader reader = new StreamReader(stream); 
       string recievedData = reader.ReadToEnd(); 
       Console.WriteLine($"Client: Read: {recievedData}"); 

      } 
      else 
      { 
       Console.WriteLine("Client: Sorry. You cannot read from this NetworkStream."); 
      } 

      Console.WriteLine("Client: All completed test"); 


      stream.Flush(); 
      //client.Close(); 
     } 
     catch (ArgumentNullException e) 
     { 
      Console.WriteLine("ArgumentNullException: {0}", e); 
     } 
     catch (SocketException e) 
     { 
      Console.WriteLine("SocketException: {0}", e); 
     } 

     Console.WriteLine("\n Press Enter to continue..."); 
     Console.Read(); 
    } 

    public static void Main(string[] args) 
    { 
     Connect("Hi there!"); 
    } 
+0

我不知道該說什麼男人!非常感謝你,它有效。現在我將花時間研究所有我還不知道的技術^^。再次,你一直是一個驚人的幫助。 – DarthFoot

+0

我很高興你發現它很有用! :) –