TcpClient TcpListener

目录

1.Socket,TCP,UDP

1.1Socket通信:

1.2TCP通信:

1.3UDP通信:

2.TcpClient TcpListener

TcpListener

基本用法

TcpClient

基本用法

示例:简单聊天应用

服务器端代码(TcpListener)

客户端代码(TcpClient)


1.Socket,TCP,UDP

1.1Socket通信

Socket是更底层的网络通信接口,不仅支持TCP,也支持UDP等其他传输协议。它为网络通信提供了基本的构建块,允许开发者直接操作IP地址和端口,进行低级的数据读写操作。

TcpClientTcpListener实际上就是对Socket API的封装,使得开发者可以在不需要详细了解Socket编程的情况下使用TCP进行通信。可以说,TcpClientTcpListener是Socket通信在TCP协议上的具体应用。

1.2TCP通信

TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层协议。它通过三次握手建立连接,确保数据按序无误地传输,并通过四次挥手断开连接。

TcpClientTcpListener是.NET框架中对TCP协议的高级抽象,简化了使用TCP进行网络通信的复杂度。TcpClient面向客户端,用于连接服务器并发送/接收数据;TcpListener面向服务端,用于监听特定端口上的连接请求并处理这些连接。

1.3UDP通信

UDP(User Datagram Protocol)是另一种传输层协议,与TCP相对,它是无连接的、不可靠的、基于数据报的。UDP不保证数据的顺序和到达,但它的优势在于头部开销小,传输速度快,适用于实时应用如在线视频、VoIP等。

在.NET中,UdpClient类是对UDP协议的高级封装,提供了发送和接收UDP数据报的功能,类似于TcpClient对于TCP的作用,但不涉及连接的建立和维护,因为UDP本身就是无连接的。

总结,TcpClientTcpListener是实现TCP通信的高级工具,它们建立在Socket通信的基础之上,提供了更方便的API来处理TCP连接。而TCP通信和UDP通信是两种不同的传输层协议,分别适用于需要可靠性和速度、实时性不同需求的场景。Socket通信则是更底层的通信方式,支撑了上述所有基于特定协议的网络通信。

2.TcpClient TcpListener

TCP(Transmission Control Protocol)是互联网中一种面向连接的、可靠的、基于字节流的传输层通信协议。在.NET框架中,TcpClientTcpListener类为开发者提供了实现TCP通信的便捷方式。

TcpListener

TcpListener类用于在服务器端监听指定的IP地址和端口号上的连接请求。它允许服务器应用程序等待并接受来自客户端的连接。一旦接受到连接请求,TcpListener会创建一个新的TcpClient实例来处理这个连接。

基本用法
  1. 创建TcpListener实例:首先,需要指定要监听的IP地址和端口号。
  2. 开始监听:调用Start()方法开始监听连接请求。
  3. 接受连接:使用AcceptTcpClient()阻塞等待直到有客户端连接,然后返回一个TcpClient对象来与客户端通信。
  4. 关闭监听:完成任务后,应调用Stop()方法停止监听。
TcpClient

TcpClient类用于在客户端建立到远程主机的TCP连接,并通过这个连接发送或接收数据。它提供了读写流(GetStream()方法返回的NetworkStream)来处理数据交换。

基本用法
  1. 创建TcpClient实例:可以直接创建,也可以通过服务器返回的连接实例化。
  2. 连接到服务器:调用Connect()方法,传入服务器的IP地址和端口号以建立连接。
  3. 数据交换:通过GetStream()得到的NetworkStream进行读写操作。
  4. 关闭连接:完成数据交换后,调用Close()方法关闭连接。
示例:简单聊天应用

实现客户端和服务器端双向通信。

服务器端代码(TcpListener)

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

public class Server
{
    public static void StartServer()
    {
        TcpListener listener = new TcpListener(IPAddress.Any, 8888);
        Console.WriteLine("服务器正在启动...");
        listener.Start();
        Console.WriteLine("服务器已启动,等待客户端连接...");

        while (true)
        {
            TcpClient client = listener.AcceptTcpClient();
            Console.WriteLine("客户端已连接");

            // 使用线程来处理每个客户端,以便同时处理多个连接
            Thread t = new Thread(() => HandleClient(client));
            t.Start();
        }
    }

