2013-03-18 3 views
0

Я отправляю строки через сокет от клиента на C и читаю на сервере в Java. Лучшее, что я могу решить, это то, что клиент отправляет несколько строк, а когда я закрываю клиент, сервер печатает все данные в одной строке. Или сделать так, чтобы один отправил, а затем получил и т. Д. Мое желание состоит в том, что приложение C отправляет «Hi» в цикле, а файлы Java захватывает первый привет, печатает, а затем ловит второй и печатает. Сейчас он печатает «HiHiHiHi ...», но только когда соединение завершено.Чтение строки по строке из сокета

Я использую oracle socket example в качестве ориентира и с помощью другого guide для клиента C

Поэтому чтение сокета в Java является:

try { 
     ServerSocket serverSocket = null; 
     try { 
      serverSocket = new ServerSocket(port); 
     } catch (IOException e) { 
      System.err.println("Could not listen on port: 4444."); 
      System.exit(1); 
     } 
     Socket clientSocket = null; 
     try { 
      clientSocket = serverSocket.accept(); 
      System.out.println("Connected with client"); 
     } catch (IOException e) { 
      System.err.println("Accept failed."); 
      System.exit(1); 
     } 
     out = new PrintWriter(clientSocket.getOutputStream(), true); 
     BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
     String inputLine; 

     while ((inputLine = in.readLine()) != null) { 
      System.out.println("RECEIVING " + inputLine); 
     } 
     out.close(); 
     in.close(); 
     clientSocket.close(); 
     serverSocket.close(); 
    } catch (IOException ex) { 
     Logger.getLogger(Connection.class.getName()).log(Level.SEVERE, null, ex); 
    } finally { 
     out.close(); 
    } 

Попытка записи в сокет в цикле в то время как та же строка в C:

void connection(void) { 
    int sockfd, portno; 
    struct sockaddr_in serv_addr; 
    struct hostent *server; 

    /* Set time limit. */ 
    timeout.tv_sec = 0; 
    timeout.tv_usec = 10; 

    portno = 4444; 
    sockfd = socket(AF_INET, SOCK_STREAM, 0); 

    if (sockfd < 0) 
     error("ERROR opening socket"); 
    server = gethostbyname("Localhost"); 
    if (server == NULL) { 
     fprintf(stderr,"ERROR, no such host\n"); 
     exit(0); 
    } 
    bzero((char *) &serv_addr, sizeof(serv_addr)); 
    serv_addr.sin_family = AF_INET; 
    bcopy((char *)server->h_addr, 
     (char *)&serv_addr.sin_addr.s_addr, 
     server->h_length); 
    serv_addr.sin_port = htons(portno); 
    if (connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) < 0) 
     error("ERROR connecting"); 
    while(1) { 
     /* Create a descriptor set containing our two sockets. */ 
     FD_ZERO(&fds); 
     FD_SET(sockfd, &fds); 
     rc = select(sizeof(fds)*8, &fds, NULL, NULL, &timeout); 
     if (rc==-1) { 
      perror("select failed"); 
     } 
      bzero(buffer,256); 
      char *buffer2 = "here"; 

      n = write(sockfd,buffer2,strlen(buffer2)); 
      if (n < 0) 
       error("ERROR writing to socket"); 

    } 
} 
+0

Что ваш вопрос? –

+0

В чем вопрос? – CodeChimp

+0

Я отредактирую, чтобы было ясно. Проблема в том, как изменить код c (almsot обязательно его здесь), чтобы мой java-файл получал строку и печатает, строчку и отпечатки. – Juan

ответ

1

Ваш компьютер ждет \ n, прежде чем он что-либо распечатает.

Ваш клиент не отправляет ни одного символа \ n.

Вы можете попробовать:

char *buffer2 = "here"\n; 
+0

Спасибо, \ n должен быть внутри ", но, кроме того, это хорошо. Я думаю, что моя идея, что" "положить нулевой символ в конце было достаточно, было неправильно. – Juan

Смежные вопросы