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

时间:2012-01-20 04:37:23

标签: c# sockets tcp client

我正在使用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 :(得分:1)

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

您可以使用相反的一些事情:

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

答案 1 :(得分:1)

  

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

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

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

您自己的VoiceChat不会成功。为此购买一个组件。

答案 2 :(得分:0)

当您致电接受时,您会收到新用户的套接字。在此之后,您可以创建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);
        }
    }
}

}