zoukankan      html  css  js  c++  java
  • TcpClient和TcpListener 类的使用编写一个点对点聊天工具(初级入门篇)

    TcpClient类和TcpListener类属于.NET框架下网络通信中的应用层类,为Socket通信提供了更简单,对用户更为友好的接口。应用层类比位于底层的Socket类提供了更高层次的抽象,封装了套接字的创建,不需要处理连接的细节。

    TcpClient类以更高的抽象程度提供TCP服务的基础,因此许多应用层次上的通信协议,比如FTP传输协议、HTTP超文本传输协议都直接创建在TcpClient等类之上。TcpClient类直接为客户端设计,提供了通过网络连接发送和接收数据的简单方法;TcpListener类用于服务器端,用来监视TCP端口上客户端的请求。

    1.TcpClient类

    要建立TCP连接,应该提供IP地址和端口号。TcpClient类有三种构造函数。

    (1)public TcpClient():使用本机默认的IP地址和默认的端口0来创建TCP连接。

    (2)public TcpClient(IPEndPoint):IPEndPoint指定在建立远程连接时所使用的本机IP地址和端口号。

    (3)public TcpClient(string,int):初始化TcpClient类的新实例,并连接到指定主机上的制定端口。

    需要说明的是,在使用前两种构造函数的时候,只是实现了TcpClient实例对象与IP地址和Port端口的绑定,要完成连接,还需要显示地用Connect方法指定与远程主机的连接。

    在网络数据接收和发送方面,TcpClient类使用NetworkStream网络流处理技术,使得读写数据更加方便直观,而不需考虑具体传输的内容。在使用GetStream方法获得用于发送和接收数据的网络流之后,就可以使用标准流读写方法Write和Read来发送和接收数据了。

    2.TcpListener类

    TcpListener类用于监视TCP端口上客户端的请求,通过绑定本机IP地址和端口(IP地址和端口应与客户端请求一致)来创建TcpListener对象实例,由Start()方法启动侦听;当TcpListener侦听到客户端连接后,根据客户端的请求方式来处理请求,即如果是Socket连接请求,则使用AcceptSocket方法,如果是TcpClient连接请求,则使用AcceptTcpClient方法。最后要关闭使用的连接

    tcpclient和socket的区别?

    TcpClient是在Socket的基础上运行的。

    Socket完全可以涵盖TcpClient,只不过TcpClient为了简化一部分Socket的功能。

    Socket支持TCP,UDP,IP包,Stream,Dgram等诸多类型
    而TcpClient只支持TCP和Stream
     
    实例: TcpClient和TcpListener 类的使用-编写一个点对点聊天工具(简单入门演示,客户端和服务端都是在本机)
      服务器端代码:
     class Program
        {
            static void Main(string[] args)
            {
                IPAddress localAddr = IPAddress.Parse("127.0.0.1");//IP地址类,建立一个IP地址对象
                TcpListener server = new TcpListener(localAddr, 13000);//使用IP和端口建立侦听器
                server.Start();//开始侦听
                Console.WriteLine("等待一个连接");
                TcpClient client = server.AcceptTcpClient();//接受一个连接,并创建一个服务器端TcpClient
                Console.WriteLine("客户端已经连接");
                //创建网络流相关的读写器
                NetworkStream stream = client.GetStream();
                StreamReader sr = new StreamReader(stream);
                StreamWriter sw = new StreamWriter(stream);
                while (true)
                {
                    Console.WriteLine("客户端:"+sr.ReadLine());//从客户端接受数据
                    string msg = Console.ReadLine();
                    sw.WriteLine(msg);//向客户端发送数据
                    sw.Flush();
                }
                client.Close();
            }
        }
      客户端代码:
    class Program
        {
            static void Main(string[] args)
            {
                IPAddress serverAddr = IPAddress.Parse("127.0.0.1");
                //创建一个TcpClient
                TcpClient client = new TcpClient();
                //向服务器发送连接请求,需要与服务端的IP和端口一致(节点通信)
                client.Connect(serverAddr, 13000);
                //创建流读写器
                NetworkStream stream = client.GetStream();
                StreamReader sr = new StreamReader(stream);
                StreamWriter sw = new StreamWriter(stream);
                while (true)
                {
                    string msg = Console.ReadLine();
                    //向服务器端发送数据
                    sw.WriteLine(msg);
                    sw.Flush();
                    //从服务器端读取数据
                    Console.WriteLine("服务器:"+sr.ReadLine());
                }
                client.Close();
    
            }
        }
     
      效果展示:
    先启动服务端,再启动客户端,客户端发送数据,服务端接受,然后服务端发送数据数据,客户端同样可以接收。往复发送接受,完成点对点聊天通信
     
  • 相关阅读:
    C#基础篇十小练习
    C#基础篇九OOP属性结构枚举
    C#基础篇八构造函数和面向对象思想
    C#基础篇七类和静态成员
    C#基础篇六飞行棋
    C#基础篇五值类型和引用类型
    数据与地址的自动给定---基于状态机
    SPI 核的寄存器空间
    mig_7series DDR控制器的配置
    关于zynq7 中MIO的理解
  • 原文地址:https://www.cnblogs.com/lqsilly/p/2916559.html
Copyright © 2011-2022 走看看