Сокет связи между C и Java - PullRequest
       39

Сокет связи между C и Java

0 голосов
/ 19 октября 2011

У меня есть клиент и сервер, работающие на C. Моя задача - представить Java-программу, в которой я создаю сервер для клиента C и клиент для сервера C.Я успешно пытаюсь настроить соединения должным образом.Однако проблема заключается в передаче данных между обеими программами на Си.Ниже приведено то, что я написал в своей java-программе:

while(true){
while((userInput1=br1.readLine())!=null||(userInput2=br2.readLine())!=null){
   if(userInput1=!null){
      bw1.write(userInput1);
      bw1.flush();
   }
   if(userInput2=!null){
      bw2.write(userInput2);
      bw2.flush();
   }
}    

При отладке вышеизложенного видно, что выполнение застревает во втором операторе while, что означает, что поток ввода ожидает вводаКлиент C навсегда.Я использую BufferedReader и BufferedWriter для потоков.Клиент и сервер C используют функции send и recv для связи.Пожалуйста, помогите с любыми входными данными, чтобы java-программа помогла обеим программам на C общаться друг с другом, как они обходятся без этого.

Ответы [ 3 ]

2 голосов
/ 19 октября 2011

Правильно ли вы учли эффект "короткого замыкания" или оператора Java?

С || если первое предложение истинно, второе никогда не оценивается.

   while(
        (userInput1=br1.readLine())!=null ||
        (userInput2=br2.readLine())!=null) {

Итак, вы успешно прочитали

 userInput1=br1.readLine())!=null

и немедленно введите вашу обработку, затем вернитесь к while и снова прочитайте следующую строку в userInput1. Следовательно, userInput2 никогда не получит значение.

Вам нужна отдельная логика, такая как

    read first line
    read second line 

Но что именно вы должны делать, когда читаете строку 2 и данные не готовы? Попробуйте снова? Строка, которую вы читаете, следующая ожидаемая строка2 или новая строка1? Это довольно сложно, чтобы получить право.

Я бы предпочел не полагаться на две отдельные строки в моем протоколе.

0 голосов
/ 27 октября 2011

причина, по которой я использую символ четности, заключается в интерпретации конца потока.В противном случае использование только read () заставляет программу останавливаться на вводе навсегда (даже после того, как фактический отправил все свои данные).Я использую функцию ready () следующим образом:

//The proxy client
while(true){
    if(br1.ready()){
        while((temp1=br1.read())!=(int)par)
            userInput1=userInput1+(char)temp1;
        System.out.println("Input to Actual Server: " + userInput1);
        bw1.write(userInput1);
        bw1.flush();
        System.out.flush();
        userInput1="";
        temp1=0;
        }
        if(br2.ready()){
            while((temp2=br2.read())!=(int)par)
                userInput2=userInput2+(char)temp2;
            System.out.println("Response from Actual Server: " + userInput2);
            userInput2=userInput2+par;
            bw2.write(userInput2);
            bw2.flush();
            System.out.flush();
            userInput2="";
            temp2=0;
        }
}

//The proxy server
while(true){
     if(br1.ready()){
         while((temp1=br1.read())!=(int)par)
                         userInput1=userInput1+(char)temp1;
         System.out.println("Input from Actual Client: " + userInput1);
         userInput1=userInput1+par;
         bw1.write(userInput1);
         bw1.flush();
         System.out.flush();
         userInput1="";
         temp1=0;
     }
     if(br2.ready()){
         while((temp2=br2.read())!=(int)par)
                userInput2=userInput2+(char)temp2;
         System.out.println("Response to Actual Client: " + userInput2);
         bw2.write(userInput2);
         bw2.flush();
         System.out.flush();
         userInput2="";
         temp2=0;
     }
}

Пожалуйста, сообщите, если есть какие-либо проблемы с использованием функции ready ().

0 голосов
/ 19 октября 2011
while((userInput1=br1.readLine())!=null||(userInput2=br2.readLine())!=null){

Это условие означает, что вы собираетесь читать br1 до EOS, прежде чем что-либо читать из br2.Это то, что вы на самом деле намеревались?

И наоборот, если вы застряли на br2.readLine(), это означает две вещи: (а) br1 на EOS и (б) равноправный узел, связанный с br2 hasnничего не отправили или, по крайней мере, не отправили строку, оканчивающуюся новой строкой.

Возможно, вы страдаете распространенным заблуждением, что readLine () возвращает ноль, когда нет данных, готовых для чтения?

Также вы читаете строки, оканчивающиеся символами новой строки, которые удаляются вызовом readLine (), и затем записываете их без каких-либо символов новой строки, что вряд ли может быть правильным.

Мне кажется, чтона самом деле вы пишете прокси, в этом случае вам нужно два потока на сокет, одно чтение из A и запись в B, а другое чтение из B и запись в A. И если это прокси, вы должны использовать InputStreams и OutputStreamsа не читателей и писателей, поскольку у вас, вероятно, нет причин проверять данные, и поэтому вам не следует подвергать их преобразованию byte-> char и char-> byteпроцессы, подразумеваемые с использованием Readers и Writers.Есть дополнительные тонкости при написании прокси, но я буду ждать вашего подтверждения, прежде чем выяснить их.

...