C# Socket通讯

public class XmlSocket
    {

        //异步socket诊听
        // Incoming data from client.从客户端传来的数据
        public static string data = null;

        // Thread signal.线程 用一个指示是否将初始状态设置为终止的布尔值初始化 ManualResetEvent 类的新实例。
        public static ManualResetEvent allDone = new ManualResetEvent(false);
        //static void Main(string[] args)
        //{
        //    StartListening();
        //}

        public static void StartListening()
        {
            // Data buffer for incoming data. 传入数据缓冲
            byte[] bytes = new Byte[1024];
            // Establish the local endpoint for the socket. 建立本地端口
            // The DNS name of the computer
            // running the listener is "host.contoso.com".

            IPAddress ipAddress;
            String ipString = ConfigurationManager.AppSettings.Get("SocketIP");
            if (ipString==null || ipString ==String.Empty)
            {
                IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
                ipAddress = ipHostInfo.AddressList[0];
            }
            else
            {
                ipAddress = IPAddress.Parse(ipString);
            }

            int port;
            String portString = ConfigurationManager.AppSettings.Get("SocketPort");
            if (portString==null || portString==String.Empty)
            {
                port = 11001;
            }
            else
            {
                port = int.Parse(portString);
            }
            IPEndPoint localEndPoint = new IPEndPoint(ipAddress, port);

            // Create a TCP/IP socket.
            Socket listener = new Socket(AddressFamily.InterNetwork,
             SocketType.Stream, ProtocolType.Tcp);

            // Bind the socket to the local endpoint and listen for incoming connections.绑定端口和数据
            try
            {
                listener.Bind(localEndPoint);
                listener.Listen(100);

                while (true)
                {
                    // Set the event to nonsignaled state.设置无信号状态的事件
                    allDone.Reset();
                    // Start an asynchronous socket to listen for connections.重新 启动异步连接
                    listener.BeginAccept(new AsyncCallback(AcceptCallback), listener);
                    // Wait until a connection is made before continuing.等待连接创建后继续
                    allDone.WaitOne();
                }
            }
            catch (Exception e)
            {
                //
            }
        }

        public static void AcceptCallback(IAsyncResult ar)
        {
            try
            {
                // Signal the main thread to continue.接受回调方法 该方法的此节向主应用程序线程发出信号,
                //让它继续处理并建立与客户端的连接
                allDone.Set();
                // Get the socket that handles the client request.获取客户端请求句柄
                Socket listener = (Socket)ar.AsyncState;
                Socket handler = listener.EndAccept(ar);
                // Create the state object.
                StateObject state = new StateObject();
                state.workSocket = handler;
                handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                 new AsyncCallback(ReadCallback), state);
            }
            catch (Exception e)
            {
                //
            }
        }

        ///
        /// 与接受回调方法一样,读取回调方法也是一个 AsyncCallback 委托。
        /// 该方法将来自客户端套接字的一个或多个字节读入数据缓冲区,然后再次调用 BeginReceive 方法,直到客户端发送的数据完成为止。
        /// 从客户端读取整个消息后,在控制台上显示字符串,并关闭处理与客户端的连接的服务器套接字。
        ///
        /// IAsyncResult 委托
        public static void ReadCallback(IAsyncResult ar)
        {
            try
            {
                String content = String.Empty;
                // Retrieve the state object and the handler socket创建自定义的状态对象 from the asynchronous state object.
                StateObject state = (StateObject)ar.AsyncState;
                Socket handler = state.workSocket;//处理的句柄
                // Read data from the client socket. 读出
                int bytesRead = handler.EndReceive(ar);
                if (bytesRead > 0)
                {
                    //业务代码
                    string result = DoSomeThing(...);
                    String len = Encoding.UTF8.GetBytes(result).Length.ToString().PadLeft(8, '0');
                    log.writeLine(len);
                    Send(len + result, handler);
                }
            }
            catch (Exception e)
            {
                //
            }

        }
        private static void Send(String data, Socket handler)
        {
            try
            {
                // Convert the string data to byte data using UTF8 encoding.
                byte[] byteData = Encoding.UTF8.GetBytes(data);
                // Begin sending the data to the remote device.
                handler.BeginSend(byteData, 0, byteData.Length, 0,
                 new AsyncCallback(SendCallback), handler);
            }
            catch (Exception e)
            {
                //
            }
        }
        ///
        /// 发送
        ///
        ///
        private static void SendCallback(IAsyncResult ar)
        {
            try
            {
                // Retrieve the socket from the state object.
                Socket handler = (Socket)ar.AsyncState;

                // Complete sending the data to the remote device.向远端发送数据
                int bytesSent = handler.EndSend(ar);
                StateObject state = new StateObject();
                state.workSocket = handler;

                handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,new AsyncCallback(ReadCallback), state);
                handler.Shutdown(SocketShutdown.Both);
                handler.Close();
            }
            catch (Exception e)
            {
//
            }
        }

        public static void StopListening()
        {
            allDone.Close();
            log.close();
        }

        ///
        /// 具体处理业务的方法
        ///
        ///
        private static string DoSomething(int i)
        {
            //具体业务代码,返回需要返回的字符串信息
        }
        ///
        /// 写日志方法
        ///
        /// 写入内容
        public static void WriteLog(string strLog)
        {
             //写入日志代码
        }
    }

