c# - 为服务器应用程序使用 3 个端口是否明智?

标签 c# sockets client-server port

我有一个服务器-客户端应用程序 [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 发送文件时.. 服务器接收工作方法中的字节.. !!为什么会这样?

  • 最佳答案

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

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

    文件传输看起来像这样:

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

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

    指定的方法还允许您利用 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 步中依次发送所有文件。

    关于c# - 为服务器应用程序使用 3 个端口是否明智?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9800642/

    相关文章:

    linux - 什么时候应该使用 TCP_NODELAY,什么时候应该使用 TCP_CORK?

    java - 跟踪拉取序列化对象的远程调用的进度

    c# - 从 Web 角色重新启动 Azure 辅助角色

    c# - 小数小时变成时间?

    sockets - JMeter TCP Sampler 无法识别流的结尾

    c++ - 如何不优雅地关闭连接?

    c# - TCP 或 UDP 在 c# 中帮助服务器/客户端?

    c# - 如何使用 .NET 为 Windows 应用程序实现通知

    c# - 在运行时更改 CSS 中的值(特别是 .Net)

    c# - 花时间并追加到日期来制作日期时间?