TCP-сервер в клиенте C в Java-коммуникации - PullRequest
1 голос
/ 10 января 2012

У меня есть сервер в c и клиент в java, но это не работает.1. запустить сервер, сервер ждать клиентов2. запустить клиент - клиент отправляет строку3. сервер получает первый символ, увеличивает его и отправляет клиенту // я ожидаю этого, носервер получает неправильный символ4.client получить символ и записать его на экране // ожидать этого, но клиент потерпит неудачу с этимисключение:

Exception in thread "main" java.net.SocketException: Connection reset
        at java.net.SocketInputStream.read(SocketInputStream.java:168)
        at java.io.ObjectInputStream$PeekInputStream.read(ObjectInputStream.java:2266)
        at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2279)
        at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2750)
        at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:780)
        at java.io.ObjectInputStream.<init>(ObjectInputStream.java:280)
        at clientTCP.main(clientTCP.java:19)

5) клиент должен завершиться, а сервер продолжит работу //, но клиент отключился после предыдущего исключения

Кто-нибудь знает, где может быть проблема?сервер, клиент использует протокол TCP.

сервер:

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <netinet/in.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>

int main()
{
    int server_sockfd, client_sockfd;
    int server_len, client_len;
    struct sockaddr_in server_address;
    struct sockaddr_in client_address;


    server_sockfd = socket( AF_INET, SOCK_STREAM, 0 );
    server_address.sin_family = AF_INET;
    server_address.sin_addr.s_addr = inet_addr( "127.0.0.1" );
    server_address.sin_port = htons( 10000 );

    server_len = sizeof( server_address );

        if( bind( server_sockfd, ( struct sockaddr *)&server_address, server_len ) != 0 )
        {
                perror("oops: server-tcp-single");
                exit( 1 );
        }

    listen( server_sockfd, 5 );

    signal( SIGCHLD, SIG_IGN );

    while( 1 )
    {
        char ch;
        printf( "server wait...\n" );

        client_len = sizeof( client_address );
        client_sockfd = accept( server_sockfd, ( struct sockaddr *)&client_address, &client_len );

        printf( "Client connected \n" );

        if( fork() == 0 )
        {
            read( client_sockfd, &ch, 1 );
            printf( "Client send = %c\n", ch );

            ch++;

            sleep( 5 );

            printf( "Server send = %c\n", ch );
            write( client_sockfd, &ch, 1 );
            close( client_sockfd );
            exit (0 );
        }
        else
            close( client_sockfd );

    }
}

клиент в Java:

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

class clientTCP
{
 public static void main(String argv[]) throws Exception
 {
  String sentence;
  String modifiedSentence;
  Socket socket = new Socket("127.0.0.1", 10000);
  InetAddress adresa = socket.getInetAddress(); //address
  System.out.print("Connecting on : "+adresa.getHostAddress()+" with hostname : "+adresa.getHostName()+"\n" );


  ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
                                oos.writeObject("HalloXXXX");


                                ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
                                String message = (String) ois.readObject();
                                System.out.println("Message Received: " + message);
                                ois.close();
                                oos.close();
                                socket.close();
 }
} 

Ответы [ 2 ]

3 голосов
/ 10 января 2012

Вы можете использовать ObjectOutputStream только с другими программами Java, которые также используют ObjectInputStream для его чтения.Трудно представить программу на C, поддерживающую формат сериализации Java.

Если вы хотите написать текст, я предлагаю вам использовать PrintWriter / BufferedReader, или лучшим решением является использование BufferedOutputStream и выполнение собственной кодировки (чтобы вы могли видетьошибки.

0 голосов
/ 10 января 2012

И вы должны использовать oos.flush () после метода writeObject ().

...