Socket和TcpClient/TcpListener

抽象层级不同

Socket:
Socket是较低级别的网络编程API,提供了对底层TCP/IP协议栈的直接访问。通过Socket,需要手动管理连接、数据传输、发送和接收缓冲区等细节。意味着拥有更多控制权,但也需要更多代码来处理这些细节

TcpClient/TcpListener:
这两个类是较高级的封装,封装了许多底层细节。TcpClient提供了连接、读取和写入数据的简化工作;TcpListener提供了简化的监听接口。

连接和监听方式

Socket
直接调用Connect连接,手动处理接收和发送数据。
服务端创建一个Socket,然后调用Bind和Listen来启动监听,再用Accept等方法接收客户端连接。
代码是,Socket提供了更多的灵活性,允许你控制连接的各个方面(例如选择同步或异步I/O)。

TcpClient/TcpListener:
TcpClient是封装好的客户端类,简化了连接流程,只需调用Connect即可与服务器连接。
TcpListener是封装好的服务器类,提供了Start和AcceptTcpClient等方法来监听和接收客户端连接。
这些类使用更加简洁易用,但功能相对受限,缺少对底层的直接控制

功能和灵活性

Socket:
更低级:提供更多控制,可以自定义协议和数据格式、选择不同的协议族(例如IPv6)和套接字类型(例如广播、原始套接字)。
可以手动设置更多的选项,例如SocketOption,调整超时、缓冲区大小等。
支持同步和异步编程,但需要自己管理事件和线程等

TcpClient/TcpListener:
较高层次:对大多数常见TCP通信任务进行了封装,适用于大多数应用程序。
代码简单,适合快速开发和原型设计,但灵活性较差。
TcpClient默认使用同步操作,并且不提供手动配置底层Socket的能力。
TcpListener主要用于接收客户端连接,处理简单的客户端-服务器模型,适合典型的请求-响应场景。

使用场景

Socket:
适用于需要高度自定义的网络应用,例如实现自定义协议、数据加密、广播、UDP多播、或者其他非常规的 TCP/IP 操作。
如果需要对网络通信的每个细节进行控制(例如,非阻塞 I/O、并发处理等),Socket 是更好的选择。

TcpClientTcpListener
适用于大多数典型的客户端-服务器通信场景,尤其是对底层实现没有特殊要求的场合。
如果需求比较简单,只需要建立标准的 TCP 连接并进行基本的数据传输,TcpClientTcpListener 提供了更高层次的简化接口,能加速开发过程。

性能差异

Socket
可能会有一些额外的开销,因为它需要手动处理更多的底层细节

TcpClientTcpListener
会封装一些操作,可能在某些情况下会稍微影响性能,特别是当你需要高度优化的网络应用时,Socket 会提供更直接的控制。

代码示例对比

Socket:
客户端代码具体见实例

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect("127.0.0.1", 12345);
//socket.BeginConnect(ip, port, ConnectCallback, socket);
byte[] data = Encoding.ASCII.GetBytes("Hello, Server!");
socket.Send(data);
socket.Close();

服务器端代码具体见实例

Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
serverSocket.Bind(new IPEndPoint(IPAddress.Any, 12345));
serverSocket.Listen(10);

Socket clientSocket = serverSocket.Accept();

byte[] buffer = new byte[1024];
int bytesRead = clientSocket.Receive(buffer);
Console.WriteLine(Encoding.ASCII.GetString(buffer, 0, bytesRead));

clientSocket.Close();
serverSocket.Close();

TcpClientTcpListener

客户端代码:

TcpClient client = new TcpClient("127.0.0.1", 12345);
NetworkStream stream = client.GetStream();
byte[] data = Encoding.ASCII.GetBytes("Hello, Server!");
stream.Write(data, 0, data.Length);
client.Close();

服务器端代码

TcpListener server = new TcpListener(IPAddress.Any, 12345);
server.Start();
TcpClient client = server.AcceptTcpClient();
NetworkStream stream = client.GetStream();
byte[] buffer = new byte[1024];
int bytesRead = stream.Read(buffer, 0, buffer.Length);
Console.WriteLine(Encoding.ASCII.GetString(buffer, 0, bytesRead));
client.Close();
server.Stop();
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