当前位置: 首页 > 知识库问答 >
问题:

服务器套接字中的多次写入到客户端套接字程序中的单次读取?

家志学
2023-03-14

我已经看到了很多与我试图做的事情有关的问题,但我还没有找到任何解决方案。

我尝试编写两个套接字程序(一个客户端和一个服务器),以便服务器能够向客户端发送任何类型的文件(按字节)。我不确定如何构建/协调以下内容:

>

  • (在服务器中)读取语句从文件中获取数据(我使用fread())

    (在服务器中)将数据发送到客户端的write语句(我使用的是write())

    (在客户端)读取语句从服务器接收数据(我使用read())

    (在客户机中)将从服务器接收的数据写入文件的write语句(我使用的是fwrite())

    我想以字节块的形式传输数据。无论文件有多大,服务器中的一个fread()语句和一个write()语句是否足够?(或者这取决于缓冲区的大小?)在客户端,一次read()调用和一次fwrite()调用就足够了吗?(或者这取决于缓冲区的大小?)

    我对套接字编程还不熟悉。提前谢谢!我的服务器和客户端的以下部分:

    客户端:

    /*try to get file from server*/
    
      char receive_buffer[256];
        FILE * new_file;
    
        int bytes_received = 0;
    
        new_file = fopen("newfile.txt", "w");
    
        bytes_received = read(conn_s, receive_buffer, 256);
    
        printf("Received %d bytes\n", bytes_received);
    
        while( bytes_received > 0)
        {   
            bytes_received = read(conn_s, receive_buffer, 256);
            printf("Received %d bytes\n", bytes_received);
            fwrite(receive_buffer, 1, bytes_received, new_file);
            printf("writing bytes!\n");
            break;
        }
        if(bytes_received < 0)
        {
            printf("/nError reading bytes of data/n");
        }
    

    部分服务器代码:

    FILE * file_to_get = fopen("sample.txt", "rb");
        if(file_to_get == NULL)
        {
            printf("No such file!");
            exit(0);
        }
        while(1)
        {
            unsigned char buff[256];
            int num_read = fread(buff, 1, 256, file_to_get);
            printf("read %d bytes\n", num_read);
            if(num_read > 0)
            {
                write(conn_s, buff, num_read);
                printf("writing %d bytes\n", num_read);
            }    
    
            if(num_read < 256)
            {
                if(feof(file_to_get))
                    printf("End of file\n");
                if(ferror(file_to_get))
                    printf("Error reading bytes\n");
                break;
            }    
        }
    
  • 共有1个答案

    文寒
    2023-03-14

    当发送到网络时,您可以使用一个单独的调用来写()。如果内核中没有足够的缓冲空间来处理整个事情,写()将阻塞,直到它能够处理所有的事情。你也可以把它写成块,这也很好。这真的不重要。

    从网络读取数据时,必须在循环中调用read()。调用read()时指定的缓冲区大小只是允许返回的最大值,它不会等待收到那么多。因此,它可以(而且经常)得到比这更少的回报。只需继续调用read(),直到它返回0以指示EOF,并将每个缓冲区写入文件。

     类似资料:
    • 我使用一个具有双向通信的套接字设置了一个客户端-服务器模型。 应该是这样的:1。客户端-发送单词数组2。服务器-读取单词数组3。服务器-发送布尔值4。客户端-读取布尔值5。客户端-发送图像6。服务器读取图像 这个过程在一个循环中,与第一次迭代完美配合,但在第二次迭代中,我得到了以下错误: JAVA网SocketException:软件导致的连接中止:套接字写入错误 我认为发生的是,当服务器返回到读

    • 我试图用java实现一个客户端服务器,在这里我读取客户端中的输入并在服务器中执行UperCase,然后返回客户端并打印UperCase。我使用ObjectOutputStream和ObjectInputStream进行读写,但是当我在客户机中键入一个msg时,程序会显示以下错误: Digite uma msg casa java.io.eofexception位于java.io.datainput

    • 我有两个通过字符串与套接字通信的Java项目。一个是客户端,另一个是服务器。服务器通过“ServerSocket”接受连接,并使用新创建的“套接字”创建新的“会话”(线程)。 同时,客户端只有一个“套接字”,一旦连接了这个套接字,客户端就会创建一个“ClientSession”(线程,非常类似于“session”)。 我想要的是服务器通过“username”字符串询问客户机他的用户名,客户机用他的

    • 我是 python 和套接字的新手,正在尝试编写一个回显客户端/服务器套接字。我已经编写了服务器,以便丢失 30% 的数据包。我将客户端编程为在一秒后超时,因为数据包可能会丢失。但是,每当我运行客户端套接字时,我的输出都是 100% 请求超时。我假设我得到这个输出,因为我的服务器从未收到过消息。我已经多次查看了我的代码,但无法弄清楚为什么我不断获得此输出。下面是我的服务器和客户端套接字的代码。任何

    • Java: 在C#中-它停止在“receiver=listener.accept();”在java(android)中-它停止于“sender_socket=new Socket(serverAddr,SERVERPORT);”这应该是java套接字函数的问题--需要另一个函数连接到C#-server。

    • 首先我要感谢你花时间... 我在macbook中用C++创建了一个服务器套接字,在运行windows XP的不同机器中用Java创建了一个客户机/套接字。我已将端口指定为5000,但无法指定正确的主机,因此无法进行连接。当我在windows xp中使用WinSock2创建一个C++服务器/套接字时,当我使用本地主机时,连接是完美的...有什么想法吗??? 提前Thnx int main(int a