⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 program.cs

📁 用C#编的基于socket的基础通信程序
💻 CS
字号:
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Net.NetworkInformation;
using System.IO;

namespace LxswServer
{
    
    class Program
    {
        //private string cip = "10.14.110.221";
        IPAddress sIP = IPAddress.Parse("10.14.110.229");
        private const int sPort = 5257;
        Socket ServerSocket;
        Socket handler;//用于负责与建立连接的客户端进行通讯
        //private int count=1;
        string ClientIP;
        //定义服务器线程手动控制
        private static ManualResetEvent ServerReset = new ManualResetEvent(false);

        private bool ReceiveEnd = false;

        //程序入口
        static void Main(string[] args)
        {
            //创建program实例
            Program Server = new Program();
            //服务器监听
            Server.Server_Listen();
            //有客户端连接后,服务器进行通讯处理
            Server.ServerStart();
           
           
        }


        private void Server_Listen()
        {
            //初始化服务器EndPoint
            IPEndPoint sEndPoint = new IPEndPoint(sIP, sPort);
            //初始化服务器套接字
            ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //服务器绑定套接字
            ServerSocket.Bind(sEndPoint);
            //设定监听可连接服务器的最大客户端数
            ServerSocket.Listen(100);
            Console.WriteLine("服务器" + sEndPoint.ToString() + "启动监听" + "\r\n");
           
        }

        private void ServerStart()
        {
            //新建一个服务器接受客户端请求的线程
            Thread AcceptThread = new Thread(new ThreadStart(Server_Accept));
            AcceptThread.Start();
        }

        private void Server_Accept()
        {

            try
            {
                //循环进行异步接受连接
                while (true)
                {
                    ServerReset.Reset();
                    ServerSocket.BeginAccept(new AsyncCallback(AcceptCallback), ServerSocket);
                    ServerReset.WaitOne();
                }
            }
            catch (Exception ee)
            {
                Console.WriteLine(ee.ToString() + "\r\n");
            }
 
        }

        //异步接受连接回调处理
        private void AcceptCallback(IAsyncResult ar)
        {
            try
            {
                ServerReset.Set();
                Socket listener = (Socket)ar.AsyncState;
                handler = listener.EndAccept(ar);

                //获取远程客户端IP信息

                IPEndPoint Client;
                Client = (IPEndPoint)handler.RemoteEndPoint;
                ClientIP = Client.Address.ToString();
                Console.WriteLine("响应客户端" + ClientIP + "的请求" + "\r\n");
                
               
            }
            catch (Exception ee)
            {
                Console.WriteLine(ee.ToString()+"\r\n");
            }
            //新建服务器接收数据的线程
            Thread ReceiveThread = new Thread(new ThreadStart(Server_Receive));
            ReceiveThread.Start();
        }


        private void Server_Receive()
        {
            try
            {
                StateObject state = new StateObject();
                state.workSocket = handler;
                //服务器开始异步接收数据
                handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ServerReadCallback), state);
            }
            catch (Exception ee)
            {
                Console.WriteLine(ee.ToString()+"\r\n");
            }
        }
        //服务器异步接收数据回调
        private void ServerReadCallback(IAsyncResult ar)
        {
            try
            {
                StateObject state=(StateObject)ar.AsyncState;
                Socket ServerTemp=state.workSocket;
                int BytesReadNumber = 0;
                if (ReceiveEnd == false)
                {
                    BytesReadNumber = ServerTemp.EndReceive(ar);
                }
                //接受到客户端的数据并存储在content中
                string ServerBuffer = System.Text.Encoding.BigEndianUnicode.GetString(state.buffer, 0, BytesReadNumber);
                state.sb.Append(ServerBuffer);
                string content = state.sb.ToString();
                state.sb.Remove(0, content.Length);
                int len = content.Length;

                if (len < 3)
                {
                    byte[] BytesSendData = System.Text.Encoding.BigEndianUnicode.GetBytes("数据错误!<--无结束符");
                    ServerTemp.BeginSend(BytesSendData, 0, BytesSendData.Length, 0, new AsyncCallback(SendCallback), handler);

                    Console.WriteLine("数据错误!<--无结束符");

                    ReceiveEnd=false;
                }

                else
                {
                    //取接受到数据的末三位,以作为结束标志符的判断

                    int start = len - 3;
                    char[] ttt = content.ToCharArray(start, 3);
                    for (int i = 0; i < 3; i++)
                    {
                        state.sb.Append(ttt[i]);

                    }
                    string check = state.sb.ToString();
                    state.sb.Remove(0, 3);


                    //EOF为客户端发送数据的末尾标志,如接收到EOF,则由服务器发送ok表示接收到数据
                    if (check == "EOF")
                    {
                        byte[] BytesSendData = System.Text.Encoding.BigEndianUnicode.GetBytes("ok!");
                        ServerTemp.BeginSend(BytesSendData, 0, BytesSendData.Length, 0, new AsyncCallback(SendCallback), handler);

                        //显示客户端发来的数据
                        char[] tt = content.ToCharArray(0, len - 3);
                        for (int i = 0; i < len - 3; i++)
                        {
                            state.sb.Append(tt[i]);
                        }
                        string show = state.sb.ToString();
                        state.sb.Remove(0, len - 3);
                        Console.WriteLine("远程客户端-->" + ClientIP + " :" + show + "\r\n");

                        ReceiveEnd=true;

                        Console.WriteLine("远程客户端-->" + ClientIP + "发送完成断开连接!\r\n");
                    }

                    else
                    {
                        byte[] BytesSendData = System.Text.Encoding.BigEndianUnicode.GetBytes("是否缺少结束标志符?");
                        ServerTemp.BeginSend(BytesSendData, 0, BytesSendData.Length, 0, new AsyncCallback(SendCallback), handler);

                        Console.WriteLine("远程客户端-->" + ClientIP + "数据包有误(没有结束标志符EOF)!\r\n");

                        ReceiveEnd=false;
                        //重新开始接受数据
                        ServerTemp.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ServerReadCallback), state);
                    }
                }
            
            }            
            catch (Exception ee)
            {
                Console.WriteLine(ee.ToString());
            }
        
        }

        //异步发送回调处理
        private void SendCallback(IAsyncResult ar)
        {
            try
            {
                handler = (Socket)ar.AsyncState;
                int BytesSendNumber = handler.EndSend(ar);
                

               //handler.Close();
            }
            catch (Exception ee)
            {
                Console.WriteLine(ee.ToString());
            }
  
        }

       
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -