Rom*_*key 30 sockets client tcp tcplistener serversocket
据我所知,我可以使用TCPListener和Socket创建一个服务器,那么它们之间的区别是什么?
插座
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());
Run Code Online (Sandbox Code Playgroud)
的TCPListener
Int32 port = 13000;
IPAddress localAddr = IPAddress.Parse("127.0.0.1");
TcpListener server = new TcpListener(localAddr, port);
server.Start();
Run Code Online (Sandbox Code Playgroud)
我真的很困惑.他们俩听取了联系,那么它们之间的区别是什么?
更新的代码
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); }
}
}
Run Code Online (Sandbox Code Playgroud)
Pet*_*hie 34
TcpListener是TCP通信的便捷包装器.这允许您使用TcpClient已接受的连接 - 尽管您可以使用套接字而不是客户端来Socket代替TcpClient.你可以做同样的事情Socket; 但你必须处理一些TCP特定的(如SocketType.Stream, ProtocolType.Tcp).TCP是一种基于流的协议,TcpClient通过提供流来实现流通信,从而识别出来TcpClient.GetStream(). Socket处于更高的不同级别,需要支持许多不同的协议,如非基于流的UDP.
TcpClient.GetStream返回一个NetworkStream适合的对象SslStream; 所以,它应该比Socket直接使用要少得多.SslStream的文档详细说明了使用TcpListener和TcpClient进行SSL通信.
use*_*421 19
他们只是不同的类,做同样的事情,写在不同的层面.在引擎盖下,TCPListener毫无疑问地调用了一些非常类似于你的第一个基于Socket的代码.它只是为了让你隐藏一些血腥的细节.
Mar*_*ett 16
甲的TcpListener包装一个插座,并且是在服务器侧模拟到TcpClient的(也当然,包装了一个插座).
TcpListener预先配置了TCP(与Socket相对,可以与UDP,纯IP,非IP协议等一起使用)并在处理连接时为您提供TcpClient.
如果您不确定是否需要Socket,并且正在使用TCP - 我强烈建议从TcpListener/Client开始,因为它是一个更容易使用的界面.