java - 在java中通过套接字发送大数据

标签 java c sockets networking

我正在研究客户端服务器架构,我只是这方面的初学者。这里我的服务器是 C 的,客户端是 Java 的,我想从 C 服务器向 Java 客户端发送一个大小约为 10-20 MB 的二进制/数据库 (.db)/图像文件。但是在执行以下代码时数据丢失了:

服务器端 C 代码是:

int sockfd, newsockfd, portno, clilen;   

struct sockaddr_in serv_addr, client_addr;

sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd < 0)
{
    strcpy(message,"Error opening socket");
    eFlag = 1;
    send_message(message);
}

bzero((char *)&serv_addr, sizeof(serv_addr));
portno = 6789;
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)
{
    strcpy(message,"Error on binding");
    eFlag = 1;
    send_message(message);
}

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

if(newsockfd < 0)
{
    strcpy(message,"Error on accept");
    eFlag = 1;
    send_message();
    exit(4);
}

void send_file()
{
    buffer = (char *)malloc(sizeof(char)*lSize);

    result = fread(buffer, sizeof(char), lSize, fp);
    printf("\n\n########## data read into buffer successfully #######");


    if(newsockfd)
    {
        n = send(newsockfd, buffer, lSize);
        printf("\n\n$$$$$$$$ Data sent successfully $$$$$");
        strcpy(message,"Data sent successfully");
        send_message(message);
    }


    else
    {
        strcpy(message, "Error writing on socket");
        send_message(message);
    }

    sleep(sleepTime);
    sleepTime = (int) (sleepTime*1.02);

    free(buffer);
}

而且,我的客户端 Java 代码是:

                    final int PORT_NO = 6789;
        final String Server_name = "192.133.133.1";
        Socket m_socket = null;
        String str;
        int ch;

    try {
        if(m_socket == null)
            m_socket = new Socket(Server_name, PORT_NO);
        if(m_socket == null)
            System.out.println("Unable to open the socket");


    DataInputStream dis = new DataInputStream(m_socket.getInputStream());
    PrintStream ps = new PrintStream(m_socket.getOutputStream());

    DataInputStream ds = new DataInputStream(System.in);

    while(true)
    {
        System.out.println("1. Synchronize");
        System.out.println("2. Exit");
        System.out.println("Enter your choice...");
        str = ds.readLine();
        ch = Integer.parseInt(str);

        switch(ch)
        {
        case 1:
     ps.println("<message action='buttonpress' value='synchronize' />");
     System.out.println("avilable data to read is:"+dis.available());
     FileOutputStream fos = new FileOutputStream("mukul.db");



            byte data[] = new byte[102400]; //100 Kb byte array

                            dis.read(data);


            String str_data = new String(data);
            str_data = str_data.trim();
            data = str_data.getBytes();

            fos.write(data);
            fos.close();

            break;

这里只读取了部分数据,即大约 10 kb 或更少。

本人刚接触此类帖子,代码可能比较繁琐,如有错误请忽略。

所以请告诉我如何在这种客户端-服务器架构中接收 1 MB/10 MB 的数据而不丢失数据。

如果我在 C 代码中使用“sendfile(out_fp, in_fp, pos, len)”方法而不是“send()”会怎么样?此方法发送文件句柄。那么Java中捕获文件句柄的相应函数是什么。

提前谢谢你。

最佳答案

您滥用了 send()/recv() 函数。由于内核中可能存在限制,send() 和 recv() 不需要发送您请求的数据。您必须一遍又一遍地调用 send() 直到所有数据都被推送。

例如:

int sent = 0;
int rc;
while ( sent < should_send )
{
   rc = send(sock, buffer + sent, should_send - sent, 0);
   if ( rc <= 0 ) // Error or hangup
      // do some error handling;

   sent += rc;
}

关于java - 在java中通过套接字发送大数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3183155/

相关文章:

java - 将第一个单词移到句子的末尾?

java - 根据当前经过身份验证的用户的角色返回不同的 JSON 对象

c - 指针指向的 int 的增量值

c++ - Ncurses/C/C++ : Using getstr() and preventing overflow (There must be a better way to do this)

java - 如何理解java Socket-Permissions?

c++ - 对于具有单个接受器的线程化 boost::asio 服务器,我们是否需要每个线程多个 io_service

java - 在 Jython 中解析大型 XML 文档的最佳方法

java - “非静态变量不能...”错误

c - 为什么这个 C 结构体代码可以工作?

linux - Qt 5.6 使用 QLocalServer 和 QLocalSocket 传递文件描述符