zoukankan      html  css  js  c++  java
  • 简单的udp消息收发

    本例内容为书上1.4.4内容的改版,主要实现服务端和客户端分离。

    使用socket:

    服务端程序:

    int dataLength;
                string tmpStr;
                byte[] dataBytes1 = new byte[1024];
                //指定监听端口开始
                Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                IPEndPoint myHost = new IPEndPoint(IPAddress.Any, 8080);
                //指定监听端口结束
                EndPoint client1 = new IPEndPoint(IPAddress.Any, 8080);
                socket.Bind(myHost);
                do
                {
                    Console.WriteLine("等待接收...");
                    dataLength = socket.ReceiveFrom(dataBytes1, ref client1);
                    tmpStr = System.Text.Encoding.Unicode.GetString(dataBytes1, 0, dataLength);
                    Console.WriteLine($"接收到来自{client1.ToString()}的信息:{tmpStr}");
                }while (tmpStr.ToLower() != "serverover");
                socket.Close();
                Console.WriteLine("对方已要求服务器退出,请按回车键结束。");
                Console.ReadLine();

    客户端程序:

    byte[] dataBytes;
                string tmpStr;
                Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                //指定使用哪个套接字发送开始
                IPEndPoint myHost = new IPEndPoint(IPAddress.Any, 8081);
                socket.Bind(myHost);
                //指定使用哪个套接字发送结束
                //指定服务器开始
                IPEndPoint remoteIPEnd = new IPEndPoint(IPAddress.Parse("192.168.1.105"), 8080);
                //指定服务器结束
                do
                {
                    Console.Write("输入发送信息(exit退出):");
                    tmpStr = Console.ReadLine();
                    dataBytes = System.Text.Encoding.Unicode.GetBytes(tmpStr);
                    socket.SendTo(dataBytes, remoteIPEnd);
                } while (tmpStr.ToLower() != "exit");
                socket.Close();
                Console.WriteLine("已经退出,请按回车键结束。");
                Console.ReadLine();

    运行效果:

     不同电脑测试也通过。

     基于此,就应当能很轻松完成P24页第4题了。


     使用udpclient:

    服务端:

    static UdpClient udp;
            static void Main(string[] args)
            {
                string msg;
                IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9000),remote=new IPEndPoint(IPAddress.Any,0);
                udp = new UdpClient(ipep);
                do
                {
                    msg = Encoding.UTF8.GetString(udp.Receive(ref remote));
                    Console.WriteLine($"{remote.ToString()}:{msg}");
                }
                while (msg.ToLower() != "exit");
            }

    客户端:

    static UdpClient udp;
            static void Main(string[] args)
            {
                IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9100);
                udp = new UdpClient(ipep);
                udp.Connect(IPAddress.Parse("127.0.0.1"), 9000);
                string msg;
                byte[] b;
                do
                {
                    msg = Console.ReadLine();
                    b = Encoding.UTF8.GetBytes(msg);
                    udp.Send(b, b.Length);
                } while (msg.ToLower() != "exit");
            }

    扩展:

    都写到这里了,大家结合之前的网络知识,再思考一下,如何突破单边的源地址转换限制,实现内网和公网pc收发消息?

    提示:内网机器先发出消息,利用出口转换表里的地址和端口对应关系,让服务器也可以访问到客户机。

    代码修改1:发送消息程序,服务器ip和端口需要在运行时由用户指定。

    代码修改2:内网机器的发送和接收,使用了相同的ip和端口。必须开启端口复用才能工作。代码为:“socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);”

    效果如下图:

     其中,远程桌面使用的是一台公网机器,右侧是本机。

    运行顺序为图中顺序。

    此时,内网机器也能够被其他内网机器连接并接收消息:

    这也是qq最基本的通信原理。 

    思考题:如何利用一台公网服务器,构建简单聊天程序?

  • 相关阅读:
    最小的K个数
    数组中出现次数超过一半的数字
    合并排序
    一只小蜜蜂...
    从零开始学springboot笔记(三)-Spring boot之热部署之Springloaded(仅做了解,实际开发中不用它)
    从零开始学springboot笔记(二)-Spring boot返回json数据(中文无乱码)
    从零开始学springboot笔记(一)-Spring boot之Hello Word
    IDEA2018永久破解版下载与安装
    $.ajaxSettings.async = false;是什么意思?
    嘿嘿
  • 原文地址:https://www.cnblogs.com/wanjinliu/p/12271043.html
Copyright © 2011-2022 走看看