• (45)C#网络3 socket


     一、TCP传输

    using System.Net.Sockets;

    1.最基本客户端连服务器

    服务端运行后一直处于监听状态,客户端每启动一次服务端就接收一次连接并打印客户端的ip地址和端口号。(服务端的端口号是固定的,客户端端口号是随机生成的)

    服务端

            static void Main(string[] args)
            {
                Int32 port = 8500;
                IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
                //创建监听对象,参数1:IPAddress类的对象,参数2:端口号
                TcpListener tcpListener = new TcpListener(ipAddress, port);
                //开启监听
                tcpListener.Start();
                Console.WriteLine("服务器端口号:" + port + " 开始监听...");
                while (true)
                {
                    //接收一个tcp类型的客户端连接
                    TcpClient tcpClient = tcpListener.AcceptTcpClient();
                    //屏幕打印客户端的IP地址和端口号
                    Console.WriteLine("客户端:{0},连接到服务端", tcpClient.Client.RemoteEndPoint);
                }
            }

    客户端

            static void Main(string[] args)
            {
                Console.WriteLine("启动客户端 ...");
                TcpClient client = new TcpClient();
                try
                {
                    // 与服务器连接
                    client.Connect("localhost", 8500);     
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    return;
                }
                Console.ReadKey();
            }

     2.服务端与客户端聊天

     

    二、UDP传输

    UDP是无连接协议,不需要用listener监听。

    UDP传输是对等的没有主次之分

     IPEndPoint 类

    将网络终结点表示为 IP 地址和端口号

    //新实例初始化 IPEndPoint 类具有指定的地址和端号,IPEndPoint(IPAddress, Int32)
    IPEndPoint iPEndPoint = new IPEndPoint(IPAddress.Any, 0);
    //获取或设置IP地址
    iPEndPoint.Address
    //获取或设置端口号
    iPEndPoint.Port

    三、Socket

    构造函数:

     Socket(AddressFamily, SocketType, ProtocolType)

    AddressFamily 表示地址族 Socket,一般使用InterNetwork 表示ipv4

    SocketType:指定套接字类型的实例 Socket 类表示

    ProtocolType: 指定 Socket 类支持的协议

    属性

    Blocking:是否 Socket 处于阻塞模式。bool

    Connected:获取一个值,该值指示是否 Socket 连接到远程主机从上次以来 Send 或 Receive 操作。bool

    LocalEndPoint:表示本地ip与端口的组合,在调用bind后设置

    RemoteEndPoint:面向连接中,该属性可以获取socket连接中的远程IP和端口,无连接中该属性包含将要和socket通信的默认远程ip和端口,RemoteEndPoint在调用acceppt或conncet后使用。

     

    服务端

        class Program
        {
            static Socket S;
            static void Main(string[] args)
            {
                Console.WriteLine("启动服务器.....");
                //参数1寻址方案,参数2套接字类型,参数3协议类型
                Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                //设置IP地址和端口号
                IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8500);
                //把地址绑定到socket对象
                socket.Bind(ipEndPoint);
                //启动监听,并设置连接队列的最大长度
                socket.Listen(10);
                try
                {
                    //持续监听
                    while (true)
                    {
                        //等待客户端连接,连接后接收客户端返回一个通信用的socket对象
                        S = socket.Accept();
                        Console.WriteLine("客户端 " + S.RemoteEndPoint + " 连接到服务器.....");
                        Thread th = new Thread(receive);
                        th.Start(S);
                    }
                }
                catch { }
            }
            static void receive(object o)
            {
                while (true)
                {
                    try
                    {
                        byte[] buffer = new byte[1024 * 1024 * 2];
                        //接收客户端消息读到缓冲区(字节数组类型),返回int字节数
                        int count = S.Receive(buffer);
                        //防止客户端关闭后进入死循环
                        if (count == 0)
                        {
                            break;
                        }
                        //将字节数组转成字符串
                        string str = Encoding.UTF8.GetString(buffer, 0, count);
                        Console.WriteLine("客户端" + str);
                    }
                    catch { }
                }
            }
            static void write()
            {
    
            }
        }

    客户端

        class Program
        {
            static void Main(string[] args)
            {
                string str = string.Empty;
                Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                //连接指定的服务器
                socket.Connect("127.0.0.1",8500);
                Console.WriteLine("连接成功");
                while (!str.Equals("exit"))
                {
                    str = Console.ReadLine();
                    byte[] buffer = Encoding.UTF8.GetBytes(str);
                    socket.Send(buffer);
                }
                Console.ReadKey();        
            }
        }
  • 相关阅读:
    ActionResult 的返回类型
    MVC4.0中ViewBag、ViewData、TempData和ViewModel几种传值方式的区别
    抛出异常的区别 throw 和throw ex
    字段的重复校验问题
    bootstrap 动态添加验证项和取消验证项
    VS快捷键大全(转)
    数组、List和ArrayList的区别
    处理两个泛型集合差异化
    传参的两种方式
    tomcat中web项目编译后的结构
  • 原文地址:https://www.cnblogs.com/buchizaodian/p/8508853.html
Copyright © 2020-2023  润新知