Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Как реализовать в одном файле код клиентской и серверной части

Только начал изучать сети, поэтому вопрос такой:каким образом реализовать в одном файле код клиентской части и код серверной части, для разработки приложения"клиент/сервер"?
Ответ:
Сообщение от XRuZzz
А как насчёт двух потоков, один с клиентом, другой с сервером? потоки обмениваются между собой с помощью сообщений.
Не совсем меня поняли)Я разобрался с подходом.Вопрос вот в чем:есть программная реализация серверной части и программная реализация клиентской части - это 2 разных файла, в которых есть по main().Теперь для реализации приложения клиент сервер, что мне нужно?один файл подключить к другому?или объединить 2 main() в один?

Добавлено через 28 секунд
Сообщение от Velesthau
Создать два сокета: один будет клиентским, другой - серверным. Ну и дальше работать с ними.
Не совсем меня поняли)Я разобрался с подходом.Вопрос вот в чем:есть программная реализация серверной части и программная реализация клиентской части - это 2 разных файла, в которых есть по main().Теперь для реализации приложения клиент сервер, что мне нужно?один файл подключить к другому?или объединить 2 main() в один?
Вопрос: Обеспечить доступ двух программ к одному файлу

Здравствуйте! Вчера пытался сделать игру на двоих с помощью общего доступа в локальной сети. Запускал игру сначала на одном, потом на другом компьютере. Когда запустил на первом компьютере, всё работало нормально. Когда подключил второй компьютер, то заметил что первый компьютер как бы не замечает изменения в файле(где хранится позиция каждого из игроков), такое ощущение что второй компьютер своим подключением перекрыл доступ. Сам в свою очередь имел доступ к файлу и обновлял его. Вопрос такой - "Можно ли наладить одновременное подключение двух программ к одному файлу, чтобы каждый из них во время подключения имел доступ к файлу(мог оперировать над ним)?".
Ответ:

Не по теме:

лучше это решать через сетевые протоколы обмена вместо файлов.


Ваша проблема скорее в наличии кэша отложенной записи операционной системы. как вариант (50/50) вносить изменения в файл и закрывать его. при чтении аналогично - открыл файл, считал нужную позицию, закрыл файл. Наладить подключение к одному файлу можно - базы данных же успешно работают, но там есть тайм аут на обновление.

Добавлено через 1 минуту
одновременно обновлять одни и те-же записи скорее всего в файле не получится.
Вопрос: Загрузка больше одного файла

Делаю загрузку файла через webclient, но качается только один файл, качаю через DownloadFileAsync с прогрессбаром.
Нужно бы ещё и его обновлять через загрузку файла, но я не могу их даже разделить, качается только один файл, а остальные нет, как сделать чтобы загружалось несколько файлов и желательно поочередно?
Ответ: Вроде сделал, но все равно качается один файл, второй 0 байт весит и прогресбар не сбрасывается.
Посмотрите пожалуйста, что не так сделал.
Вопрос: Ошибка при первом запуске jar файла

Здравствуйте, написал программку и упаковал её в jar файл, но при первом его запуске(после перезагрузки компьютера) - появляется непонятная ошибка, которую не могу отследить, так как ошибка проявляется только при запуске самого jar файла, а если запускать программу из средства разработки ошибки не возникает.
При последующих запусках, всё работает нормально.
Дальше больше, решил вывести сообщение об ошибке в лог файлы, но хз почему, лог файлы не появились и сообщения(см. код) не показались, запустил ещё раз - всё нормально(т.е. прога запустилась нормально и ошибку не удалось установить).
Т.е. возникает какое-то исключение + точно FileNotFoundException - но непонятно почему. Файл есть, что за другая ошибка вообще непонятно.
Подозреваю что что то связанное с инициализацией самой java машины - т.е. может какая-то java библиотека не успевает загрузиться и десерилизация нормально не проходит. А при повторных запусках всё нормально.
Сама функция вызывается ещё через одну функцию, которая вызывается из конструктора.

