繁体   English   中英

异步单服务器使用C#的多个客户端

[英]asynchronous single server multiple clients using 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);
        }
    }
} 

您在这里要求很多,Pratul。

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

接受新连接后,您将获得一个新的套接字-分配给该新连接的套接字。 我看不到您在哪里接这个新插座。

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

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

问候,

亚当。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM