Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Проблема с TCP


Автор: artstalker 5.2.2009, 17:56
Всем привет. Есть клиент-сервер приложение для передачи файлов по TCP. Тестил на локалхосте и по локалке - всё работает. Вчера пробовал по тестить через инет - не может почему-то прочитать поток.. Ниже приведен текст программы и сама ошибка

Клиент:
    
Код

TcpClient eclient = new TcpClient("localhost",34567);  
    NetworkStream writerStream = eclient.GetStream();  
    BinaryFormatter format = new BinaryFormatter();  
    byte[] buf = new byte[1024 ];  
    int count;  
    FileStream fs = new FileStream("111.txt", FileMode.Open);  
    BinaryReader br = new BinaryReader(fs);  
    long k = fs.Length;//Размер файла.  
    format.Serialize(writerStream, k.ToString());//Вначале передаём размер  
    while ((count = br.Read(buf, 0, 1024 )) > 0)  
            {  
                 format.Serialize(writerStream, buf);//А теперь в цикле по 1024 байта передаём файл  
             }  



   Сервер:
   
Код

    cpListener clientListener = new TcpListener(34567);    
    clientListener.Start();    
     TcpClient client = clientListener.AcceptTcpClient();    
     NetworkStream readerStream = client.GetStream();    
     BinaryFormatter outformat = new BinaryFormatter();    
     FileStream fs = new FileStream("111.jpg", FileMode.OpenOrCreate);    
     BinaryWriter bw = new BinaryWriter(fs);    
     int count;    
/*В следующей строчке error возникает: 
 Не удается прочитать данные из транспортного соединения: Удаленный хост принудительно разорвал 
  существующее подключение.*/  
   
     count = int.Parse(outformat.Deserialize(readerStream).ToSt  ring());//Получаем размер файла    
     int i=0;    
     for (; i < count;i += 1024 )//Цикл пока не дойдём до конца файла    
             {    
     
                 byte[]  buf = (byte[])(outformat.Deserialize(readerStream));//Собственно читаем из потока и записываем в файл    
                 bw.Write(buf);    
             }    
                 
     bw.Close();    
     fs.Close();    
     
     Console.ReadLine();    


Подскажите какая может быть причина?

Автор: artstalker 6.2.2009, 22:58
Ап. Возможно проблема в том, что при тестирование клиент и сервер выходили в инет через локалку?

Автор: artstalker 12.2.2009, 01:23
ап

Автор: artstalker 15.2.2009, 18:28
А проблема лежала на поверхности. Я там голову ломал, думал может фаервол не пускает, или пакеты не доходят... А что оказалось: клиент пересылал серверу пакеты и сразу закрывался, соответственно обрывая TCP подключение. На локалхосте и домашнем LAN-е просто хватало времени, чтобы передать до закрытия. Т.е. стоит просто добавить в конце клиента Console.ReadLine(); =)

Автор: AndriyMD 17.2.2009, 13:54
и что, все работает? странно. TCP протокол используется только в пределах локальной сети. для связи через интернет нужно использовать другие протоколы (HTTP, FTP).

Автор: Partizan 17.2.2009, 16:53
AndriyMD, вы ошибаетесь. TCP/IP и HTTP/FTP - это протоколы разного уровня...

http://www.google.ru/search?q=%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C+OSI&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox-a

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