Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Распределённые приложения и сеть > Не коннектится клиент


Автор: Ronin08 11.3.2008, 00:30
Вопрос следующего характера:

Имеется клиен:

Код

public Form1()
        {
            InitializeComponent();
        }

        private void btnSend_Click(object sender, EventArgs e)
        {
            TcpClient tcpClient = new TcpClient(txtHost.Text, Int32.Parse(txtPort.Text));
            NetworkStream ns = tcpClient.GetStream();
            FileStream fs = File.Open("c:\\aaa.txt", FileMode.Open);
            int data = fs.ReadByte();
            while (data != -1)
            {
                ns.WriteByte((byte)data);
                data = fs.ReadByte();
            }
            fs.Close();
            ns.Close();
            tcpClient.Close();
        }


Имеется сервер:

Код

public Form1()
        {
            InitializeComponent();
            Thread thread = new Thread(new ThreadStart(Listen));
            thread.Start();
        }
        public void Listen()
        {
            IPAddress localAddr = IPAddress.Parse("192.168.26.1");
            Int32 port = 2112;
            TcpListener tcpListener = new TcpListener(localAddr, port);
            tcpListener.Start();
            TcpClient tcpClient = tcpListener.AcceptTcpClient();
            NetworkStream ns = tcpClient.GetStream();
            StreamReader sr = new StreamReader(ns);
            string result = sr.ReadToEnd();
            Invoke(new UpdateDisplayDelegate(UpdateDisplay),
                   new object[] { result });
            tcpClient.Close();
            tcpListener.Stop();
         }

        public void UpdateDisplay(string text)
        {
            txtDisplay.Text = text;
        }

        protected delegate void UpdateDisplayDelegate(string text);


Когда запускаю на одной машине, то все хорошо работает
в поле хоста указываю имя своей машине, в поле порт например 2112;

пробую тоже самое проделать через виртуальную машину (vmware) -> проблема 
это  связано видимо с тем, что на сервере я указываю Ip той машины от которой должно прийти сообщение (клиент), а кампилятор ругается, что на этой  машине (сервер) такой ip не обнаружен.

что надо изменить? 


Автор: zaver 11.3.2008, 01:41
Цитата(Ronin08 @ 11.3.2008,  00:30)
кампилятор ругается, что на этой  машине (сервер) такой ip не обнаружен.

наверное компилятор нового поколения=)))) 
поделу: попробуй попинговать что-ли и проверить настройки фаервола. если не поможет, ну тогда это потрясающая аномалия!

Автор: Ronin08 11.3.2008, 11:42
Все, разобрался! 
zaver, это не аномалия, а несвежая голова smile 
Как говорится "утро вечера мудренее"

Тогда еще вопрос:
При повторной посылке файла ааа.txt приложение подвесает.
Что надо изменить на сервере, чтобы можно было еще раз получить этот же файл (или другой)?


Автор: Alexsar 11.3.2008, 23:22
можно так: создаёшь цикл, в котором ждёшь подключение клиентов, как только клиент подрубается, создавай новый поток для этого клиента, а дальше принимай данные
код сервера примерно выглядит так

Код

  //связываем сервер с локальным портом
  TcpListener clientListener = new TcpListener(confXml.PORT);

   //начинаем слушать
   clientListener.Start();

    //textBox1.Text = "Waiting for connections..";

     while (true)
     {
           //даём согласие на соединение
           TcpClient client = clientListener.AcceptTcpClient();

           ClientHandler cHandler = new ClientHandler();

           //передаём значение объекту ClientHandler
            cHandler.clientSocket = client;

            //создаём новый поток для клиента
            clientThread = new Thread(new ThreadStart(cHandler.RunClient));
            clientThread.Start();
        }
        clientListener.Stop();



класс ClientHandler
Код

 class ClientHandler
    {
        public TcpClient clientSocket;

        public void RunClient()
        {
            //создаём классы потоков
            StreamReader readerStream = new StreamReader(clientSocket.GetStream());


            string result = readerStream.ReadToEnd();
            Invoke(new UpdateDisplayDelegate(UpdateDisplay),
                   new object[] { result });
            clientSocket.Close();
        }
    }


Автор: Ronin08 15.3.2008, 01:51
не получается так
ошибка на стороне клиента : "Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение"

и что значит в строчке:
Цитата

TcpListener clientListener = new TcpListener(confXml.PORT);


параметр confXml.PORT?

Автор: Alexsar 15.3.2008, 23:31
вместо confXml.PORT поставь номер своего порта, забыл убрать
на счёт ошибки - стандартный файервол случайно не включен?

Автор: Ronin08 16.3.2008, 23:42
Цитата

на счёт ошибки - стандартный файервол случайно не включен? 

 отключен

код на стороне сервера такой: (но где-то ошибка)
Код

namespace TcpReceive
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            
                InitializeComponent();
                int i = 0;
                IPAddress localAddr = IPAddress.Parse("192.168.26.1");
                Int32 port = 2112;
                TcpListener tcpListener = new TcpListener(localAddr, port);
                tcpListener.Start();

                while (i == 5)
                {
                    TcpClient tcpClient = tcpListener.AcceptTcpClient();
                    ClientHandler cHandler = new ClientHandler();

                    //передаём значение объекту ClientHandler
                    cHandler.clientSocket = tcpClient;

                    //создаём новый поток для клиента
                    Thread clientThread = new Thread(new ThreadStart(cHandler.RunClient));
                    clientThread.Start();
                    i++;                   
                }
                tcpListener.Stop();
        }
           
        class ClientHandler
        {
            public TcpClient clientSocket;

            public void RunClient()
            {
                //создаём классы потоков
                StreamReader readerStream = new StreamReader(clientSocket.GetStream());


                string result = readerStream.ReadToEnd();
                Invoke(new UpdateDisplayDelegate(UpdateDisplay),
                       new object[] { result });
                clientSocket.Close();          
            }

            private void Invoke(UpdateDisplayDelegate updateDisplayDelegate, object[] p)
            {
                throw new Exception("The method or operation is not implemented.");
            }

            protected delegate void UpdateDisplayDelegate(string text);      
        
        }

        public void UpdateDisplay(string text)
        {
            txtDisplay.Text = text;
        }       
    
    }

}

на клиенте прежний.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)