TCP监听器与插座之间的区别(Difference between TCP Listener and

2019-06-28 03:52发布

据我知道我可以创建同时使用的TCPListener和插座的服务器,所以就是他们两个人之间的区别?

插座

private Socket MainSock;
MainSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
MainSock.Bind(new IPEndPoint(IPAddress.Any, port));
MainSock.Listen(500);
MainSock.BeginAccept(AcceptConnections, new Wrapper());

的TCPListener

    Int32 port = 13000;
    IPAddress localAddr = IPAddress.Parse("127.0.0.1");
    TcpListener server = new TcpListener(localAddr, port);
    server.Start();

我真的很困惑。 他们两个监听连接,所以它们之间有什么区别呢?

更新后的代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Net.Security;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
using System.IO;

public class Wrapper
{
    public byte[] buffer;
    public SslStream sslStream;
    public object connector;
}

public class Sock
{
    private Dictionary<string, byte> Connections;
    public event Action<Wrapper> AnnounceNewConnection;
    public event Action<Wrapper> AnnounceDisconnection;
    public event Action<byte[], Wrapper> AnnounceReceive;
    private Socket _sock;

    private X509Certificate certificate = X509Certificate.CreateFromCertFile("exportedcertificate.cer");

    public Sock(int port)
    {
        try
        {
            Connections = new Dictionary<string, byte>();
            _sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            _sock.Bind(new IPEndPoint(IPAddress.Any, port));
            _sock.Listen(500);
            _sock.BeginAccept(AcceptConnections, new Wrapper());
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
    }

    private void AcceptConnections(IAsyncResult result)
    {
        Wrapper wr = (Wrapper)result.AsyncState;
        try
        {
            wr.sslStream = new SslStream(new NetworkStream(_sock.EndAccept(result), true));
            wr.sslStream.BeginAuthenticateAsServer(certificate, AcceptAuthenticate, wr);

            _sock.BeginAccept(AcceptConnections, new Wrapper());
        }
        catch (Exception e) { Console.WriteLine(e); }
    }

    private void AcceptAuthenticate(IAsyncResult result)
    {
        Wrapper wr = (Wrapper)result.AsyncState;
        try
        {
            wr.sslStream.EndAuthenticateAsServer(result);
            if (wr.sslStream.IsAuthenticated == true)
            {
                AnnounceNewConnection.Invoke(wr);
            }
        }
        catch (Exception e) { Console.WriteLine(e); }
    }

    private void ReceiveData(IAsyncResult result)
    {
        Wrapper wr = (Wrapper)result.AsyncState;
        try
        {
            AnnounceReceive.Invoke(wr.buffer, wr);
        }
        catch (Exception e) { Console.WriteLine(e); AnnounceDisconnection.Invoke(wr); }
    }
}

Answer 1:

他们只是不同的类,做同样的事情,不同层次的写入。 引擎盖下的的TCPListener无疑要的东西很喜欢你的第一个基于Socket的代码。 这,只是那里从一些血淋淋的细节隐藏你。



Answer 2:

TcpListener是TCP通信的一个方便的包装。 这允许您使用TcpClient为接受的连接-虽然你可以接受的插座,而不是客户端使用Socket代替TcpClient 。 你可以做同样的事情Socket ; 但你必须处理一些TCP的细节(像SocketType.Stream, ProtocolType.Tcp )。 TCP是基于流的协议和TcpClient认识到,可以通过让你流的通信提供了一个流与TcpClient.GetStream() Socket是在更高的等级不同,需要支持像UDP许多不同的协议未基于流的。

TcpClient.GetStream返回NetworkStream对象,它是适合于SslStream ; 所以,它应该比使用工作要少得多Socket直接。 该用于SslStream文档使用细节TcpListenerTcpClient SSL通讯。



Answer 3:

甲的TcpListener包装一个插座,并且是在服务器侧模拟到TcpClient的 (也当然,包装了一个插座)。

所述的TcpListener被预配置有TCP(相对于所述的插座,其可以与UDP,纯IP,非IP协议等中使用)和处理连接时给你的TcpClient。

如果你不知道你是否需要一个插座,并且使用的是TCP - 我强烈建议使用的TcpListener /客户端开始,因为它是一个非常容易使用的界面。



Answer 4:

我真的不回答这个问题,但你似乎喜欢TcpClient更好,因为它具有GetStream()您可以与使用SslStream ,但你可以得到NetworkStream出的Socket通过将Socket的构造函数NetworkStream

NetworkStream myStream = new NetworkStream(mySocket);



文章来源: Difference between TCP Listener and Socket