【问题标题】:Multiple Clients in Client Server app in C#C# 中客户端服务器应用程序中的多个客户端
【发布时间】:2013-08-21 09:32:53
【问题描述】:

使用http://www.developerfusion.com 的资源,我想出了以下服务器代码。它适用于单个客户。我怎样才能为多个客户制作它。我尝试添加数组和 beiginreceive 的不同实例,但无法添加。服务器代码:

class Program
{
    public static AsyncCallback pfnWorkerCallBack;
    public static Socket m_socListener;
    public static Socket m_socWorker;

    static void Main(string[] args)
    {
        try
        {
            //create the listening socket...
            m_socListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint ipLocal = new IPEndPoint(IPAddress.Any, 8221);
            //bind to local IP Address...
            m_socListener.Bind(ipLocal);
            Console.WriteLine("UCManager Started");
            //start listening...
            m_socListener.Listen(4);
            // create the call back for any client connections...
            m_socListener.BeginAccept(new AsyncCallback(OnClientConnect), null);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }

        Console.ReadLine();
    }

    public static void OnClientConnect(IAsyncResult asyn)
    {
        try
        {
            m_socWorker = m_socListener.EndAccept(asyn);

            WaitForData(m_socWorker);
        }
        catch (Exception se)
        {
            Console.WriteLine(se.Message);
        }

    }
    public class CSocketPacket
    {
        public System.Net.Sockets.Socket thisSocket;
        public byte[] dataBuffer = new byte[1];
    }

    public static void WaitForData(System.Net.Sockets.Socket soc)
    {
        try
        {
            if (pfnWorkerCallBack == null)
            {
                pfnWorkerCallBack = new AsyncCallback(OnDataReceived);
            }
            CSocketPacket theSocPkt = new CSocketPacket();
            theSocPkt.thisSocket = soc;
            // now start to listen for any data...
            soc.BeginReceive(theSocPkt.dataBuffer, 0, theSocPkt.dataBuffer.Length, SocketFlags.None, pfnWorkerCallBack, theSocPkt);
        }
        catch (SocketException se)
        {
            Console.WriteLine(se.Message);
        }

    }

    public static void OnDataReceived(IAsyncResult asyn)
    {
        try
        {
            CSocketPacket theSockId = (CSocketPacket)asyn.AsyncState;
            //end receive...
            int iRx = 0;
            iRx = theSockId.thisSocket.EndReceive(asyn);
            char[] chars = new char[iRx + 1];
            Decoder d = Encoding.UTF8.GetDecoder();
            int charLen = d.GetChars(theSockId.dataBuffer, 0, iRx, chars, 0);
            String szData = new String(chars);
            Console.WriteLine(szData);
            int code = Convert.ToInt32(szData); 

            WaitForData(m_socWorker);
        }

        catch (Exception se)
        {
            Console.WriteLine(se.Message);
        }
    }

}

}

编辑:好的,我在Async TCP Server for multiple Clients 上做了一些事情。

public static void OnClientConnect(IAsyncResult asyn)
        {
            try
            {
                Socket m_socWorkerInstance = m_socListener.EndAccept(asyn);
                clientSocketList.Add(m_socWorkerInstance);

                WaitForData(m_socWorkerInstance);
            }
            catch (ObjectDisposedException)
            {
                System.Diagnostics.Debugger.Log(0, "1", "\n OnClientConnection: Socket has been closed\n");
            }
            catch (SocketException se)
            {
                Console.WriteLine(se.Message);
            }

        }
public static void WaitForData(System.Net.Sockets.Socket soc)
        {
            try
            {
                if (pfnWorkerCallBack == null)
                {
                    pfnWorkerCallBack = new AsyncCallback(OnDataReceived);
                }
                CSocketPacket theSocPkt = new CSocketPacket();
                theSocPkt.thisSocket = soc;
                // now start to listen for any data...
                soc.BeginReceive(theSocPkt.dataBuffer, 0, theSocPkt.dataBuffer.Length, SocketFlags.None, pfnWorkerCallBack, theSocPkt);
                m_socListener.BeginAccept(new AsyncCallback(OnClientConnect), null);
            }
            catch (SocketException se)
            {
                Console.WriteLine(se.Message);
            }

        }

现在我可以连接两个客户端,但无法通信...我无法从服务器向客户端发送消息...任何建议...我也应该为两个客户端设置不同的读取功能如果我连接两个客户端???

【问题讨论】:

  • 使用多线程正是你所需要的。为什么不想要线程?
  • 我正在寻找更多关于这一行的内容:stackoverflow.com/questions/15796836/… 但我无法在我的代码中实现这一点
  • 还有一件事...我可以知道我从哪个客户端接收消息...如果服务器从 A 收到消息,那么它应该向客户端 B 发送一些通知,如果它从 B 收到它应该向 A 发送一些通知。这就是为什么我问我是否会阅读不同的读取功能的原因

标签: c# visual-studio-2010 client-server


【解决方案1】:

您只调用一次BeginAccept,因此在接受一个客户端后,您的服务器将不会接受任何新连接。您应该在接受连接后再次调用BeginAccept

【讨论】:

  • 我尝试了一些东西...请看一下编辑后的问题
  • @kewal “但是现在服务器挂了” - 我对此无能为力。
  • 哈哈...当然不能,这是因为别的原因...不过还是感谢您的建议
【解决方案2】:

好的,我可以使用 Async TCP Server for multiple Clients 解决它:

public static void OnClientConnect(IAsyncResult asyn)
            {
                try
                {
                    Socket m_socWorkerInstance = m_socListener.EndAccept(asyn);
                    clientSocketList.Add(m_socWorkerInstance);

                    WaitForData(m_socWorkerInstance);
                }
                catch (ObjectDisposedException)
                {
                    System.Diagnostics.Debugger.Log(0, "1", "\n OnClientConnection: Socket has been closed\n");
                }
                catch (SocketException se)
                {
                    Console.WriteLine(se.Message);
                }

            }
    public static void WaitForData(System.Net.Sockets.Socket soc)
            {
                try
                {
                    if (pfnWorkerCallBack == null)
                    {
                        pfnWorkerCallBack = new AsyncCallback(OnDataReceived);
                    }
                    CSocketPacket theSocPkt = new CSocketPacket();
                    theSocPkt.thisSocket = soc;
                    // now start to listen for any data...
                    soc.BeginReceive(theSocPkt.dataBuffer, 0, theSocPkt.dataBuffer.Length, SocketFlags.None, pfnWorkerCallBack, theSocPkt);
                    m_socListener.BeginAccept(new AsyncCallback(OnClientConnect), null);
                }
                catch (SocketException se)
                {
                    Console.WriteLine(se.Message);
                }

            }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-11
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    相关资源
    最近更新 更多