powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / создание ИМЕННО ДВУХ каналов связи между двумя приложениями
4 сообщений из 4, страница 1 из 1
создание ИМЕННО ДВУХ каналов связи между двумя приложениями
    #37374651
BaurzhanS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем доброго дня! Для начала опишу ситуацию, вопрос будет ниже. У меня есть сервер на Java, клиент на C#. Периодически они обмениваются информацией - это выглядит так:

сервер:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 
        reader =  new  BufferedReader( new  InputStreamReader(socket.getInputStream()));
        writer =  new  PrintWriter(socket.getOutputStream());
          //<periodically>
            writer.print("Calculation finished."+"\r\n");
            writer.flush();
          //</peroidically>
клиент:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 client = new TcpClient();
            try
            {
                client.Connect(Dns.GetHostEntry(Dns.GetHostName()).AddressList[0], port); //local server. for test only.
                //client.Connect(Dns.GetHostEntry("real adress here").AddressList[0], port);     //remote server
                ns = client.GetStream(); //NetworkStream
                sr = new StreamReader(ns); 
            }
             //<periodically>
               sr.ReadLine(); // recieve messages from server
          //</peroidically>
Для более понятного видения ситуации, скажу, что Java-сервер по какой-то фиксированной команде запускает внешнее приложение (С++), и начинает в потоке считывать его stdout и передавать c#-клиенту. У клиента прием с++-ного stdout-a тоже происходит в отдельном потоке. Сейчас все прекрасно работает, но мне недавно понадобилось помимо обмена сообщениями добавить функционал обмена файлами. Я погуглил, оказалось, что все несложно, те же write your_file_bytes to socket.getOutputStream() на Java и read server_file_bytes from TcpClient.GetStream() на C#. НО! У меня же что java-PrintWriter, что C#-StreamReader могут быть заняты обменом С++-ного stdouta и при попытке записи байтов пересылаемого файла у меня будет кокуретный/одновременный доступ к PrintWriter-у - фоновый поток пишет туда stdout, а основной поток будет писать файл. Аналогичная проблема в С# - пока фоновый поток читает stdout СтримРидером, основной поток тоже будет пытаться делать sr.ReeadLine() и опять будет эксепшн:(. Так вот, вопрос - как создать два канала связи - один для just_text_messages, один для пердачи файлов? Возможно мой вопрос наивеи и решение лежит на поверхности, но я придумал только очень мерзкий костыль - каждый байт превращать в два - сам байт и его тип - файл это или просто текст. А что бы не было доступа к PrintWriter-у из разных потоков, есть еше один костыль, но его описывать долго, это надо весь код выложить и пояснить. Но суть моего вопроса не в получении одобрения костыля, а в поиске более грамотного решения, если кто знает, поделитесь, пожалуйста.
...
Рейтинг: 0 / 0
создание ИМЕННО ДВУХ каналов связи между двумя приложениями
    #37375776
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Букв много, ясности мало.
Если хочешь два канала - открывай два канала. Тебя никто не ограничивает.
Если хочешь кидать не-текстовые данные вперемешку с текстовыми, придумай в своем протоколе а) флаги "сейчас пойдет текст/не текст" б) почитай про какой-нибудь uuecode и его кузенов - узнаешь как превращать бинарник в почти-текст.
...
Рейтинг: 0 / 0
создание ИМЕННО ДВУХ каналов связи между двумя приложениями
    #37378201
BaurzhanS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,

White Owlа) флаги "сейчас пойдет текст/не текст"
я об этом тоже говорил, но мне такой вариант не нравился - код громоздкий был бы (именно в моем случае)
BaurzhanSкаждый байт превращать в два - сам байт и его тип - файл это или просто текст.

Я сделал просто второй коннекшн и все теперь меня все устраивает, кроме скорости - 679 Кб передается около 5 минут! Я просто считываю файл строка за строкой на стороне сервера, отправляю клиенту очередную строку файла как сообщение и на клиенте пишу принятые строки в файл. Подскажите, как можно быстрее? В какую сторону копать? Поможет ли мне что-то вроде DataInputStream?
...
Рейтинг: 0 / 0
создание ИМЕННО ДВУХ каналов связи между двумя приложениями
    #37378215
BaurzhanS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BaurzhanS,

Только дописал предыдущее сообщение и нашел, в чем заключается проблема медленной передачи=) Я для наглядности выводил полученные строки файла в текст бокс на клиенте, чтобы видеть, нормально ли копируется, не "съедается" ли часть данных. Закомментировал добавление в текст бокс, оставил только запись полученной строки в файл на клиенте и все очень быстро отработало=) Но все же, если кто-то знает более хитрую технику, поделитесь=)
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / создание ИМЕННО ДВУХ каналов связи между двумя приложениями
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]