По логике этой функции, при первом запуске, если не удаётся найти файл статистики, значит первый запуск программы(вообще первый запуск, а не только первый запуск при загрузке компьютера) - и создаётся файл статистики. Но опять же, при первом запуске, при загрузке компьютера, файл статистики не создаётся, т.е. из-за этой ошибки не записать не считать файл не удаётся.
Переменная STATA_FILE - не содержит никаких путей, просто название файла, который лежит в одном каталоге с jar файлом программы.
Помогите разобраться в чём причина ошибки.
Может ли быть это связанно с тем что на компьютере установлено несколько разных java машин на 64 и на 32 ?

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
// Загружаем файл статистики
    private synchronized boolean loadStoredStataObj() {
        try {
            FileInputStream fis = new FileInputStream(STATA_FILE);
            ObjectInputStream ois = new ObjectInputStream(fis);
            this.sStata = (MonitorStat[]) ois.readObject();
            ois.close();
            fis.close();
            return false; // Не первый запуск
        } catch (FileNotFoundException e) {
 
            // Отлавливаем ошибку в лог
            File file = new File("stat_err.log");
            PrintStream ps = null;
 
            try {
                ps = new PrintStream(file);
            } catch (FileNotFoundException fnf) {
                fnf.printStackTrace();
            }
 
            e.printStackTrace(ps);
 
            saveStoredStataObj(); // Первый запуск, сохраняем файл статистики проинициализированным массивом
            System.out.println("Файл статистики не найден");
            //JOptionPane.showMessageDialog(null, "Файл статистики не найден", "", 2);
            return true; // Первый запуск, настроек ещё нет
        } catch (Exception exc) {
 
            // Отлавливаем ошибку
            File file = new File("stat_err2.log");
            PrintStream ps = null;
 
            try {
                ps = new PrintStream(file);
            } catch (FileNotFoundException fnf) {
                fnf.printStackTrace();
            }
 
            exc.printStackTrace(ps);
 
            saveStoredStataObj(); // Первый запуск, сохраняем файл статистики проинициализированным массивом
            System.out.println("Ошибка");
            JOptionPane.showMessageDialog(null, "Ошибка загрузки файла статистики", "", 2);
            exc.printStackTrace();
            return true; // Первый запуск, настроек ещё нет
        }
 
 
    }
Ответ: Спасибо, помогло, всё работает.
Не понятно только почему раньше после первого неудачного запуска, со второго запуска файл нормально цеплялся.

