C#Socket通讯(2)
阅读原文时间:2023年07月08日阅读:2

前言
前面已经把游戏的服务端UI搭起来来了,现在需要实现的就是编写服务端控制器与客户端的代码,实现服务端与客户端的数据传输,并将传输情况显示在服务端的UI上

服务端控制器完整代码

private static Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        private static Thread thread;
        private static Thread r_thred;
        private static int MaxListen = 1;//最大连入客户端,0无限
        private static bool ServerOpen = false;

        public static List<ClientInfo> Clientlist = new List<ClientInfo>();//用户集合

        // GET: WebSocket
        public ActionResult Index()
        {
            if (ServerOpen == false)
            {
                OpenServer("192.168.64.1", 8090);
            }
            return View();
        }

        //得到在线人数
        public ActionResult OnlineNumber()
        {
            return Json(Clientlist.Count, JsonRequestBehavior.AllowGet);
        }

        //得到客户的地址
        public ActionResult ClientInfodata()
        {
            if (Clientlist.Count != 0)
            {
                //var ClientData = new { ClientRemoteEndPoint = Clientlist[0].ClientRemoteEndPoint };
                return Json(Clientlist[0].ClientRemoteEndPoint.ToString(), JsonRequestBehavior.AllowGet);
            }else
            {
                return Json(null, JsonRequestBehavior.AllowGet);
            }

        }

        //得到状态以及消息
        public ActionResult getMsg()
        {
            var data = new { DateTimeS = ReturnJson.DateTimeS, StateCodeI = ReturnJson.StateCodeI, StateTextS = ReturnJson.StateTextS, DataO = ReturnJson.DataO };
            return Json(data, JsonRequestBehavior.AllowGet);
        }

        //关闭服务方法
        public void CloseServer()
        {
            try
            {
                //socketWatch.Close();
                //ServerOpen = false;

                ReturnJson.DateTimeS = DateTime.Now.ToString();
                ReturnJson.StateCodeI = 10;
                ReturnJson.StateTextS = "服务端已关闭!";
                ReturnJson.DataO = null;
            }
            catch (SocketException e)
            {
                ReturnJson.DateTimeS = DateTime.Now.ToString();
                ReturnJson.StateCodeI = 20;
                ReturnJson.StateTextS = "服务端出现异常!Error:" + e.ToString();
                ReturnJson.DataO = null;
            }

        }

        //开启服务方法
        public void OpenServer(string IP, int Port)
        {
                try
                {
                    IPAddress iPAddress = IPAddress.Parse(IP);
                    IPEndPoint iPEnd = new IPEndPoint(iPAddress, Port);
                    socketWatch.Bind(iPEnd);
                    socketWatch.Listen(MaxListen);
                    thread = new Thread(Listen);
                    thread.IsBackground = true;
                    thread.Start(socketWatch);
                    ServerOpen = true;
                    ReturnJson.DateTimeS = DateTime.Now.ToString();
                    ReturnJson.StateCodeI = 100;
                    ReturnJson.StateTextS = "服务端准备就绪,等待连接!";
                    ReturnJson.DataO = IP + ":" + Port;

                }
                catch (SocketException e)
                {
                    ReturnJson.DateTimeS = DateTime.Now.ToString();
                    ReturnJson.StateCodeI = 20;
                    ReturnJson.StateTextS = "服务端出现异常!Error:" + e.ToString();
                    ReturnJson.DataO = null;
                }
        }

        //服务端等待客户端的连接
        private static Socket socketSend;
        public void Listen(object o)
        {
            try
            {
                Socket socketWatch = o as Socket;
                while (true)
                {
                    socketSend = socketWatch.Accept();
                    r_thred = new Thread(Received);
                    r_thred.IsBackground = true;
                    r_thred.Start(socketSend);
                    ClientInfo clientInfo = new ClientInfo() { ClientRemoteEndPoint = socketSend.RemoteEndPoint.ToString()};

                    Clientlist.Add(clientInfo);

                    ReturnJson.DateTimeS = DateTime.Now.ToString();
                    ReturnJson.StateCodeI = 120;
                    ReturnJson.StateTextS = "服务端已和客户端连接!";
                    ReturnJson.DataO = null;

                }

            }
            catch (SocketException e)
            {
                ReturnJson.DateTimeS = DateTime.Now.ToString();
                ReturnJson.StateCodeI = 20;
                ReturnJson.StateTextS = "服务端出现异常!Error:" + e.ToString();
                ReturnJson.DataO = null;
            }
        }

        //服务端等待客户端的消息
        public void Received(object o)
        {
            try
            {
                Socket socketSend = o as Socket;
                while (true)
                {
                    byte[] buffer = new byte[1024 * 1024 * 3];
                    int len = socketSend.Receive(buffer);
                    if (len == 0)
                    {
                        ReturnJson.DateTimeS = DateTime.Now.ToString();
                        ReturnJson.StateCodeI = 20;
                        ReturnJson.StateTextS = "客户端已断开连接!";
                        ReturnJson.DataO = null;
                        break;
                    }
                    string str = Encoding.UTF8.GetString(buffer, 0, len);
                    ReturnJson.DateTimeS = DateTime.Now.ToString();
                    ReturnJson.StateCodeI = 140;
                    ReturnJson.StateTextS = "接收到客户端请求";
                    ReturnJson.DataO = str;
                }
            }
            catch (SocketException e)
            {
                ReturnJson.DateTimeS = DateTime.Now.ToString();
                ReturnJson.StateCodeI = 20;
                ReturnJson.StateTextS = "服务端出现异常!Error:" + e.ToString();
                ReturnJson.DataO = null;
            }
        }

        //服务端发送消息给所有客户端
        public void Send(string str)
        {
            if(Clientlist.Count != 0)
            {
            byte[] buffer = Encoding.UTF8.GetBytes(str);
            socketSend.Send(buffer);
            ReturnJson.DateTimeS = DateTime.Now.ToString();
            ReturnJson.StateCodeI = 200;
            ReturnJson.StateTextS = "服务端已发送数据!";
            ReturnJson.DataO = str;
            }else
            {
                ReturnJson.DateTimeS = DateTime.Now.ToString();
                ReturnJson.StateCodeI = 20;
                ReturnJson.StateTextS = "当前没有客户端在线,消息没发送出去!";
                ReturnJson.DataO = null;
            }
        }

