zoukankan      html  css  js  c++  java
  • 客户端和服务端之间的通信(UDP)

    实现一个小的通信功能:客户端向服务端提交数据,然后服务端回执数据。

    一、新建一个控制台应用程序:Client。

    View Code
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Net;
    using System.Net.Sockets;
    
    namespace Client
    {
        class Program
        {
            static void Main(string[] args)
            {
                //创建一个Socket对象
                Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050);
                Console.Write("向服务端提交当前时间!\n");
    
                string dt = DateTime.Now.ToString();//获取当前时间。
                byte[] send = Encoding.ASCII.GetBytes(dt);
    
                //string message = Console.ReadLine();//发送客户端输入信息。
                //byte[] send = Encoding.ASCII.GetBytes(message);
                s.SendTo(send, (EndPoint)ipep);//向服务器发送
    
                int length;
                byte[] data = new byte[1024];
                IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
                EndPoint Remote = (EndPoint)(sender);
                length = s.ReceiveFrom(data, ref Remote);//通过ReceiveFrom接受来自服务端的数据
                Console.Write("" + Remote.ToString() + "接收信息:\n服务器已接收到客户端发送时间");
                string receive = Encoding.ASCII.GetString(data, 0, length);
                Console.WriteLine(receive);
                Console.ReadLine();
            }
        }
    }

    二、新建一个控制台应用程序:Server。

    View Code
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Net;
    using System.Net.Sockets;
    
    namespace Server
    {
        class Program
        {
            static void Main(string[] args)
            {
    
                Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);
                s.Bind(ipep);//使用Bind方法绑定所指定的接口使Socket与一个本地终结点相联
                Console.WriteLine("等待客户端发送信息");
    
                int length;
                byte[] data = new byte[1024];
                IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
                EndPoint Remote = (EndPoint)(sender);
                length = s.ReceiveFrom(data, ref Remote);
                Console.Write("" + Remote.ToString() + "接收信息:");
                string receive = Encoding.ASCII.GetString(data, 0, length);
                Console.WriteLine(receive);
    
                //string sendString = "SerderTime from Cliend:"+receive;
                byte[] send = Encoding.ASCII.GetBytes(receive);
                s.SendTo(send, Remote);
    
                //s.Close();
                Console.ReadLine();
    
            }
        }
    }

    先后运行服务端和客户端程序。执行结果如下:

    三、可以进一步的完善功能:如可以让客户端每5秒钟向客户端提交一次数据。

    这样只需要对程序进行一些修改:在客户端增加一个定时器,在程序运行后,每5秒钟向服务端提交一次当前时间。(在Client运行期间,Server端必须保持运行状态)

    View Code
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Net;
    using System.Net.Sockets;
    
    namespace Client
    {
        public class Program
        {
            //创建一个Socket对象
            static Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            static IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050);
            static void Main(string[] args)
            {
                Console.Write("向服务端提交当前时间!\n");
                //创建一个定时器对象
                System.Timers.Timer myTimer = new System.Timers.Timer();
                myTimer.AutoReset = true;
                myTimer.Interval = 5000;
                myTimer.Elapsed += new System.Timers.ElapsedEventHandler(myTimer_Elapsed);
                myTimer.Enabled = true;
                Console.ReadLine();
            }
    
            public static void myTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
            {
                string dt = DateTime.Now.ToString();
                byte[] send = Encoding.ASCII.GetBytes(dt);
                //string message = Console.ReadLine();
                //byte[] send = Encoding.ASCII.GetBytes(message);
                s.SendTo(send, (EndPoint)ipep);//向服务器发送当前时间
    
                int length;
                byte[] data = new byte[1024];
                IPEndPoint senderEP = new IPEndPoint(IPAddress.Any, 0);
                EndPoint Remote = (EndPoint)(senderEP);
                length = s.ReceiveFrom(data, ref Remote);//通过ReceiveFrom接受来自服务端的数据
                Console.Write("" + Remote.ToString() + "接收信息:\n服务器已接收到客户端发送时间");
                string receive = Encoding.ASCII.GetString(data, 0, length);
                Console.WriteLine(receive);
                Console.ReadLine();
            }
        }
    }

    在服务端接收和回执部分代码上添加一个while循环语句:

    四、再次先后运行Server和Client。运行结果如下:

  • 相关阅读:
    Ant 执行 exec cmd.exe 时路径包含空格的问题
    时区时差换算(GMT,UTC,PST,PDT)
    windows 共存多个位数不同的jdk时,eclipse的报错对应措施
    Windows下查询指定端口进程,并杀死
    关于windows的jdk
    第一阶段工作总结
    mac配置git mergetool为p4merge(2013笔记整理)
    ubuntu 14.04 安装压缩包版mysql
    关于微信公众号内嵌网页的几个meta标签
    关于js的keyCode
  • 原文地址:https://www.cnblogs.com/Shang0109/p/2614176.html
Copyright © 2011-2022 走看看