有没有更好的方法来完成服务器客户端应用程序

本文关键字:服务器 客户端 应用程序 更好 方法 有没有 | 更新日期: 2023-09-27 18:20:47

我正在使用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;
        }
}

有没有更好的方法来完成服务器客户端应用程序

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

一些你可以考虑使用的东西:

  • WCF
  • ZeroMQ
  • RabbitMQ

这些只是我脑海中想到的一些例子——有很多这样的框架在不同的抽象级别上工作,并提供更重或更轻的实现。我相信你能找到一个满足你基本需求的。

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

如果您只需要使用冒号分隔的字符串协议和switch语句,我建议您到此为止。

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

单独使用VoiceChat是不会成功的。为此购买一个组件。

当您调用Accept时,您将收到新用户的套接字。之后,您可以创建NetworkStream。写入和读取是阻塞方法。您可以尝试使用异步方法:BeginRead和BeginWrite。此外,如果你有数千个用户,那么为每个用户创建新线程是不好的。我提出这样的解决方案:一个线程Acpects连接并将工作发送到线程池。

类似的东西(注意这只是草案):

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);
        }
    }
}

}