**硬件支持型号 点击 查看 硬件支持 详情**
dotNet使用TCP,可以使用Socket和TcpClient 、TcpListener类 2种,对于高级用户,建议使用Socket类,可以获得更大控制和性能。TcpClient
和 TcpListener
内部都依赖于 Socket
类。
这里使用TcpClient 和 TcpListener,编写一个客户端和服务端程序,客户端发送数据服务端接收并显示,服务端发送数据,每一个客户都接收到数据并显示:
Socket编程可能会需要用到IPEndPoint、Dns、IPAddress等类,再往上TCP相关有TcpListener、TcpClient、NetworkStream,再往上就是大家熟悉的HttpClient等。
服务端代码如下:
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace hwapp
{
class Program
{
/// 创建 TcpListener
/// TcpListener 类型用于监视 TCP 端口上的传入请求,然后创建一个 Socket 或 TcpClient 来管理与客户端的连接。
static TcpListener tcpListener;
static List<NetworkStream> networkStreams = new List<NetworkStream>();
static void Main(string[] args)
{
///开启监听
tcpListener = new TcpListener(IPAddress.Parse("127.0.0.1"), 9999);
///Start 方法可使用侦听,而 Stop 方法禁用端口上的侦听。
tcpListener.Start(10); // 最多 同时 接收10个用户连接
Console.WriteLine("启动服务(IP:127.0.0.1 端口:9999),等待客户端连接!");
///开启一个线程,循环等待客户端的连接
Task.Run(() => { Accept(); });
while(true)
{
/// 使用 NetworkStream 将数据写入连接的客户端
var msg = Console.ReadLine();
foreach (var item in networkStreams)
{
item.Write(Encoding.UTF8.GetBytes(msg));
}
}
}
static void Accept()
{
while (true)
{
///【阻塞】等待客户端的连接
/// AcceptTcpClientAsync 方法接受传入的连接请求并创建 TcpClient 来处理请求
TcpClient tcpClient = tcpListener.AcceptTcpClient();
NetworkStream networkStream = tcpClient.GetStream();
Console.WriteLine($"{tcpClient.Client.RemoteEndPoint}上线");
networkStreams.Add(networkStream);
///开启一个新的线程 等待新的消息
Task.Run(() => { Read(networkStream, tcpClient); });
}
}
/// <summary>
/// 接收消息
/// </summary>
/// <param name="networkStream"></param>
static void Read(NetworkStream networkStream, TcpClient tcpClient)
{
while (true)
{
try
{
byte[] buffer = new byte[1024 * 1024];
/// 【阻塞】等待接收新的消息
var readLen = networkStream.Read(buffer, 0, buffer.Length);
if (readLen == 0)
{
Console.WriteLine($"{tcpClient.Client.RemoteEndPoint}下线");
networkStreams.Remove(networkStream);
networkStream.Close();
tcpClient.Close();
return;
}
Console.WriteLine(tcpClient.Client.RemoteEndPoint + ":" + Encoding.UTF8.GetString(buffer, 0, readLen));
}
catch (Exception) { }
}
}
}
}
客户端代码如下:
namespace IOTtcpClient
{
class Program
{
/// 创建客户端套接字
static TcpClient tcpClient;
static NetworkStream networkStream;
static void Main(string[] args)
{
Console.WriteLine("TCP tcp Client");
var ipEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9999);
tcpClient = new TcpClient();
try
{
/// 连接到服务器
tcpClient.Connect(ipEndPoint);
Console.WriteLine("连接成功");
/// 创建 NetworkStream 以发送和接收数据
/// 需要使用 GetStream() 方法实例化 NetworkStream,以便能够发送和接收数据
networkStream = tcpClient.GetStream();
//读取
Task.Run(() => { Read(); });
Console.WriteLine("=======");
while (true)
{
Console.Write("->");
var msg = Console.ReadLine();
/// 发送消息到服务端
networkStream.Write(Encoding.UTF8.GetBytes(msg));
}
}
catch (Exception) {
Console.WriteLine("连接失败");
}
}
/// <summary>
/// 接收数据
/// </summary>
static void Read()
{
while (networkStream.CanRead)
{
try
{
byte[] buffer = new byte[1024 * 1024];
///【阻塞】等待接收新的消息
var readLen = networkStream.Read(buffer, 0, buffer.Length);
if (readLen == 0) ///客户端断开连接
{
Console.WriteLine("强行断开连接");
networkStream.Close();
return;
}
Console.WriteLine("<-" + Encoding.UTF8.GetString(buffer, 0, readLen));
}
catch (Exception) { }
}
}
}
}
更多信息 请查看 dotNet基础知识.pdf
**硬件支持型号 点击 查看 硬件支持 详情**