2016-04-04 4 views
1

私のアプリケーションに問題があります。私はクライアント/サーバーベースのアプリケーションを構築していました。私はそれが完璧に動作response = Console.ReadLine();response = "Any Text";に変更した場合はコンソールが理由なしで終了するC#

using System; 
using System.Collections.Generic; 
using System.Net; 
using System.Net.Sockets; 
using System.Text; 

namespace Server 
{ 
    class Program 
    { 
     private static byte[] _buffer = new byte[1024]; 
     private static List<Socket> _clientSockets = new List<Socket>(); 
     private static int SERVERPORT = 5555; 
     private static Socket _serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
     static void Main(string[] args) 
     { 
      SetupServer(); 
      Console.ReadLine(); 
     } 


     private static void SetupServer() 
     { 
      Console.WriteLine("Setting up server..."); 
      _serverSocket.Bind(new IPEndPoint(IPAddress.Any, SERVERPORT)); 
      _serverSocket.Listen(100); 
      _serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null); 
     } 

     private static void AcceptCallback(IAsyncResult AR) 
     { 
      Socket socket = _serverSocket.EndAccept(AR); 
      _clientSockets.Add(socket); 
      Console.WriteLine("Client conntected"); 
      socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), socket); 
      _serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null); 


     } 

     private static void ReceiveCallback(IAsyncResult AR) 
     { 
      Socket socket = (Socket)AR.AsyncState; 
      int received = socket.EndReceive(AR); 
      byte[] dataBuf = new byte[received]; 
      Array.Copy(_buffer, dataBuf, received); 
      string text = Encoding.ASCII.GetString(dataBuf); 
      Console.WriteLine("Text received: " + text); 
      string response = string.Empty; 
      if (text.ToLower() == "get time") 
      { 
       response = Console.ReadLine(); 
       //after this line it closes the server for some reason? 
       Console.WriteLine(response); 
      } else 
      { 
       response = "Invalid request"; 
      } 


      byte[] data = Encoding.ASCII.GetBytes(response); 
      socket.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(SendCallback), null); 
      socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), socket); 

     } 

     private static void SendCallback(IAsyncResult AR) 
     { 
      try { 
       Socket socket = (Socket)AR.AsyncState; 
       socket.EndSend(AR); 
      } 
      catch { 

      } 
      //It gets alot of NullReferenceExceptions. It does work this way but I dont trust it. 
     } 


    } 
} 

  response = Console.ReadLine(); 

私の完全なコード:私はこのコード行を実行するときしかし、私のコンソールが閉じます。私は完全に無知です。私は本当に解決に感謝します。前もって感謝します!

+0

コールバックで 'Console.ReadLine()'を呼び出します。それは非同期ではありません。つまり、 'ReadLine()'でブロックすることはできません。 –

答えて

0

コンソールで行を取得した後、メインメソッドが終了し、Console.ReadLine()も待機するからです。修正するには、次の操作を行います。

static void Main(string[] args) 
{ 
    SetupServer(); 
    while (Console.ReadLine() != "exit") 
     ; 
} 

「終了」と入力すると終了します。

+0

答えをありがとう。あなたは間違った行を見ている。このif文から読んでください:if(text.ToLower()== "get time") –

+0

_also_がConsole.ReadLine()を使用するMainメソッドを見て、_any_ラインがタイプされたときにメインメソッドが終了します。 – Evk

+0

答えをありがとう! –

1

あなたのメインスレッドはConsole.ReadLine()入力を待っています。次に、別のスレッドがコンソールからの入力を読み取るようにします。これは明らかに機能しません。

Console.ReadLine()を使用せずにメインスレッドをコンソールに読み込ませ、入力を別のスレッドに送信するか、メインスレッドを停止する方法を見つける必要があります。

AutoResetEventを設定し、WaitOne()をメインスレッドで呼び出して、テストとして無限に利用できるようにすることができます。

+0

また、働いた。ありがとう! –

関連する問題