首页 文章

有没有更好的方法来执行服务器 - 客户端应用程序?

提问于
浏览
0

我正在使用c#中的tcp套接字创建一个应用服务器客户端 .

该应用程序有多个任务,如文件传输..文件管理器..聊天..(稍后语音聊天)

所以我决定创建一个套接字来接收作为字符串的命令和另一个传输文件的套接字 .
这是编程服务器 - 客户端应用程序的好方法,还是我应该尝试另一种方式?因为用户可以在接收/发送文件时发送消息

我怎么能告诉(文件传输服务器)只接受已经与主服务器连接的同一个客户端

例如:服务器侦听端口8000并接受客户端..并在端口8111上传输文件

public StartSever()
{
    sr = new StreamReader(networkStream);
while(connected)
{
        string[] command = sr.ReadLine().split(',');
        switch (Command[0])
        {
            case "RecFile":
                StartFileTransferServer();  // creating new socket tcp listens on port 8111
                Receiving();
                break;
            case "SendFile":
                StartFileTransferServer();  // creating new socket tcp listens on port 8111
                Sending();
                break;
            case "Chat":
                chat(Command[1]);
                break;
            default:
                break;
        }

}

3 回答

  • 0

    您可以使用某种通信框架或库来抽象TCP / IP套接字的细节,并允许您在客户端和服务器端之间发送对象,消息和文件,而不必担心所有细节 .

    你可以用一些东西代替:

    这些只是我想到的一些例子,有很多这样的框架可以在不同的抽象层次上工作,并提供更重或更轻的实现 . 我相信你能找到满足你基本需求的产品 .

  • 1

    该应用程序有多个任务,如文件传输..文件管理器..聊天..(稍后语音聊天)

    如果你没有比使用冒号分隔的字符串协议和 switch 语句更长的时间,我建议你停在那里 .

    我强烈建议你使用WCF与netTcpBinding和双工绑定:http://www.dotnetconsult.co.uk/weblog2/PermaLink,guid,b891610a-6b78-4b54-b9a6-4ec81c82b7c0.aspx

    使用VoiceChat不会成功 . 买一个组件 .

  • 1

    当您调用Accept时,您将收到新用户的套接字 . 在此之后,您可以创建NetworkStream . Write和Read是阻塞方法 . 您可以尝试使用异步方法:BeginRead和BeginWrite . 如果您有数千名用户,那么每个用户创建新线程也不好 . 我建议这样的解决方案:一个线程认为连接并将工作发送到线程池 .

    像这样的东西(注意这只是草稿):

    using System;
    using System.Net;
    using System.Net.Sockets;
    using System.Threading;
    
    namespace ConsoleServer
    {
    class Program
    {
        private static void Worker(Object sockObj)
        {
            var mySocket = (Socket) sockObj;
            using(var netStream = new NetworkStream(mySocket))
            {
                //Handle work;
            }            
        }
    
        static void Main(string[] args)
        {
            int port = 80;
            // create the socket
            Socket listenSocket = new Socket(AddressFamily.InterNetwork,
                                             SocketType.Stream,
                                             ProtocolType.Tcp);
    
            // bind the listening socket to the port
            IPAddress hostIP = (Dns.Resolve(IPAddress.Any.ToString())).AddressList[0];
            IPEndPoint ep = new IPEndPoint(hostIP, port);
            listenSocket.Bind(ep);
    
            // start listening
            listenSocket.Listen(125);
    
            while (true)
            {
                Socket mySocket = listenSocket.Accept();
                ThreadPool.QueueUserWorkItem(new WaitCallback(Worker), mySocket);
            }
        }
    }
    

    }

相关问题