【问题标题】:Multi Client TCP Server not acceping some clients c#多客户端 TCP 服务器不接受某些客户端 c#
【发布时间】:2016-10-05 23:48:54
【问题描述】:

我正在尝试创建一个接受客户端的服务器,并与他们通信,直到他们说“退出”。 问题是,在 5-8 个客户端之后,服务器决定他不想再接受任何客户端,并且当客户端连接时.. 我根本看不到“客户端已连接:123.242.123.13:92313”在控制台中。 有谁知道这个问题吗?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace GatherServer
{
    class Program
    {
        public static int connections = 0, team1 = 0, team2 = 0, playing = 12;
        public static string lbleader = "";
        public static bool isleader = false;
        static TcpListener myList = new TcpListener(IPAddress.Any, 7846);
        static void Listeners()
        {
            string charname = "";
            bool inque = false;
            Socket socketForClient = myList.AcceptSocket();
            if(socketForClient.Connected)
            {
                Console.WriteLine("Client Connected: " + socketForClient.RemoteEndPoint);
                NetworkStream networkStream = new NetworkStream(socketForClient);
                StreamWriter streamWriter = new StreamWriter(networkStream);
                StreamReader streamReader = new StreamReader(networkStream);

                while (true)
                {
                    string newString = streamReader.ReadLine();
                    if (newString.Contains("#") && inque == false)
                    {
                        if (newString.Contains("Leader"))
                        {
                            newString = newString.Replace("Leader","");
                            if (!isleader)
                            {
                                isleader = true;
                                lbleader = newString;
                                charname = lbleader;
                                Console.WriteLine(lbleader + " is the gather leader");
                            }
                        }
                        inque = true;
                        charname = newString;
                        connections++;
                        Console.WriteLine("connections: " + connections + " | from: "+charname);

                    }
                    if (newString == "exit")
                    {
                        if (charname == lbleader)
                        {
                            isleader = false;
                            Console.WriteLine(lbleader + " Left, there is not active leader");
                        }
                        else
                            Console.WriteLine(charname + " has left the game: "+socketForClient.RemoteEndPoint);
                        if (inque == true)
                            connections--;
                        break;
                    }
                    else
                    {
                        streamWriter.WriteLine(connections.ToString());
                        streamWriter.Flush();
                        if (connections == 12)
                        {
                            if (!isleader)
                            {
                                lbleader = charname;
                                Console.WriteLine(lbleader + " is the gather leader");
                                isleader = true;
                            }
                            Random rnd = new Random();
                            int team = rnd.Next(1, 3); // creates a number between 1 and 2
                            if(team == 1)
                            {
                                if (team1 < 6)
                                {
                                    team1++;
                                    Console.WriteLine(newString + " " + socketForClient.RemoteEndPoint + " assigned to Team 1");
                                    streamWriter.WriteLine("team1"+lbleader);
                                    streamWriter.Flush();
                                    inque = false;
                                    playing--;
                                    break;
                                }
                                else
                                {
                                    Console.WriteLine(newString + " " + socketForClient.RemoteEndPoint + " assigned to Team 2");
                                    team2++;
                                    streamWriter.WriteLine("team2" + lbleader);
                                    streamWriter.Flush();
                                    inque = false;
                                    playing--;
                                    break;
                                }

                            }
                            if(team == 2)
                            {
                                if (team2 < 6)
                                {
                                    Console.WriteLine(newString + " " + socketForClient.RemoteEndPoint + " assigned to Team 2");
                                    team2++;
                                    streamWriter.WriteLine("team2" + lbleader);
                                    streamWriter.Flush();
                                    inque = false;
                                    playing--;
                                    break;
                                }
                                else
                                {
                                    Console.WriteLine(newString + " " + socketForClient.RemoteEndPoint + " assigned to Team 1");
                                    team1++;
                                    streamWriter.WriteLine("team1" + lbleader);
                                    streamWriter.Flush();
                                    inque = false;
                                    playing--;
                                    break;
                                }
                            }
                        }  
                    }
                }
                if (playing == 0)
                {
                    connections = playing;
                    playing = 12;
                    lbleader = null;
                    isleader = false;
                }
                Console.WriteLine("playing:" + playing);
                Console.WriteLine("connections: " + connections);
                inque = false;
                streamWriter.Close();
                streamReader.Close();
                networkStream.Close();
                socketForClient.Close();
            }
        }
        static void Main(string[] args)
        {
            myList.Start();
            Console.WriteLine("Sever is up and running...");

            for(int i=0; i<1000;i++)
            {
                Thread newThread = new Thread(new ThreadStart(Listeners));
                newThread.Start();
            }
        }

    }
}

基本上,我想做的是给每个客户一个自己的线程。但是5-8个连接后,服务器Socket socketForClient = myList.AcceptSocket();不工作,我认为是因为我的线程用完了.. 但我不知道为什么,当只建立 5 到 8 个连接时应该有 1000 个线程打开。

请帮忙!

【问题讨论】:

  • 应用程序的一千个线程是horrible 的想法!您正在浪费资源,因为所有线程都在尝试运行。您应该使用更少的线程数,甚至更好的是使用ThreadPool 而不是直接创建线程。
  • 这样做了.. 还是不行
  • 你可以为此发布一个新代码吗?

标签: c# multithreading sockets tcp


【解决方案1】:

找出问题所在,我在服务器控制台中突出显示了一些内容,导致服务器暂停。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    相关资源
    最近更新 更多