2016-09-19 18 views
0

を使用しています。ネットワーキングとC#の新機能です。私は複数の非同期クライアントが接続でき、各クライアント間でメッセージを送受信できる非同期単一サーバーを開発しようとしています。問題は私のサーバーで1つのクライアントにしか接続できません。私は複数のクライアントに接続するためにスレッドを使用していますが、動作しません。非同期シングルサーバ複数のクライアントがC#

私は.NET 4.5フレームワークを使用しています。

注:私はクライアントから何かを受け取ったときにStateObjectを使用します。また、私のサーバは、(もし私がthreadclient()メソッドを削除すると)1つのクライアントが接続されている場合にのみ動作します。

Server: 
public class mainclass 
{ 
    public static void Main() 
    { 
     newTCPNetworkNode nn = new newTCPNetworkNode(); 
     nn.Initialize(); 
     nn.threadClient();    
    } 
} 

public class StateObject 
{ 
    public Socket workSocket = null; 
    public const int BufferSize = 100; 
    public byte[] buffer = new byte[BufferSize]; 
} 

class newTCPNetworkNode 
{ 
    private IPAddress addr; 
    private IPEndPoint endpoint; 
    private TcpListener mListener; 
    public static ManualResetEvent allDone = new ManualResetEvent(false); 
    public Thread listenthread; 

    public void Initialize() 
    { 
     addr = IPAddress.Parse("127.0.0.1"); 
     endpoint = new IPEndPoint(addr, 1234); 
     mListener = new TcpListener(endpoint); 
     mListener.Start(); 
    } 

    public void threadClient() 
    {    
     listenthread = new Thread(new ThreadStart(Start)); 
     listenthread.Start();    
    } 


    public override void Start() 
    { 
     Console.WriteLine("Starting TCP server"); 
     try 
     {     
      while (true) 
      {     
       allDone.Reset(); 
       mListener.BeginAcceptTcpClient(new AsyncCallback(OnClientConnected), mListener); 
       allDone.WaitOne(); 
      } 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.Message); 
     } 
    } 

    public void OnClientConnected(IAsyncResult result) 
    { 
     allDone.Set(); 
     TcpListener listener = (TcpListener)result.AsyncState; 
     Socket handler = listener.EndAcceptSocket(result); 
     StateObject state = new StateObject(); 
     state.workSocket = handler; 
     try 
     { 
      handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.Message); 
     } 
    } 
} 

答えて

0

ここではたくさんのことを求めています。

「私はマルチスレッドTCPサーバーアプリケーションを構築するにはどうすればよいですか?ここに。しかし、私はあなたにいくつかの指針を与えることができます。通常、リスナーソケット(あなたが持っているように)と新しい接続を待つブロッキング呼び出しがあります。リスナーのループ内の同期オブジェクトを待つ必要はありません。

新しい接続を受け入れると、新しいソケット(新しい接続に割り当てられたソケット)が取得されます。私はあなたがこの新しいソケットをピックアップしているところはわかりません。

その後、新しい接続用の新しいスレッドを開始します。

https://msdn.microsoft.com/query/dev12.query?appId=Dev12IDEF1&l=EN-US&k=k(System.Net.Sockets.TcpListener);k(TargetFrameworkMoniker-.NETFramework

よろしく、

アダムを参照してください。

+0

OnClientConnected()メソッドを更新しました。新しいクライアントが接続されると、新しいクライアント用の新しいソケットを持つstateオブジェクトが呼び出されます。 –

関連する問題