C#套接字:第二个(和更多)用户无法连接

时间:2014-05-28 05:39:43

标签: c# sockets

我连接到我的(C#)服务器和Corona SDK内置的应用程序,但第二个人永远无法连接。

我尝试使用不同的IP,即两部外置IP的手机没有区别。

这是我的服务器监听器的工作方式:

server.cs

void Listener()
    {
        while (isRunning)
        {
            try
            {
                Socket socket = listener.AcceptSocket();

                foreach (var worker in workers)
                    if (worker.IsAvailable)
                    {
                        worker.ProcessNewSocket(socket);
                        break;
                    }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
    }

    public void Run()
    {
        Console.WriteLine("Server.Run()");
        listener.Start();
        isRunning = true;

        foreach (var worker in workers)
        {
            Thread t = new Thread(worker.Run);
            t.Start();
        }

        Listener();
    }

ServerWorker.cs

public void ProcessNewSocket(Socket socket)
    {
        var pc = new PlayerClient(this);            
        sockets.Add(socket, pc);
    }

    // this method will be called in cycle
    public void Run()
    {

        while (server.IsRunning)
        {
            List<Socket> readList = sockets.Keys.ToList(); //List of sockets that have some data from client available for reading.
            List<Socket> writeList = sockets.Keys.ToList(); //List of sockets that are ready to write (send) to the client. An action was made to a table and the change was sent to PlayerClient.Write and is now stored in the queue (MemoreStream)
            List<Socket> errorList = sockets.Keys.ToList();

            if (readList.Count() != 0 || writeList.Count() != 0 || errorList.Count() != 0)
            {
                // for providing security you can use  System.Net.Security.SslStream here when read/write data,
                // see http://msdn.microsoft.com/ru-ru/library/system.net.security.sslstream(v=vs.110).aspx

                Socket currentSocket = null;

                // foreach socket with events
                try
                {
                    foreach (var s in readList)
                    {
                        currentSocket = s;
                        //TODO: Get the actual length of the message.
                        byte[] data = new byte[2048];
                        s.Receive(data);
                        sockets[s].OnData(data);
                    }

                    foreach (var s in writeList)
                    {
                        currentSocket = s;
                        if (sockets[s].IsWriteDataAvailable())
                        {
                            s.Send(sockets[s].GetWriteBuffer());
                            sockets[s].ClearWriteBuffer();
                        }
                    }

                    foreach (var s in errorList)
                    {
                        //OnError   
                    }
                }
                // we got exception, depending on the type...
                catch (SocketException ex)
                {
                    //Console.WriteLine(ex.ToString());
                    // send client error message, this is not always possible(for example network failure)
                    // maybe we would like to notify his opponent about connection failure
                    // terminate connection

                    if (ex.ErrorCode == (int)SocketError.ConnectionAborted || ex.ErrorCode == (int)SocketError.ConnectionReset)
                        RemoveSocket(currentSocket);
                    else
                        Console.WriteLine("Other problem .. " + ex.ErrorCode.ToString());
                }
            }

        }    

    }

我是网络编程的新手,所以我不确定该怎么做。我已经阅读过有关使用ASync的内容,但首先我想知道我是否可以使用此代码和/或是否应该完全更改它?

1 个答案:

答案 0 :(得分:0)

我认为&#34; BREAK&#34; Listener()块中的语句;

           foreach (var worker in workers)

           if (worker.IsAvailable)
                {
                    worker.ProcessNewSocket(socket);
                    break; // this BREAK WILL END YOUR loop AFTER first CLIENT FOUND.
                }

所以,尝试删除break as;

           foreach (var worker in workers)
           {
              if (worker.IsAvailable)
               {    
                    worker.ProcessNewSocket(socket);
               }
           }