Задать вопрос
Morpheus_God
@Morpheus_God

Не работает корректно многопоточный сервер. Где я допустил ошибку?

Добрый день. Переписываю свое серверное приложение и столкнулся с непонятным поведением.
Когда подключается второй клиент, то после пары сообщений сервер перестает принимать от него сообщения.
Первый же клиент подключенный может спокойно посылать сообщения на сервер.
В чем может быть причина?
Вот код класса сервера :
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace Server
{
    public class Server
    {
        private Socket listenSocket;
        private Socket clientSocket;
        private IPEndPoint ip;

        public Server(int port)
        {
            listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            ip = new IPEndPoint(IPAddress.Any, port);
        }

        public void StartServer(int backlog)
        {
            listenSocket.Bind(ip);
            listenSocket.Listen(backlog);
        }

        public void ClientAccept()
        {
            clientSocket = listenSocket.Accept();
        }

        public void MessageDecode()
        {
            byte[] buffer = new byte[clientSocket.SendBufferSize];
            int readByte;

            do
            {
                // Вывод полученных данных от клиентов.
                readByte = clientSocket.Receive(buffer);
                byte[] rData = new byte[readByte];
                Array.Copy(buffer, rData, readByte);
                string data = Encoding.ASCII.GetString(rData);

                Console.WriteLine($"[{DateTime.Now.ToString()}] [{((IPEndPoint)clientSocket.RemoteEndPoint).Address.ToString()}] написал: " + data);
            } while (readByte > 0);
            Console.WriteLine($"[{DateTime.Now.ToString()}] Клиент отключился");
            Console.ReadKey();
        }
    }
}


Вот как я вызываю в методе Main :
using System;
using System.Threading;

// Сервер
namespace Server
{
    class Program
    {

        static void Main(string[] args)
        {
            int port = 904;
            int backlog = 0;

            // Инциализация сервера.
            Server srv = new Server(port);

            try
            {
                srv.StartServer(backlog);
                Console.WriteLine("Server started....");
            }
            catch { }

            while (true)
            {
                srv.ClientAccept();

                Thread clientThread = new Thread(() => srv.MessageDecode());
                clientThread.Start();
            }
        }
    }
}
  • Вопрос задан
  • 157 просмотров
Подписаться 2 Простой Комментировать
Решения вопроса 1
AlexanderYudakov
@AlexanderYudakov
C#, 1С, Android, TypeScript
У вас "clientSocket" в единственном экземпляре. А должно быть - по одному экземпляру на каждого подключившегося клиента.
При этом "listenSocket" - все верно, должен быть один.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы