2016-01-07 4 views
2

Я создал сервер C и java-клиент. Я отправлял команду, как ls через клиента, и сервер должен ее выполнить. Однако чтение на сервере c все еще ждет ввода. Как решить эту проблему.C сервер и java-клиент

Java клиент

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.PrintWriter; 
import java.net.Socket; 
import java.util.Scanner; 


class HelloWorld 
{ 
    public static void main(String... abc) { 

    try 
    { 
     BufferedReader br = new BufferedReader(new  InputStreamReader(System.in)); 
     System.out.println("Enter ip and port : "); 
     String ip ; 
     String p; 
     String ss; 
     int port; 

     ip = br.readLine(); 
     p = br.readLine(); 
     port = Integer.parseInt(p); 
     Socket s = new Socket(ip,port); 
     OutputStream os = s.getOutputStream(); 
     PrintWriter pw = new PrintWriter(os); 

     Scanner in = new Scanner(System.in); 
     ss = in.nextLine();  
     pw.print(s); 
     pw.flush(); 
     pw.close(); 
    } 
    catch(Exception e){ 
     System.out.println("ERROR!!!");} 
    } 
} 

вот с сервером.

#include"Headers.h" 

void comm(char * s_port) 
{ 
    int sockfd, newsockfd, portno; 
    socklen_t clilen; 
    char buffer[MAXBUFFER]; 
    char newbuffer[MAXBUFFER]; 
    char var[MAXBUFFER] = " > file.txt"; 
    int n; 

    struct sockaddr_in serv_addr, cli_addr; 

    FILE *fp = NULL; 

    sockfd = socket(AF_INET, SOCK_STREAM, 0); 

    if (sockfd < 0) 
    error("ERROR opening socket"); 

    bzero((char *) &serv_addr, sizeof(serv_addr)); 
    portno = atoi(s_port); 

    serv_addr.sin_family = AF_INET; 
    serv_addr.sin_addr.s_addr = INADDR_ANY; 
    serv_addr.sin_port = htons(portno); 

    if (bind(sockfd, (struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) 
      error("ERROR on binding"); 

    listen(sockfd,5); 
    clilen = sizeof(cli_addr); 
    newsockfd = accept(sockfd,(struct sockaddr *) &cli_addr,&clilen); 

    if (newsockfd < 0) 
      error("ERROR on accept"); 
    while (1) 
    { 
     bzero(buffer,1024); 
     n = read(newsockfd,buffer,1024); 

     if (strcmp(buffer , "exit\n") == 0) 
     break; 

     if (n < 0) error("ERROR reading from socket"); 
     printf("Here is the message: %s\n",buffer); 
     strcpy(newbuffer,""); 
     if (buffer[strlen(buffer) - 1] == '\n') 
      buffer[strlen(buffer) - 1] = '\0'; 

     strcat(newbuffer, buffer); 
     strcat(newbuffer, var); 
     printf("%s",newbuffer); 
     system(newbuffer); 
     break; 

    if (n < 0) error("writing to socket"); 
} 
    close(newsockfd); 
    close(sockfd); 
} 
+0

И код c находится в файле с именем «Sources.c»? :)) –

+0

можно усовершенствовать – Tejas

+0

@Tejas он троллинг, потому что у вас есть «включить» Headers.h »' –

ответ

3
n = read(newsockfd,buffer,1024); 

    if (strcmp(buffer , "exit\n") == 0) 
    break; 

Вы забыли реализовать протокол. Вы не можете просто прочитать произвольную связку байтов из соединения, а затем обработать его как сообщение. TCP не имеет представления о сообщении. Если вы хотите отправлять и получать сообщения, вы должны определить, что вы подразумеваете под «сообщением» и писать код для отправки и получения, который реализует это определение.

Возможно, есть другие проблемы с вашим кодом, но этот дефект настолько серьезен и настолько фундаментален, что вам действительно нужно исправить его в первую очередь.

Если ваше определение сообщения представляет собой «последовательность символов ASCII, не включающих нулевой байт или новую строку, завершаемую новой строкой», тогда вам нужно написать код для получения такой последовательности. Вы не можете просто позвонить read и ожидать, что он найдет границы сообщений, поскольку он не знает, что вы используете новую строку как границу сообщения.

+0

может у вас объяснить, как я могу продолжить @david – Tejas

+0

Если вам нужны сообщения, выберите формат сообщения и напишите код отправлять и получать сообщения в выбранном вами формате. –

0

У вас есть небольшая опечатка в программе Java:

pw.print(s); 

s является сокетом, так что вы отправляете s.toString(). Я думаю, что вы имеете в виду:

pw.print(ss); 

Кроме того, вы должны принять решение о протоколе сообщения, так же, как @DavidSchwartz указывает.

Некоторые полезные ссылки:

Protocol types

Understanding and designing socket message protocols

+0

может у, пожалуйста, скажите мне, как мне перейти на часть протокола сообщений – Tejas

+0

да это одна ошибка, но она не вызывает проблемы – Tejas

+0

Я добавил пару ссылок, которые охватывают основы. –

1

Основная проблема с вашим кодом является то, как вы обрабатывать строки в C.

Ваш сервер, кажется, предполагает, что вы отправляете Закодированные строки UTF-8 по сети, но строки в Java кодируются в UTF-16 по умолчанию. Вам также понадобится способ убедиться, что каждый буфер сообщений содержит только допустимые символы Unicode. Каждый символ в строке Unicode может использовать несколько байтов, и вы можете получить частичные отправленные символы на стороне сервера.

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