2016-09-19 100 views
0

我刚接触网络和c#。我正在尝试开发一个异步单服务器,多个异步客户端可以连接到该服务器,并且可以在每个客户端之间发送和接收消息问题发生在我的服务器上,它只能连接到一个客户端。我正在使用线程连接到多个客户端,但它不工作。异步单服务器多客户端使用c#

我正在使用.NET 4.5框架。

注意:我从客户端收到某些东西时使用StateObject。另外,我的服务器只在一个客户端连接的情况下工作(如果我删除了threadclient()方法)。

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

你在这里要求很多,Pratul。

恐怕我无法回答“我如何构建一个多线程的TCP服务器应用程序?”这里。但我可以给你一些指点。通常情况下,您将拥有一个侦听器套接字(如您所拥有的)以及等待新连接的阻塞调用。应该不需要等待侦听器循环中的任何同步对象。

当你接受新的连接时,你会得到一个新的套接字 - 分配给新连接的套接字。我没有看到你拿起这个新插座的位置。

然后为该新连接启动一个新线程。

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

问候,

亚当。

+0

我已更新OnClientConnected()方法。你可以看到,当一个新的客户端连接时,一个stateobject被调用,它为新客户端提供了一个新的套接字。 –