Java
1
2
3
4
5
6
7
8
9
10
11
12
        File file = null;
 
        try {
            file = new File(App.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
            folder = file.getParent();
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
 
.....
 
           FileInputStream fis = new FileInputStream(folder + File.separator + STATA_FILE);
Вопрос: Запуск .bat файла с передачой в него параметров

Нужна помощь, перечитал не один десяток страниц, но так и не нашел рабочего способа запуска bat файла из C#. Также мне нужно передать в bat файл параметры. Если запускать bat руками из системы - то все ок работает, bat файл ровный.
Содержимое bat файла:
Windows Batch file
1
2
3
4
@echo off
 
call apktool\apktool.bat d -s -f ПАРАМЕТР_ИЗ_C#
pause
При вызове bat данным способом пишет что системе не удается найти указанный путь:
C#
1
Process.Start("bin\\decompile.bat"); //даже если я указываю путь начиная с диска, полностью до файла bat, все равно не удается найти путь..
Таким образом тоже самое, даже если указывая полный путь к файлу bat:
C#
1
2
3
Process cmd = new Process();
cmd.StartInfo = new ProcessStartInfo("cmd.exe", "/c " + "bin\\decompile.bat");
cmd.Start();
Добавлено через 7 минут
Запустить bat файл из C# получилось, как теперь передать параметр в него из C#?
C#
1
2
3
4
Process myProcess = new Process();
myProcess.StartInfo.FileName = "cmd.exe";
myProcess.StartInfo.Arguments = @"/C cd " + Application.StartupPath + "/bin & decompile.bat";
myProcess.Start();
Добавлено через 51 минуту
Уже разобрался, можно закрывать тему.
C#
1
myProcess.StartInfo.Arguments = @"/C cd " + Application.StartupPath + "/bin & decompile.bat ПАРАМЕТР";
%1 будет принимать параметр, то есть это и есть параметр из C#
Windows Batch file
1
2
3
4
@echo off
 
call apktool\apktool.bat d -s -f %1
pause
Ответ: Теперь другая проблема появилась, нужно чтобы окно выполнения bat файла было скрыто. Тут все просто, добавляем изменяем свойства нашего процесса так:
C#
1
2
procUnpackDat.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
procUnpackDat.StartInfo.CreateNoWindow = true;
НО что делать если из bat файла еще вызывается другой exe файл, если использовать параметр в bat файле /B(скрыть окно для процесса) C# думает что процесс завершился и сразу идет дальше выполнение кода. Вот мой пример.
C#
1
2
3
4
5
6
7
Process procUnpackDat = new Process();
                procUnpackDat.StartInfo.FileName = "cmd.exe";
                procUnpackDat.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                procUnpackDat.StartInfo.CreateNoWindow = true;
                procUnpackDat.StartInfo.Arguments = @"/C cd " + Application.StartupPath + "/bin/dat/ & unpackDat.bat " + fileList + " " + fileDat;
                procUnpackDat.Start();
                procUnpackDat.WaitForExit();
Windows Batch file
1
2
@ECHO off
start /wait /B sdat2img.exe %1 %2 system.img
После вызова unpackDat.bat из С#, из-за параметра /B СиШарп думает что процесс уже завершен, хотя это не так, и идет дальше по коду. Если убрать параметр /B то окно выполнения exe файла видно и процесс идет нормально, как нужно, НО мне необходимо скрыть это окно выполнения.
Вопрос: При запуске exe-файла программа не видит картинки

сами картинки находятся в папке с проектом, при запуске из vs все исправно работает, однако при запуске .exe файла из папки debug оно эти картинки не видит и собственно программа вылетает...что сделать?куда их закинуть, чтобы все видело?
Ответ: Ну что ж, раз такая пьянка, то могу предложить рецепт, как гарантированно находить файл, который в одной папке с главным модулем.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  char szImgPath[MAX_PATH] = {0};
  //получаем путь на наш EXE-файл
  ::GetModuleFileName( NULL, szImgPath, MAX_PATH );
  //получаем путь на файл картинки...   условие - файл картинки находится в той же папке, что и EXE-файл
  StrCpy(::PathFindFileName(szImgPath), "back.bmp");
  if (!PathFileExists(szImgPath))
  {
    //это только в случае, если забыл поместить картинку
    MessageBox(NULL, "Image file not found!!!", "MyApp", MB_OK);
    return 0;  //exit from app
  }
 
  //файл найден, загружаем картинку  ( псевдокод )
  mySDLImageLoader.LoadImage(szImgPath);
Если в проекте требуется держать картинки где-то отдельно, разбирайтесь, как в WIN API работать с путями.
Вопрос: Запуск jar файла

Здравствуйте. Кто-нибудь может подсказать, что делать, если при попытке запуска jar файла (как двойным щелчком,так и из командной строки) окно открывается примерно на секунду и моментально закрывается?
При попытке проверить через cmd выдало такое

 Комментарий модератора 
Прикрепляйте изображения к посту.
Ответ: Так никто не скажет нужен код
Вопрос: Запуск .class файла через иконку

если назначить на .class-файлы jvm, то при запуске такого файла передается Cls.class, а java в свою очередь ожидает без расширения и выдает ошибку.
какие есть варианты, чтобы работало, как надо?
Ответ: Запускать class файл напрямую - это плохая идея.
Напишите bat-ник, или запакуйте в jar-ник.
Вопрос: Как указать в проекте на запуск Bat файла

Как указать в проекте на запуск Bat файла?
По возможности для Windows и Linux
Заранее спасибо!
Ответ: KEKCoGEN, в Linux'e командный файл .sh?
Вопрос: Результат в один файл / Delphi XE

Сейчас программа сохраняет результат в разные файлы, не могу разобраться как сохранить все результаты в один файл.

Ребята, Может кто подскажет ?
Код:

procedure ProcessedFile(var F: TextFile; const Matching: array of string);
type
  // Информация об искомых строках
  StrInfo = record
    // В какой файл пишем результат
    F: TextFile;
    // Текущая позиция поиска
    Idx: Integer;
  end;
var
  LenArray: Integer;
  Str: string;
  InfoData: array of StrInfo;
  i: Integer;
  // Какой символ из считанной строки сравнивается
  CharIdx: Integer;
  // Сколько подстрок совпало
  MatchCnt: Integer;
  LenStr: Integer;
begin
  LenArray := Length(Matching);
  SetLength(InfoData, LenArray);
  // Используем это поле, чтобы узнать какие файлы удалось открыть
  // 0 - файл закрыт
  for i := 0 to LenArray - 1 do
    InfoData[i].Idx := 0;
  try
    // Открываем все файлы на запись
    for i := 0 to LenArray - 1 do begin
      AssignFile(InfoData[i].F, IntToStr(i + 1) + '.txt');
      Rewrite(InfoData[i].F);
      // Файл открылся, 0 убрали
      InfoData[i].Idx := 1;
    end;
  
    while not Eof(F) do begin
      // Читаем следующую строку из файла
      Readln(F, Str);
      // Сравнение для всех подстрок начинаем с 1 символа
      for i := 0 to LenArray - 1 do
        InfoData[i].Idx := 1;
      // Пока не нашли ни одной подстроки
      MatchCnt := 0;
      // Сравниваем каждый считанный символ с текущей позицией в искомой подстроке
      for CharIdx := 1 to Length(Str) do begin
        for i := 0 to LenArray - 1 do begin
          LenStr := Length(Matching[i]);
          // Если еще не нашли всю подстроку
          if InfoData[i].Idx <= LenStr then begin
            // Если текущий считанный символ совпадает с текущим символом в искомой подстроке
            if Str[CharIdx] = Matching[i, InfoData[i].Idx] then begin
              // Если дошли до конца подстроки, то совпали все символы
              if InfoData[i].Idx = LenStr then begin
                // Увеличиваем число совпадений
                Inc(MatchCnt);
                // Записываем считанную строку в нуужный файл
                Writeln(InfoData[i].F, Str);
              end else
                // Увеличиваем позицию
                Inc(InfoData[i].Idx);
            end else begin
              // Если текущий считанный символ НЕ совпадает с текущим символом в искомой подстроке
              // то начинаем поиск по этой подстроке сначала
              InfoData[i].Idx := 1;
            end;
          end;
        end;
        // Если нашли ВСЕ подстроки, то дальше проверять символы не нужно
        if MatchCnt = LenArray then
          Break;  // прерываем текущую итерацию
      end;
    end;
  finally
    // Закрываем все открытые файлы
    for i := 0 to LenArray - 1 do begin
      // Если файл был открыт, то закрываем
      if InfoData[i].Idx <> 0 then
        CloseFile(InfoData[i].F);
    end;
  end;
end;
  
procedure TForm1.Button1Click(Sender: TObject);
var
  F: TextFile;
begin
  if OpenDialog1.Execute then begin
    AssignFile(F, OpenDialog1.FileName);
    Reset(F);
    try
      ProcessedFile(F, [Edit1.Text, Edit2.Text, Edit3.Text]);
    finally
      CloseFile(F);
    end;
  end;
end;

Ответ:
Код:

AssignFile(fResult, GenerateFileName('D:\Result.txt'));