gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:33:10 26 4
gpt4 key购买 nike

我有一个服务器-客户端应用程序 [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/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com