【问题标题】:is it wise to use 3 ports for a server application?为服务器应用程序使用 3 个端口是否明智?
【发布时间】:2012-04-05 17:41:22
【问题描述】:

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

  • 【问题讨论】:

    • 服务端只监听单个端口,客户端却开启多个TCP连接?
    • @CodeInChaos 是啊!那应该怎么做呢?
    • 您的问题标题听起来像是您在服务器上的三个不同端口上监听,这很奇怪。但只有几个连接并不罕见。
    • 可以使用支持多路复用的协议,但这会增加相当大的复杂性。
    • 我认为你是对的 .. 我会继续使用我的代码

    标签: c# sockets client-server port


    【解决方案1】:

    使用 3 个端口不是最佳实践,除非每个操作都是它自己的应用程序,即文件服务器、图像服务器等。您应该创建一个侦听 1 个端口的应用程序,然后使用线程接受多个连接到服务器(每个都有自己的 StreamReader 实例)。然后,您可以为用户输入编写解析器方法。例如,如果用户发送命令“RECIEVE FILE”,服务器将期望一个文件,如果用户发送命令“IMAGE”,服务器将期望一个图像。

    可以在此处找到多线程服务器的示例:

    http://csharp.net-informations.com/communications/csharp-multi-threaded-server-socket.htm

    【讨论】:

    • 这正是我在我的应用程序中所做的......但我需要它在它期望文件的同时继续接收命令......就像在我浏览文件时接收文件一样
    • 是的。你看过我发给你的那个教程吗?您可以对其进行修改以实现此目的。 clientSocket = serverSocket.AcceptTcpClient(); // 接受新的连接 handleClinet client = new handleClinet(); // 拥有自己的网络流的客户端。然后,您可以使用客户端对象 Network Stream 并处理每个命令。
    • 我看过教程 ..handleClinet 与我的 Job 方法相同 .. 并且您看到每个接受的 Socket .. 它传递给一个新的工作线程。跨度>
    【解决方案2】:

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

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

    文件传输如下所示:

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

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

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

    (FTP 使用与 bittorrent 相同的方法。您可能在从 Web 下载文件时使用了文件管理器。他们采用更极端的方法并将文件下载拆分到多个套接字上以绕过 Web服务器带宽限制。)

    根据评论更新:

    我的应用程序也发送文件夹,一个文件夹可能有 2000 个文件,许多文件大小可能小于一千字节,连接每个文件将是一个巨大的错误.. 或者我应该为每个任务连接一次(一个文件夹/一个文件)

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

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

    【讨论】:

    • 这很酷..正如我所料..但在我的代码中,当连接 cmdPort 时,我让 dataServer 活动以接受客户端..我的意思是我在收到文件后不关闭它..它在 cmdPort 断开连接时关闭。我已经做了一个发送大文件(> 3 GB)的文件传输类。它很棒,但告诉更多为什么 Socket.SendFile 是最快的?关于它使用的数据包大小?
    • 这就是我要说的。您不应保持数据传输连接打开。数据传输连接应Connect, send, disconnect。为什么要保持连接打开? Socket.SendFile 是最快的,因为 .NET 内部可以比您在更高层(作为 .NET 用户)更有效地解决传输问题
    • 我在使用自己的代码发送文件之前阅读过它......但我无法获得发送的数据量和这些选项来显示进度(progressBar、timeleft、Speed ..等)
    • 没错,使用SendFile时不能使用进度条等。
    • 我的应用程序也发送文件夹,一个文件夹可能有 2000 个文件,许多文件的大小可能小于一千字节,连接每个文件将是一个巨大的错误.. 或者我应该每个任务连接一次(一个文件夹/一个文件)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 2020-09-24
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    相关资源
    最近更新 更多