### C#Socket 通信概述 在网络应用开发中,Socket 编程是一个重要的组成部分。对于 C# 开发者来说,理解和掌握 Socket 通信机制能够极大地提升网络应用程序的功能性和可靠性。 #### 定义与基本概念 Socket 是一种用于进程间通信的技术,在不同主机之间建立连接并传输数据。C# 提供了丰富的 API 来支持 TCP 和 UDP 协议下的 Socket 操作[^1]。 #### 实现步骤 创建一个简单的 C# Socket 应用通常涉及以下几个方面: - **环境搭建**:确保 Visual Studio 或其他 IDE 已安装,并设置好项目模板。 - **服务端初始化**: - 创建监听器对象 `TcpListener` 并绑定 IP 地址和端口号。 - 启动监听等待客户端请求接入。 - **客户端连接**: - 使用 `TcpClient` 类尝试向指定地址发起连接请求。 - 成功后获取流对象以便读取/发送数据。 下面给出一段简化版的服务端代码片段作为示范: ```csharp using System; using System.Net.Sockets; using System.Text; class Program { static void Main(string[] args) { TcpListener server = new TcpListener(System.Net.IPAddress.Any, 8888); server.Start(); while (true){ using(TcpClient client = await server.AcceptTcpClientAsync()){ NetworkStream stream = client.GetStream(); byte[] buffer = new byte[256]; int bytesRead = stream.Read(buffer, 0, buffer.Length); string dataReceived = Encoding.ASCII.GetString(buffer, 0, bytesRead); Console.WriteLine($"收到的消息: {dataReceived}"); // 发送响应给客户端 string responseMessage = "已接收"; byte[] responseData = Encoding.ASCII.GetBytes(responseMessage); await stream.WriteAsync(responseData, 0, responseData.Length); } } server.Stop(); } } ``` 这段代码展示了如何启动一个简单TCP服务器,接受来自任意IP地址的连接请求,并处理传入的数据流[^3]。 #### 处理粘包现象的方法 当多个消息被连续打包成单个报文段时就会发生所谓的“粘包”。为了避免这种情况影响正常通讯流程,可以通过定义固定长度头部携带消息体大小信息的方式来进行拆分重组操作;也可以采用特殊字符分割符来区分各个独立的信息单元[^4]。 例如可以在每条消息前加上表示其真实尺寸的字段(比如四字节整数),这样接收方就能准确知道每次应该读取多少字节数从而正确解析出原始内容而不至于混淆相邻两条记录之间的界限。 #### SuperSocket 的优势 除了手动编写复杂的逻辑外,还可以考虑利用像 SuperSocket 这样的第三方库来简化工作量。该框架不仅提供了便捷高效的接口封装还内置了许多实用特性使得开发者可以更专注于业务层面而非底层技术细节上的优化调整[^2].
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值