    private static void HandleClient(TcpClient client)
    {
        NetworkStream stream = client.GetStream();
        byte[] buffer = new byte[1024];
        string data;

        while (true)
        {
            int read = stream.Read(buffer, 0, buffer.Length);
            data = Encoding.ASCII.GetString(buffer, 0, read);
            Console.WriteLine($"接收到消息: {data}");

            if (data.ToLower() == "exit")
            {
                break;
            }

            // 回显消息给客户端
            byte[] response = Encoding.ASCII.GetBytes(data);
            stream.Write(response, 0, response.Length);

            // 发送一条新消息给客户端
            string serverMessage = "这是服务器的消息";
            byte[] serverData = Encoding.ASCII.GetBytes(serverMessage);
            stream.Write(serverData, 0, serverData.Length);
        }

        client.Close();
        Console.WriteLine("客户端已断开连接");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Server.StartServer();
    }
}

客户端代码(TcpClient)

using System;
using System.IO;
using System.Net.Sockets;
using System.Text;

public class Client
{
    public static void SendMessage()
    {
        TcpClient client = new TcpClient("localhost", 8888);
        Console.WriteLine("已连接到服务器");

        NetworkStream stream = client.GetStream();

        while (true)
        {
            Console.Write("请输入消息 (输入'exit'退出): ");
            string message = Console.ReadLine();

            if (message.ToLower() == "exit")
            {
                break;
            }

            byte[] data = Encoding.ASCII.GetBytes(message);
            stream.Write(data, 0, data.Length);

            // 读取服务器的消息
            byte[] buffer = new byte[1024];
            int read = stream.Read(buffer, 0, buffer.Length);
            string serverResponse = Encoding.ASCII.GetString(buffer, 0, read);
            Console.WriteLine($"服务器回应: {serverResponse}");
        }

        client.Close();
        Console.WriteLine("已断开与服务器的连接");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Client.SendMessage();
    }
}

在这个示例中,服务器端为每个连接的客户端创建一个新线程来处理读写操作,这样可以同时服务多个客户端。客户端和服务器之间实现了双向通信,即客户端发送消息给服务器,服务器回显该消息并额外发送一条自己的消息给客户端,客户端接收并显示这些消息。同样,当任意一端输入"exit"时,将结束当前连接。

  • 31
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C#中的TcpClientTcpListener是用于创建和处理TCP连接的类。TcpClient用于创建TCP客户端,而TcpListener用于创建TCP服务器。 TcpClient类用于在客户端与服务器之间建立连接。可以通过TcpClient对象的构造函数创建实例,并使用Connect方法连接到指定的服务器和端口。一旦连接建立,就可以使用NetworkStream来发送和接收数据。 以下是一个简单的示例代码,演示了如何使用TcpClient发送数据: ```csharp using System; using System.Net.Sockets; class Program { static void Main() { try { TcpClient client = new TcpClient("127.0.0.1", 8080); NetworkStream stream = client.GetStream(); string message = "Hello, Server!"; byte[] data = System.Text.Encoding.ASCII.GetBytes(message); stream.Write(data, 0, data.Length); Console.WriteLine("Message sent to the server."); stream.Close(); client.Close(); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } } } ``` TcpListener类用于创建TCP服务器,它监听指定的端口,并等待客户端的连接请求。可以使用AcceptTcpClient方法来接受客户端连接,并返回一个TcpClient对象以进行数据传输。 以下是一个简单的示例代码,演示了如何使用TcpListener接收数据: ```csharp using System; using System.Net; using System.Net.Sockets; class Program { static void Main() { TcpListener server = null; try { // 设置监听IP和端口 IPAddress ipAddress = IPAddress.Parse("127.0.0.1"); int port = 8080; server = new TcpListener(ipAddress, port); // 开始监听 server.Start(); Console.WriteLine("Server started. Waiting for clients..."); // 接受客户端连接 TcpClient client = server.AcceptTcpClient(); // 获取客户端的网络流 NetworkStream stream = client.GetStream(); byte[] data = new byte[1024]; // 读取客户端发送的数据 int bytesRead = stream.Read(data, 0, data.Length); string message = System.Text.Encoding.ASCII.GetString(data,0, bytesRead); Console.WriteLine("Received message: " + message); stream.Close(); client.Close(); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } finally { if (server != null) server.Stop(); } } } ``` 这些是TcpClientTcpListener的基本用法示例。你可以根据你的需求进行进一步的开发和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值