Сокет с c сервером поверх java сокета - PullRequest
0 голосов
/ 08 марта 2020

Мое назначение требует от меня написать сервер в c, а клиент в java. Мне нужно отправить целое число моему клиенту в качестве инструкций. Они могут подключаться гладко, но мой клиент java не может получить целочисленную отправку с сервера c. есть только две возможности: мой c сервер не отправил номер или мой клиент не получил целое число правильно. c сервер способен l oop при наборе, поскольку printf и scanf выполняются, а на стороне клиента ничего не происходит.

Я застрял здесь, любая помощь будет признательна!

=================================================== =========================== ОБНОВЛЕНИЕ: я исправляю основной класс в java, где имя класса клиента в dotClient, и мой Клиент смог подключиться и прочитать входные данные с сервера. Я пытаюсь отправить 'int' непосредственно на стороне сервера, но когда клиент (java) использует DataInputStream.ReadInt (), он возвращает случайное большое число, как если бы размер int в c и размер int в java не совпадает. Когда я использую c клиент для той же работы, он работает нормально. Так что есть скрытая проблема для использования dataInputStream напрямую с сервером c, так как я также пробовал readShort () и ReadLong ().

Как и предполагалось, я использую bufferReader. И отправьте строку на стороне сервера, и просмотрите ее в int в клиенте. это работает.

вот мой обновленный c код

#define PORT 55555 

int main(int argc, char const *argv[]) 

{ 
int server_fd, new_socket, valread; 
struct sockaddr_in address; 
int opt = 1; 
int addrlen = sizeof(address); 

char buffer[1024]; 
int returnSend = 0;

// Creating socket file descriptor 
if (
    (server_fd = socket(AF_INET, SOCK_STREAM, 0))
     == 0) 
{ 
    perror("socket failed"); 
    exit(EXIT_FAILURE); 
} 
printf("%s\n", "Socket created!");

// Forcefully attaching socket to the port 8080 
if (setsockopt(server_fd, SOL_SOCKET,
    SO_REUSEPORT, &opt, sizeof(opt))) 
{ 
    perror("setsockopt"); 
    exit(EXIT_FAILURE); 
} 
printf("Socket attached!\n");

address.sin_family = AF_INET; 
address.sin_addr.s_addr = INADDR_ANY; 
address.sin_port = htons( PORT ); 

// Forcefully attaching socket to the port 8080 
if (bind(server_fd, 
    (struct sockaddr *)&address,  
     sizeof(address))<0) 
{ 
    perror("bind failed"); 
    exit(EXIT_FAILURE); 
} 
printf("socket binded!\n");

if (listen(server_fd, 3) < 0) 
{ 
    perror("listen"); 
    exit(EXIT_FAILURE); 
} 
printf("socket listened!\n");

if ((new_socket = accept(server_fd,
    (struct sockaddr *)&address,  
    (socklen_t*)&addrlen))<0) 
{ 
    perror("accept"); 
    exit(EXIT_FAILURE); 
}// Socket formulated !

do{
    fgets(buffer, sizeof(buffer), stdin); 
    returnSend = write(new_socket , buffer , strlen(buffer));
    printf("Sending: %sReturn returnSend: %d.\n", buffer,returnSend); 

} while (1);
return 0; 

} 

вот мой обновленный java клиент

import java.net.*; 
import java.io.*; 

public class dotClient 
{ 
    // initialize socket and input output streams

        private Socket echoSocket= null;
        private BufferedReader input = null;

// constructor to put ip address and port 
    public dotClient(String address, int port) 
    { 
    // establish a connection 
    try
    { 
            echoSocket = new Socket(address, port); 
            System.out.println("Connected");

         input =
        new BufferedReader(
        new InputStreamReader(echoSocket.getInputStream()));

    } 
    catch(UnknownHostException u) 
    { 
        System.out.println("exception 1: "+u); 
    } 
    catch(IOException i) 
    { 
        System.out.println("exception 2: "+i); 
    } 

    int number = 0;
    String line = "";
    // keep reading until read neagaive integer

    try
    {   
        while ((line = input.readLine()) != null) 
        {
        number = Integer.parseInt(line);
        System.out.println("String is :"+line);
        System.out.println("number is :"+number);

        } 
    }
    catch(IOException i)
    { 
        System.out.println("Exception 3: "+i); 
    } 

    // close the connection 
    try
    { 
        input.close(); 
        out.close(); 
        echoSocket.close(); 
        System.out.println("Connection closed!");
    } 
    catch(IOException i) 
    { 
        System.out.println("Exception 4: "+i); 
    } 
} 

public static void main(String args[]) 
{ 
    dotClient client = new dotClient("192.168.0.3", 55555); 
} 
} 

1 Ответ

0 голосов
/ 08 марта 2020

В вашем методе main вы создаете экземпляр Client, но ваш класс называется dotClient. Возможно, вы захотите убедиться, что вы создаете экземпляр своего класса dotClient. В противном случае я согласен с предыдущими комментариями и предложил бы BufferedReader и BufferedWriter / PrintWriter для ввода-вывода.

Есть ли у ваших блоков try какие-либо исключения на клиенте? Проверьте возвращаемое значение send(new_socket , &number , size(number) , 0 ); на сервере, чтобы убедиться, что данные действительно были отправлены для получения дополнительной информации. http://man7.org/linux/man-pages/man2/send.2.html.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...