C#实战024:利用Socket进行双向信息通信

      项目开发过程中需要通过服务器获取设备的信息状态,这时我们就需要在设备端开启监听来获取服务器发来的消息并执行相应程序来获取设备的参数,这个过程我们需要利用Socket进行通信,这时服务器是发送数据,设备为接受数据,所以这里我们定义服务器为客户端SocketClient,设备为服务端SocketServer。

Socket用到的几个方法:

   Socket():创建一个Socket对象

   Bind():绑定一个本地的IP和端口号

   Listen():开启Socket监听并指定监听数量

   Connect():初始化与另一个Socket的连接

   Accept():接收连接并返回一个新的Socket

   Send():发送数据到Socket

   Receive():从Socket中读取数据

   Close():关闭Socket,释放资源

socket 对象参数 (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
第一个参数指socket使用的寻址方案,即IPV4或IPV6;
第二个参数指socket的套接字的类型,stream表示流式套接字,dgram表示数据报套接字
第三个参数指socket支持的协议,TCP协议或UDP协议。

客户端代码(已经详细的解释了每行代码的意思了):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Threading;


namespace SocketClient
{
    class Program
    {
        //创建一个socket的对象
        public static Socket socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        private static byte[] result = new byte[1024];//定义一个字节数组,相当于缓存
        public static string serverIp = "127.0.0.1";//设定服务器IP地址
        public static int serverPort = 8888;//设定服务器端口
        static void Main(string[] args)
        {
            SocketClient();//调用SocketClient方法
        }
        /// 
        /// 创建Socket客户端
        /// 
        public static void SocketClient()
        {
            IPAddress ip = IPAddress.Parse(serverIp);//服务器IP地址
            IPEndPoint point = new IPEndPoint(ip, serverPort);//服务器IP地址及端口
            try
            {
                socketClient.Connect(point);//链接服务器IP与端口
                Console.WriteLine("连接服务器成功");
            }
            catch (Exception)
            {
                Console.WriteLine("连接服务器失败,请按回车键退出!");
                return;
            }
            //通过socketClient接受服务器的数据
            int num = socketClient.Receive(result);//把接受到的数据存到bytes数组中并赋值给num
            Console.WriteLine("接收服务器消息:{0}", Encoding.UTF8.GetString(result, 0, num));  //GetString(result, 0, num)把从0到num的字节变成String
            try
            {
                Thread.Sleep(1000);    //等待1秒钟  
                //通过 socketClient 向服务器发送数据
                string sendMessage = "已成功接到SocketClient发送的消息";//发送到服务端的内容
                byte[] send = Encoding.UTF8.GetBytes(sendMessage);//Encoding.UTF8.GetBytes()将字符串转换成字节(避免乱码)
                socketClient.Send(send);  //将接受成功的消息返回给SocketServer服务器 
                Console.WriteLine("发送完毕:{0}",sendMessage);
                
            }
            catch
            {
                socketClient.Shutdown(SocketShutdown.Both);//禁止Socket上的发送和接受
                socketClient.Close();//关闭Socket并释放资源
            }
            Console.ReadLine();
            socketClient.Close();//关闭Socket并释放资源
        }
    }
}

服务器端代码(已经详细的解释了每行代码的意思了): 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace SocketServer
{
    class Program
    {
        static void Main(string[] args)
        {
            SocketServer();
        }
        //创建一个socket的对象
        public static Socket socketServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        public static string serverIp = "127.0.0.1";//设定IP
        public static int serverPort = 8888;//设定端口
        public static byte[] result = new byte[1024];//定义一个字节数组,相当于缓存
        /// 
        /// 创建socket服务
        /// 
        public static void SocketServer()
        {
            IPAddress ip = IPAddress.Parse(serverIp);//服务器IP地址
            IPEndPoint point = new IPEndPoint(ip, serverPort);//获取端口
            socketServer.Bind(point);//绑定IP地址及端口
            socketServer.Listen(100);//开启监听并设定最多10个排队连接请求 
            Console.WriteLine("启动监听{0}成功", socketServer.LocalEndPoint.ToString());//输出启动成功提示

            Thread thread = new Thread(ListenSocket);//创建一个监听进程
            thread.Start();//运行
            Console.ReadLine();
        }
        /// 
        /// 监听客户端连接
        /// 
        public static void ListenSocket()
        {
            while (true)
            {
                Socket clientSocket = socketServer.Accept();//接收连接并返回一个新的Socket
                clientSocket.Send(Encoding.UTF8.GetBytes("服务器连接成功"));//在客户端显示"服务器连接成功"提示
                Thread recevieThread = new Thread(ReceiveMessage);//创建一个接受信息的进程
                recevieThread.Start(clientSocket);//运行新的Socket接受信息
            }
        }
        /// 
        ///  接受Socket消息
        /// 
        /// 
        public static void ReceiveMessage(object clientSocket)
        {
            Socket SocketClient = (Socket)clientSocket;
            while (true)
            {
                try
                {
                    //通过clientsocket接收数据
                    int num = SocketClient.Receive(result);//把接受到的数据存到bytes数组中并赋值给num
                    Console.WriteLine("接收客户端{0} 的消息:{1}", SocketClient.RemoteEndPoint.ToString(), Encoding.UTF8.GetString(result, 0, num));//GetString(result, 0, num)把从0到num的字节变成String
                    Thread.Sleep(1000);    //等待1秒钟  
                    //给SocketClient客户端返回信息
                    string sendMessage = "已成功接到socketServer发送的消息";//发送到客户端的内容
                    byte[] send = Encoding.UTF8.GetBytes(sendMessage);//Encoding.UTF8.GetBytes()将字符串转换成字节(避免乱码)
                    SocketClient.Send(send);//将接受成功的消息返回给SocketClient客户端
                    SocketClient.Close();//关闭Socket并释放资源
                }
                catch { }
            }
        }
    }
}

欢迎关注本人的公众号:编程手札,文章也会在公众号更新

 

你可能感兴趣的:(编程语言C#,C#实战开发历程)