客户端完整代码
public string IP = "";
    public int Port = 0;
    private static Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    private static Thread thread;
    private static Thread r_thread;

    private void Start()
    {
        ConnectionServer();
    }
    public void ConnectionServer()
    {
        try
        {
            IPAddress iPAddress = IPAddress.Parse(IP);
            IPEndPoint iPEndPoint = new IPEndPoint(iPAddress, Port);
            socketWatch.Connect(iPEndPoint);
        }
        catch (SocketException)
        {

        }
    }
    private static Socket socketSend;
    public void SendData()
    {
        //ConnectionServer();
        string Str = GameObject.Find("Canvas/InputField").GetComponent<InputField>().text;
        byte[] bytestr = Encoding.UTF8.GetBytes(Str);
        socketWatch.Send(bytestr, bytestr.Length, 0);
        thread = new Thread(ReceiveData);
        thread.IsBackground = true;
        thread.Start();
    }

    public void ReceiveData()
    {
        string recvStr = "";
        int bytes;
        byte[] bytestr = new byte[1024];
        bytes = socketWatch.Receive(bytestr, bytestr.Length, 0);
        recvStr += Encoding.UTF8.GetString(bytestr, 0, bytes);
        Debug.Log(recvStr);

}

我们先启动服务端进行监听

打开客户端

服务端检测到客户端上线

客户端发送消息给服务端

服务端发送消息给客户端

服务端检测到客户端下线

后言
我们现在已经完成服务端与客户端的通讯了,如果觉得本技术文章对你有帮助请给我点个赞,如果有什么不足的地方,给我提意见,让我加以改进

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章