• socket简单调用


    下载

    Client

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    //导入的命名空间
    using System.Net.Sockets;
    
    namespace SocketClient
    {
        class Program
        {
            /// <summary>
            /// Socket Server 演示
            /// </summary>
            /// <param name="args"></param>
            static void Main(string[] args)
            {
                //创建一个Socket
                var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    
                //连接到指定服务器的指定端口
                //方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.connect.aspx
                socket.Connect("localhost", 4530);
    
                Console.WriteLine("connect to the server");
                //实现接受消息的方法
    
                //方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginreceive.aspx
                socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);
    
                //接受用户输入,将消息发送给服务器端
                while(true)
                {
                    var message = "Message from client : " + Console.ReadLine();
                    var outputBuffer = Encoding.Unicode.GetBytes(message);
                    socket.BeginSend(outputBuffer, 0, outputBuffer.Length, SocketFlags.None, null, null);
                }
    
            }
    
    
            static byte[] buffer = new byte[1024];
    
            public static void ReceiveMessage(IAsyncResult ar)
            {
                try
                {
                    var socket = ar.AsyncState as Socket;
    
                    //方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspx
                    var length = socket.EndReceive(ar);
                    //读取出来消息内容
                    var message = Encoding.Unicode.GetString(buffer, 0, length);
                    //显示消息
                    Console.WriteLine(message);
    
                    //接收下一个消息(因为这是一个递归的调用,所以这样就可以一直接收消息了)
                    socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);
                }
                catch(Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
        }
    }

    Server

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    //额外导入的两个命名空间
    using System.Net.Sockets;
    using System.Net;
    
    namespace SocketServer
    {
        class Program
        {
            /// <summary>
            /// Socket Server 演示
            /// </summary>
            /// <param name="args"></param>
            static void Main(string[] args)
            {
                //创建一个新的Socket,这里我们使用最常用的基于TCP的Stream Socket(流式套接字)
                var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    
                //将该socket绑定到主机上面的某个端口
                //方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.bind.aspx
                socket.Bind(new IPEndPoint(IPAddress.Any, 4530));
    
                //启动监听,并且设置一个最大的队列长度
                //方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.listen(v=VS.100).aspx
                socket.Listen(4);
    
                //开始接受客户端连接请求
                //方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginaccept.aspx
                socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);
    
    
                Console.WriteLine("Server is ready!");
                Console.Read();
            }
    
    
            public static void ClientAccepted(IAsyncResult ar)
            {
    
                var socket = ar.AsyncState as Socket;
    
                //这就是客户端的Socket实例,我们后续可以将其保存起来
                var client = socket.EndAccept(ar);
    
                //给客户端发送一个欢迎消息
                client.Send(Encoding.Unicode.GetBytes("Hi there, I accept you request at " + DateTime.Now.ToString()));
    
    
                //实现每隔两秒钟给服务器发一个消息
                //这里我们使用了一个定时器
                var timer = new System.Timers.Timer();
                timer.Interval = 2000D;
                timer.Enabled = true;
                timer.Elapsed += (o, a) =>
                {
                    //检测客户端Socket的状态
                    if(client.Connected)
                    {
                        try
                        {
                            client.Send(Encoding.Unicode.GetBytes("Message from server at " + DateTime.Now.ToString()));
                        }
                        catch(SocketException ex)
                        {
                            Console.WriteLine(ex.Message);
                        }
                    }
                    else
                    {
                        timer.Stop();
                        timer.Enabled = false;
                        Console.WriteLine("Client is disconnected, the timer is stop.");
                    }
                };
                timer.Start();
    
    
                //接收客户端的消息(这个和在客户端实现的方式是一样的)
                client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), client);
    
                //准备接受下一个客户端请求
                socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);
            }
    
            static byte[] buffer = new byte[1024];
    
            public static void ReceiveMessage(IAsyncResult ar)
            {
    
                try
                {
                    var socket = ar.AsyncState as Socket;
    
                    //方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspx
                    var length = socket.EndReceive(ar);
                    //读取出来消息内容
                    var message = Encoding.Unicode.GetString(buffer, 0, length);
                    //显示消息
                    Console.WriteLine(message);
    
                    //接收下一个消息(因为这是一个递归的调用,所以这样就可以一直接收消息了)
                    socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);
                }
                catch(Exception ex){
                    Console.WriteLine(ex.Message);
                }
            }
        }
    }
  • 相关阅读:
    递归
    作业 3月24日
    生成器
    迭代器
    解决python print 字符串 编码报错现象 unencode
    模式匹配迅速入手——ahocorasick第三方数据库的使用
    删除oracle部分数据
    html_获取参数
    ahocorasick从安装到使用
    Java 遍历map的四种方法
  • 原文地址:https://www.cnblogs.com/macT/p/11661709.html
Copyright © 2020-2023  润新知