C# 从多个客户端到一台服务器的文件传输

C# 从多个客户端到一台服务器的文件传输,c#,client-server,tcpclient,file-transfer,C#,Client Server,Tcpclient,File Transfer,我不熟悉使用C#的windows socket编程,我想创建一个在多个客户端和一台服务器下运行的应用程序。服务器将等待来自客户端的传入连接,并为每个连接分配一个新端口。 服务器应接受来自多个客户端的文件传输。传输文件的大小约为10-20 MB 我读了很多教程和示例,但它们是以一对一的模式转换的。我能够将多个客户端连接到一台服务器,并通过它发送文本。服务器正在接受客户端连接及其发送的文本消息,但我不知道以相同的模式传输文件 如果有任何教程、示例或指南可以帮助我理解从多个客户机到单个服务器的文件传输

我不熟悉使用C#的windows socket编程,我想创建一个在多个客户端和一台服务器下运行的应用程序。服务器将等待来自客户端的传入连接,并为每个连接分配一个新端口。 服务器应接受来自多个客户端的文件传输。传输文件的大小约为10-20 MB

我读了很多教程和示例,但它们是以一对一的模式转换的。我能够将多个客户端连接到一台服务器,并通过它发送文本。服务器正在接受客户端连接及其发送的文本消息,但我不知道以相同的模式传输文件

如果有任何教程、示例或指南可以帮助我理解从多个客户机到单个服务器的文件传输,我会帮上大忙。

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

编辑日期18-6-2014 这里是我的网络类的C++例子,虽然不完美,但是你会明白的。 m#u 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;
}
DWORD WINAPI网络::服务器接受连接(LPVOID lpParam)
{
网络*pNetwork=(网络*)lpParam;
新插座;
字符*消息;
int c=sizeof(结构sockaddr_in);
德沃德·德韦特结果;
睡眠(100);
while(true)
{
new_socket=accept(pNetwork->m_s,(struct sockaddr*)&pNetwork->m_client,&c);
if(新的\u插槽!=无效的\u插槽)
{
dwWaitResult=WaitForSingleObject(
pNetwork->m_ClientListMutex,//处理互斥
无限);//没有超时间隔
if(dwWaitResult==等待对象0)
{
__试一试
{ 
//回复客户
if(pNetwork->m_clientList.size()m_maxConnections)
{
if(pNetwork->m_debugModus)printf(“调试方式:已接受连接\r\n”);
pNetwork->m\u clientList.向后推(新的\u套接字);
消息=网络\u类\u连接\u成功;
信息输出;
out.client=新的_套接字;
out.message=消息;
out.size=strlen(消息);
p网络->发送数据(输出);
}
其他的
{
如果(pNetwork->m_debugModus)printf(“DEBUG MODUS:已达到最大连接数\r\n”);
消息=网络\u类\u最大\u连接;
pNetwork->Send(新的_套接字、消息、strlen(消息));
闭合插座(新的_插座);
}
} 
__最后{
//释放互斥对象的所有权
如果(!ReleaseMutex(pNetwork->m_ClientListMutex))
{ 
如果(pNetwork->m_debugModus)printf(“DEBUG MODUS:AcceptConnections:Cant release the Mutex\r\n”);
} 
} 
}   
else if(dwWaitResult==WAIT_放弃)
{
如果(pNetwork->m_debugModus)printf(“DEBUG MODUS:SendDataThread:The thread获得了一个废弃互斥体的所有权\r\n”);
返回FALSE;
}
}
其他的
{
if(pNetwork->m_debugModus)printf(“DEBUG MODUS:accept失败,错误代码:%d\r\n”,WSAGetLastError());
}
}
返回TRUE;
}

-1:阵列应该有多大?那么,为什么要使用数组呢?这取决于应用程序,如果他知道只有10个客户端使用,而更多的客户端使用向量或类似的东西-1:但愿我能投两次反对票。NET具有
列表
类型和许多其他可扩展列表。使用数组没有什么价值。为什么要发明新的东西?实现一个FTP服务器,并让客户端连接到它。这方面有成千上万的例子,我不想双向转移。只有客户端可以传输文件,服务器使用db实现将文件按不同的结构进行排序。你们知道吗?你们完全控制了客户端和服务器,对吗。通过客户端上传的文件应该可以通过FTP完美地工作。。您可以禁用服务器中的下载。您有基于C#的FTP服务器和客户端的好例子或教程吗。我可以在谷歌上找到很多这样的网站,但我想听听你的建议。