【问题标题】:File transfer from multiple clients - one server从多个客户端传输文件 - 一台服务器
【发布时间】:2014-08-08 03:35:07
【问题描述】:

我是使用 C# 进行 Windows 套接字编程的新手,我想创建一个在一台服务器上运行在多个客户端下的应用程序。服务器将等待来自客户端的传入连接,并为每个连接分配一个新端口。 服务器应该接受来自多个客户端的文件传输。传输的文件大约为 10-20 MB。

我浏览了许多教程和示例,但它们确实以一对一的模式转移。我能够将多个客户端连接到一台服务器并通过它发送文本。服务器正在接受客户端连接及其发送的短信,但我不知道以相同的模式传输文件。

如果有任何教程、示例或指南可以帮助我了解从多个客户端到单个服务器的文件传输,我将非常有帮助。

【问题讨论】:

  • 为什么要发明新东西?实现一个 FTP 服务器,并让客户端连接到它。这样的例子有数千个。
  • 我不想要双向传输。只有客户端可以传输文件,并且文件将由具有 db 实现的服务器以不同的结构排序。对此有任何想法吗?
  • 您可以完全控制客户端和服务器,对。通过客户端上传文件应该可以通过 FTP 完美运行。而且,您可以禁用服务器中的下载。
  • 你有什么好的基于C#的FTP服务器和客户端的例子或教程吗?我可以在谷歌找到很多这样的,但我想得到你的建议。

标签: c# client-server tcpclient file-transfer


【解决方案1】:

其实很简单 将传入连接保存在数组中。 启动一个新线程,从套接字获取数据并将其放入输出缓冲区(确保其线程安全),就是这样

编辑 18-6-2014 这是我的网络类中的一个 c++ 示例,它并不完美,但你会明白的 m_clientList 是一个向量,我保存了连接,但我不知道 c# 是否有向量,但类似 ​​list 的东西可以工作

DWORD WINAPI Network::ServerAcceptConnections(LPVOID lpParam)
{
    Network* pNetwork = (Network*) lpParam;
    SOCKET new_socket;
    char *message;
    int c = sizeof(struct sockaddr_in);

    DWORD dwWaitResult;
    Sleep(100);
    while (true)
    {
        new_socket = accept(pNetwork->m_s , (struct sockaddr *)&pNetwork->m_client, &c);

        if (new_socket != INVALID_SOCKET )
        {
            dwWaitResult = WaitForSingleObject( 
            pNetwork->m_ClientListMutex,    // handle to mutex
            INFINITE);  // no time-out interval
            if (dwWaitResult == WAIT_OBJECT_0)
            {
                __try 
                { 
                    //Reply to the client
                    if (pNetwork->m_clientList.size() < pNetwork->m_maxConnections)
                    {
                        if(pNetwork->m_debugModus) printf("DEBUG MODUS: Connection accepted\r\n");
                        pNetwork->m_clientList.push_back(new_socket);
                        message = NETWORK_CLASS_CONNECTION_SUCCES;
                        Message out;
                        out.client = new_socket;
                        out.message = message;
                        out.size = strlen(message);
                        pNetwork->SendData(out);
                    }
                    else
                    {
                        if(pNetwork->m_debugModus) printf("DEBUG MODUS: Max connections reached\r\n");
                        message = NETWORK_CLASS_MAX_CONNECTIONS;

                        pNetwork->Send(new_socket, message, strlen(message));
                        closesocket(new_socket);
                    }
                } 

                __finally { 
                    // Release ownership of the mutex object
                    if (! ReleaseMutex(pNetwork->m_ClientListMutex)) 
                    { 
                        if(pNetwork->m_debugModus) printf("DEBUG MODUS: AcceptConnections: Cant Relese the Mutex\r\n");
                    } 
                } 
            }   
            else if (dwWaitResult == WAIT_ABANDONED)
            {
                if(pNetwork->m_debugModus) printf("DEBUG MODUS: SendDataThread: The thread got ownership of an abandoned mutex\r\n");
                return FALSE; 
            }
        }
        else
        {
            if(pNetwork->m_debugModus) printf("DEBUG MODUS: accept failed with error code : %d\r\n" , WSAGetLastError());
        }
    }
    return TRUE;
}

【讨论】:

  • -1: 数组应该有多大?那么,为什么要使用数组呢?
  • 取决于应用程序,如果他知道只有 10 个客户端使用,还有更多使用向量或类似的东西
  • -1:希望我能投反对票两次。 .NET 具有List&lt;T&gt; 类型和许多其他可扩展列表。使用数组没有什么价值。
猜你喜欢
  • 1970-01-01
  • 2016-05-16
  • 1970-01-01
  • 2016-12-27
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多