c# – 为服务器应用程序使用3个端口是明智的吗?

我有一个服务器 – 客户端应用程序[TCP套接字,.NET 4.0] ..

应用程序有关:>执行从客户端接收的命令>接收文件>发送屏幕截图图像

应用程序应该同时执行3个任务

完成后,它工作..我意识到这些应用程序应该使用一个端口的所有任务..像Radmin和netsupport ..等

但我使用了3个端口..一个用于在客户端发送时随时接收命令.一个用于接收文件..如果客户端要求截屏,则为一个

那么为网络应用程序使用3个端口是否可以? ..

我试图在客户端创建3个套接字连接到同一端口上的服务器(例如:9090)
但是当我试图从客户端发送文件时…服务器收到了作业函数中的字节,它应该只接收命令…所以看起来我不能使用一个端口来执行这些任务所以可能使用一个他们可能同时工作的所有三个任务的端口?

    private void ClientAccept()
    {
        while (true)
        {
            Socket client = server.Accept();
            Console.WriteLine(client.RemoteEndPoint + " has connected");
            NetworkStream stream = new NetworkStream(client);
            StreamReader reader = new StreamReader(stream);
            string line = reader.ReadLine();
            if (line == "1")           //it means its a command socket
            {
                thJob = new Thread(Job);
                thJob.Start(cmdClient);
            }
            else if(line=="2")        //its a data socket
            {
                FileTransfer ft = new FileTransfer(client);
            }
         }
      }

    private void Job(object o)
    {
        Socket s = (Socket)o;
        StreamReader sr = new StreamReader(new NetworkStream(s));
        string cmd = null;
        while ((cmd = sr.ReadLine()) != null)
        {
            //bla bla
        }
    }

补充问题:
假设服务器有一个端口.
客户端连接到服务器以获取命令..让我们称之为cmdClient,其端口为11589,然后为此客户端启动了作业线程,就像代码一样.
然后客户端连接另一个套接字到服务器.. dataClient,其端口是1800然后当我使用dataClient发送文件..服务器接收作业方法的字节.. !!为什么会这样?

最佳答案 是的,在进行文件传输时使用多个端口是明智的.它需要一个非常高级的协议来使用相同的端口并仍然保持应用程序响应(因为您仍然必须能够在文件传输期间发送命令).

但我不建议您使用三个固定端口.对所有命令使用一个端口,对文件传输使用任意数量的端口.

文件传输看起来像这样:

>(CmdPort)客户端 – >服务器嘿我想传输大小为YYYY的文件XXX
>(CmdPort)服务器 – >客户端Roger,连接到端口8217并传输文件
>(8217)客户 – >服务器连接,传输整个文件,断开连接
>(8217)服务器检查传输的大小是否与步骤1中指定的大小匹配

这允许您同时传输多个文件.让服务器使用端口0创建一个新的侦听套接字.它告诉操作系统选择一个空闲端口.然后在步骤#2中将端口发回之前使用Socket.LocalEndpoint查找端口.

指定的方法还允许您利用Socket.SendFile,这可能是使用.NET发送文件的最有效和最快捷的方式.

(FTP使用相同的方法,bittorrent也是如此.从Web下载文件时,您可能使用了文件管理器.它们采用了更为极端的方法,并通过多个套接字分割文件下载以绕过Web服务器带宽限制.)

更新以回应评论:

my application also send folders , a folder may has 2000 files , many files size may equals to less than a kilo byte, it would be a huge mistake to connect for each file .. or maybe i should connect once for each task (a folder/ a file)

您没有在原始问题中指定该信息,这使我假设您一次只传输一个文件.

批量传输将以相同的方式工作,只需更改以便步骤#1发送文件名大小列表,然后在步骤#3中相互发送所有文件.

点赞