French

French - 技术经验
澄其心, 断其欲, 方能悟道
  1. 首页
  2. 编程语言
  3. C#
  4. 正文

C# 使用Socket进行通信(服务端,客户端)

2021-02-24 2037点热度 0人点赞 0条评论

需要使用到的包

using System.Net;
using System.Net.Sockets;

 

代码如下:

服务端代码:

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

namespace Test
{
    class SocketServices
    {
        // 设置主机地址
        private static IPAddress host = IPAddress.Parse("127.0.0.1");
        // 设置端口
        private static int port = 16666;
        // 设置Socket服务器
        private static Socket service_socket = null;
        // 设置Socket客户端
        private static Socket client_socket = null;
        // 设置消息大小
        private static byte[] result = new byte[2048];

        /// <summary>
        /// 构造方法
        /// </summary>
        public BigEyeCatSocketServices(){
            // 创建Socket服务器
            service_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            // 绑定Socket
            service_socket.Bind(new IPEndPoint(host, port));
            // 设置请求连接的数量
            service_socket.Listen(10);
            // 设置线程
            Thread service_thread = new Thread(Monitor_Client_Connection);
            // 启动线程
            service_thread.Start();
            Console.WriteLine("服务器启动成功!");
        }

        /// <summary>
        /// 侦听客户端
        /// </summary>
        public static void Monitor_Client_Connection() {
            // 设置无线循环
            while (true)
            {
                // 与服务器进行连接
                client_socket = service_socket.Accept();
                // 设置线程
                Thread client_thread = new Thread(Receive_Socket_Message);
                // 将客户端加入线程
                client_thread.Start(client_socket);
                Console.WriteLine("客户端连接成功");
            }
        }


        /// <summary>
        /// 发送消息
        /// </summary>
        public void Send_Socekt_Message(string message)
        {
            // 将消息转换为字节数组
            byte[] byte_send_message = Encoding.UTF8.GetBytes(message);
            try
            {
                // 发送消息给客户端
                client_socket.Send(byte_send_message);
            }
            catch (Exception e)
            {
                Console.WriteLine("发送消息失败: {0}", e.Message.ToString());
                return;
            }
        }


        /// <summary>
        /// 接收消息
        /// </summary>
        public static void Receive_Socket_Message(object client)
        {
            // 类型转换
            Socket socket_client = (Socket)client;
            // 设置无线循环
            while (true)
            {
                try
                {
                    // 接收数据
                    int receive_message_data = socket_client.Receive(result);
                    if (receive_message_data != 0)
                    {
                        // 打印客户端发送的消息
                        Console.WriteLine("客户端: {0}说: {1}", socket_client.RemoteEndPoint.ToString(), Encoding.UTF8.GetString(result, 0, receive_message_data));
                    }
                    else
                    {
                        // 终止程序
                        return;
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine("出现错误: {0}", e.Message.ToString());
                    // 禁止文件发送和上传
                    // socket_client.Shutdown(SocketShutdown.Both);
                    // 结束客户端
                    socket_client.Close();
                    break;
                }
            }
        }

        public void Close()
        {
            // 关闭服务器Socket
            service_socket.Close();
            // 设置客户端Socket
            client_socket.Close();
        }
    }
}

 

客户端代码:

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

namespace Test
{
    class SocketClient
    {
        // 设置主机地址
        private static IPAddress host = IPAddress.Parse("127.0.0.1");
        // 设置端口
        private static int port = 16666;
        // 设置服务对象
        private static Socket client_socket = null;

        /// <summary>
        /// 构造方法
        /// </summary>
        public BigEyeCatSocket(){
            try
            {
                client_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                client_socket.Connect(new IPEndPoint(host, port));
                Console.WriteLine("链接成功");
            }
            catch (Exception e)
            {
                Console.WriteLine("链接失败");
                Console.WriteLine("错误信息:", e.Message.ToString());
                return;
            }
        }

        /// <summary>
        /// 发送消息
        /// </summary>
        /// <param name="message">消息</param>
        public void Send_Socekt_Message(string message)
        {
            // 将消息转换为字节数组
            byte[] byte_send_message = Encoding.UTF8.GetBytes(message);
            // 发送消息给服务器
            client_socket.Send(byte_send_message);
            Console.WriteLine("发送成功");
        }

        /// <summary>
        /// 接收消息
        /// </summary>
        /// <returns></returns>
        public string Receive_Socket_Message()
        {
            int bytes;
            string receive_message = "";
            // 定义接收消息的数组
            byte[] byte_receive_message = new byte[2048];
            // 计算消息的的长度
            bytes = client_socket.Receive(byte_receive_message, byte_receive_message.Length, 0);
            // 接收返回的消息
            receive_message += Encoding.UTF8.GetString(byte_receive_message, 0, bytes);
            Console.WriteLine("消息接收成功");
            return receive_message;
        }

        public void Close()
        {
            client_socket.Close();
            Console.WriteLine("关闭链接");
        }
    }
}

运行结果:

 

 

本作品采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可
标签: C# Socket 网络编程
最后更新:2021-02-24

French

这个人很懒,什么都没留下

打赏 点赞
< 上一篇

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

COPYRIGHT © 2018-2024 French. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

蜀ICP备2022008471号-1

川公网安备 51130202000393号