Java-клиент, сервер c, проблема с файлами переноса - PullRequest
0 голосов
/ 11 декабря 2018

Я хочу сделать простое клиент-серверное приложение, где сервер отправляет клиенту файл (фото).Я использую сервер в C и клиент в Java.

server.c

  #include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <pthread.h>


struct sockaddr_in c_addr;
char fname[100];

void* SendFileToClient(int *arg )
{
    int connfd=(int)*arg;
    printf("Connection accepted and id: %d\n",connfd);
    printf("Connected to Clent: %s:%d\n",inet_ntoa(c_addr.sin_addr),ntohs(c_addr.sin_port));
    write(connfd, fname,256);

    FILE *fp = fopen(fname,"rb.jpg");
    if(fp==NULL)
    {
        printf("File opern error");
        return 1;
    }

    /* Read data from file and send it */
    while(1)
    {
        /* First read file in chunks of 256 bytes */
        unsigned char buff[1024]={0};
        int nread = fread(buff,1,1024,fp);
        //printf("Bytes read %d \n", nread);

        if(nread > 0)
        {
            write(connfd, buff, nread);
        }
        if (nread < 1024)
        {
            if (feof(fp))
            {
                printf("End of file\n");
                printf("File transfer completed for id: %d\n",connfd);
            }
            if (ferror(fp))
                printf("Error reading\n");
            break;
        }
    }
    printf("Closing Connection for id: %d\n",connfd);
    close(connfd);
    shutdown(connfd,SHUT_WR);
    sleep(2);
}

int main(int argc, char *argv[])
{
    int connfd = 0,err;
    pthread_t tid;
    struct sockaddr_in serv_addr;
    int listenfd = 0,ret;
    char sendBuff[1025];
    int numrv;
    size_t clen=0;

    listenfd = socket(AF_INET, SOCK_STREAM, 0);
    if(listenfd<0)
    {
        printf("Error in socket creation\n");
        exit(2);
    }

    printf("Socket retrieve success\n");

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

    ret=bind(listenfd, (struct sockaddr*)&serv_addr,sizeof(serv_addr));
    if(ret<0)
    {
        printf("Error in bind\n");
        exit(2);
    }

    if(listen(listenfd, 10) == -1)
    {
        printf("Failed to listen\n");
        return -1;
    }

    strcpy(fname,"150.254.79.154");

    while(1)
    {
        clen=sizeof(c_addr);
        printf("Waiting...\n");
        connfd = accept(listenfd, (struct sockaddr*)&c_addr,&clen);
        if(connfd<0)
        {
            printf("Error in accept\n");
            continue;
        }
        err = pthread_create(&tid, NULL, &SendFileToClient, &connfd);
        if (err != 0)
            printf("\ncan't create thread :[%s]", strerror(err));
    }
    close(connfd);
    return 0;
}

client

    import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.ByteBuffer;

public class client2 {

    public static void main(String[] args) throws Exception {
        Socket socket = new Socket("150.254.79.87", 8887);
        InputStream inputStream = socket.getInputStream();



        byte[] sizeAr = new byte[4];
        inputStream.read(sizeAr);
        int size = ByteBuffer.wrap(sizeAr).asIntBuffer().get();

        byte[] imageAr = new byte[size];
        inputStream.read(imageAr);

        BufferedImage image = ImageIO.read(socket.getInputStream());
        ImageIO.write(image, "jpg", new File(""));

       socket.close();
    }

}

Проблема заключается в том, что клиент зависает по адресу:

BufferedImage image = ImageIO.read(socket.getInputStream());

Я проверил в debug, client, image = null.

Я пробую другой метод:

 Socket socket = new Socket("150.254.79.154", 8887);
    byte[] contents = new byte[10000];


    FileOutputStream fos = new FileOutputStream("(filepath)");
    BufferedOutputStream bos = new BufferedOutputStream(fos);
    InputStream is = socket.getInputStream();
    BufferedImage image = ImageIO.read(is);
    ImageIO.write(image, "jpg", fos);

И я получил:

Exception in thread "main" java.lang.IllegalArgumentException: image == null!
at javax.imageio.ImageTypeSpecifier.createFromRenderedImage(ImageTypeSpecifier.java:925)
at javax.imageio.ImageIO.getWriter(ImageIO.java:1592)
at javax.imageio.ImageIO.write(ImageIO.java:1578)
at client2.main(client2.java:38)

Iпроверил это в C-клиенте - все было нормально, сервер работает.Теперь я хочу присоединиться к серверу на Java, но, как вы видите, у меня есть проблема.: /

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