2017-05-08 7 views
2

クライアントからの接続を待つ単純なサーバーをC#で構築しようとしました。新しいクライアントが接続すると、新しいスレッドが作成され、そこからクライアントから読み込まれたメッセージがクライアントに送信され、そのサーバはクライアントからメッセージを受信しました。私の問題は、新しいクライアントがサーバーに接続したときにイベントを発生させようとしていることですが、私が購読しているものは得られません。私は問題があるC#新しいクライアントが接続されたときにシンプルなサーバーを構築する

namespace ChatServer 
{ 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Net; 
using System.Net.Sockets; 
using System.Threading; 

class Program 
{ 
    public static event EventHandler<NewClientConnectedEventArgs>NewClientConnected; 

    public static void Main(string[] args) 
    { 
     TcpListener listener = new TcpListener(IPAddress.Any, 80); 
     listener.Start(); 

     while (true) 
     { 
      TcpClient client = listener.AcceptTcpClient(); 
      //listener += NewClientConnected(null, new NewClientConnectedEventArgs(client)); 
      //FireNewClientHasConnected(null, eventargs); 
     } 
    } 

    public static void MakeNewConnection(TcpClient client) 
    { 
     Thread thread = new Thread(new ParameterizedThreadStart(NewClient)); 
     thread.Start(client); 
    } 

    public static void NewClient(object data) 
    { 
     TcpClient client = (TcpClient)data; 

     string adress = client.Client.AddressFamily.ToString(); 

     Console.WriteLine("{0} has connected!", adress); 

     NetworkStream ns = client.GetStream(); 

     while (true) 
     { 
      byte[] receivedbuffer = new byte[8192]; 
      int receivedbytes; 

      receivedbytes = ns.Read(receivedbuffer, 0, receivedbuffer.Length); 

      string message = Encoding.UTF8.GetString(receivedbuffer, 0, receivedbytes); 
      string newmessage = "The server received: " + message; 

      byte[] sendBuffer = Encoding.UTF8.GetBytes(newmessage); 
      ns.Write(sendBuffer, 0, sendBuffer.Length); 
     } 
    } 

    protected static void FireNewClientHasConnected(object sender, NewClientConnectedEventArgs args) 
    { 
     if (NewClientConnected != null) 
     { 
      MakeNewConnection(args.Client); 
     } 
    } 
} 

部分は私がコメントアウト一部です:

は、ここに私のコードです。前もって感謝します!

答えて

2

call listener.AcceptTcpClient()は、クライアントが接続するまでブロックします。リスナーがクライアントを受け入れた後でイベントを起動してください。

class Program 
    { 
     public static void Main(string[] args) 
     { 
      var listener = new TcpListener(IPAddress.Any, 80); 
      listener.Start(); 
      while (true) 
      { 
       TcpClient client = listener.AcceptTcpClient(); 
       MakeNewConnection(client); 
      } 
     } 

     public static void MakeNewConnection(TcpClient client) 
     { 
      var thread = new Thread(NewClient); 
      thread.Start(client); 
     } 

     public static void NewClient(object data) 
     { 
      var client = (TcpClient)data; 

      string adress = client.Client.AddressFamily.ToString(); 

      Console.WriteLine("{0} has connected!", adress); 

      NetworkStream ns = client.GetStream(); 

      while (true) 
      { 
       byte[] receivedbuffer = new byte[8192]; 

       int receivedbytes = ns.Read(receivedbuffer, 0, receivedbuffer.Length); 

       string message = Encoding.UTF8.GetString(receivedbuffer, 0, receivedbytes); 
       string newmessage = "The server received: " + message; 

       byte[] sendBuffer = Encoding.UTF8.GetBytes(newmessage); 
       ns.Write(sendBuffer, 0, sendBuffer.Length); 
      } 
     } 

    } 
+0

イベントに登録する必要はありませんか?また、何も購読されていないので、イベントがnullかどうかを確認する必要はありませんか?私はちょっと混乱しています。 –

+0

プログラム以外のクラスにクライアントを公開したくない場合は、イベントを離れたままにして、直接MakeNewConnection()を呼び出してください。 – Quergo

+0

いいえ、ここではイベントは役に立たないと思います。どうも :) –

関連する問題