将3个端口用于服务器应用程序是明智的吗?

时间:2012-03-21 07:59:45

标签: c# sockets client-server port

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

  • 执行从客户端收到的命令
  • 接收文件
  • 发送截图图像
    应用程序应该同时执行3个任务
    在我完成它并且它工作了..我意识到这些应用程序应该使用一个端口来完成所有任务..比如Radmin和netsupport ..等
    但我使用了3个端口..一个用于在客户端发送时随时接收命令。和一个用于接收文件..如果客户要求截屏

    ,则一个

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

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

        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发送文件..服务器接收作业方法的字节.. !!为什么会发生这种情况?

  • 2 个答案:

    答案 0 :(得分:2)

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

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

    文件传输如下所示:

    1. (CmdPort)客户 - >服务器嘿我想传输大小为YYYY
    2. 的文件XXX
    3. (CmdPort)服务器 - >客户端 Roger,连接到端口8217并传输文件
    4. (8217)客户 - >服务器连接,传输整个文件,断开连接
    5. (8217)服务器检查传输的尺寸是否与步骤1中指定的尺寸相匹配
    6. 允许您同时传输多个文件。让服务器使用端口0创建一个新的侦听套接字。它告诉操作系统选择一个空闲端口。然后使用Socket.LocalEndpoint找出端口,然后再将其发送回步骤#2。

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

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

      更新以回复评论:

        

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

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

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

    答案 1 :(得分:0)

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

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

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