Реализация приложения TCP Client Server с C # - PullRequest
2 голосов
/ 04 декабря 2011

Я пытаюсь реализовать приложение клиент-сервер, котороеПрограмма сервера имеет счетчик, который увеличивается на единицу по запросу (значение счетчика, предоставленное клиенту, не может быть дублировано)Клиентская программа просит серверную программу увеличить счетчик и получить увеличенное значениеСерверная программа должна быть способна обрабатывать несколько клиентов (не менее 5) одновременноЗначение счетчика должно быть общим для всех потоков сервера, если таковые имеются

Я реализовал сервер и клиентские приложения в отдельных проектах. Когда я запускаю сервер, а затем клиент, серверные программы следующей строки выдают исключение NullReferanceException.

NetworkStream netstream = ((TcpClient)client).GetStream();

Я новичок в C #. Я хочузнать, как клиент может подключиться к серверу и получить увеличенное значение.Я приложил свой код здесь.Заранее спасибо.MyServer.cs

public abstract class MyServer
    {

        private static int port = 8080;
        private static TcpListener listener;
        private static Thread thread;
        private static int clientId = 0;

        static void Main(string[] args)
        {

            listener = new TcpListener(new IPAddress(new byte[] {127,0,0,1}),port);
            thread = new Thread(new ThreadStart(Listen));
            thread.Start();
        }


        private static void Listen()
        {
            listener.Start();
            Console.WriteLine("Listening on: " + port.ToString());

            while(true)
            {
                Console.WriteLine("Waiting for connection....");
                Console.WriteLine("Client No: " + clientId);
                TcpClient client = listener.AcceptTcpClient();
                Thread listenThread = new Thread(new ParameterizedThreadStart(ListenThread));
                listenThread.Start();
            }
        }

        private static void ListenThread(Object client)
        {

                NetworkStream netstream = ((TcpClient)client).GetStream();
                Console.WriteLine("Request made");
                clientId = clientId + 1;
                // String message = "Hello world";
                byte[] resMessage = Encoding.ASCII.GetBytes(clientId.ToString());
                netstream.Write(resMessage, 0, resMessage.Length);
                netstream.Close();


        }
    }

MyClient.cs

 class MyClient
    {
        static void Main(string[] args)
        {
            TcpClient tcpClient;
            int port = 8080;
            NetworkStream stream = null;

            tcpClient = new TcpClient("127.0.0.1", port);
            Console.WriteLine("Connection was established....");

            stream = tcpClient.GetStream();

            Byte[] response = new Byte[tcpClient.ReceiveBufferSize];
            stream.Read(response,0,(int)tcpClient.ReceiveBufferSize);

            String returnData = Encoding.UTF8.GetString(response);
            Console.WriteLine("Server Response " + returnData);

            tcpClient.Close();
            stream.Close();

        }
    }

1 Ответ

3 голосов
/ 04 декабря 2011

Вы запускаете поток без аргументов, пока он ожидает (TcpStream клиента). Изменить это:

listenThread.Start();

к этому:

listenThread.Start(client);

Кстати, я бы назвал эту нить clientThread, а не listenThread; поток не слушает, он обслуживает клиента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...