• unity网络----简单基础


    网络

    TCP:与打电话类似,通知服务到位

    UDP:与发短信类似,消息发出即可

    IP和端口号是网络两大重要成员

    端口号(Port)分为知名端口号[0-1024,不开放)和动态端口号[1024,10000多,开放可用)

    三次握手,四次挥手:

    unity网端简单案例:

    分为:综合管理部分、客户端和服务器

    需要Socket作为媒介来进行交互

    见代码:

     一、综合管理部分:

     

     

     1 using System.Collections;
     2 using System.Collections.Generic;
     3 using UnityEngine;
     4 using System.Net;
     5 using System.Net.Sockets;
     6 using System.Threading;
     7 using System;
     8 
     9 //综合管理部分
    10 // 可以供客户端和服务器一块使用
    11 public class TcpSocket
    12 {
    13     private Socket socket;//当前实例化的套接字
    14     private byte[] data;//socket上的数据  
    15     private bool isServer; //用来区分服务器  还是客户端
    16 
    17 //构造TcpSocket
    18     public TcpSocket(Socket socket,int dataLength, bool isServer)
    19     {
    20         this.socket = socket;
    21         data = new byte[dataLength];
    22         this.isServer = isServer;
    23     }  
    24 // 接受----->客户端
    25     public void ClientReceive()
    26     {
    27         //data:数据缓存   0:接受位的偏移量  length
    28         socket.BeginReceive(data,0,data.Length,SocketFlags.None,new AsyncCallback(ClientEndReceive),null);
    29     }
    30     public void ClientEndReceive(IAsyncResult ar)
    31     {
    32         int receiveLength = socket.EndReceive(ar); //数据的处理      
    33         string dataStr = System.Text.Encoding.UTF8.GetString(data,0, receiveLength); //把接受完毕的字节数组转化为 string类型
    34         if (isServer)
    35         {  Debug.Log("服务器接受到了:" + dataStr);           
    36             for (int i = 0; i < Server.Instance.clients.Count; i++) //服务器要回什么
    37             {
    38                 if (Server.Instance.clients[i].ClientConnect())
    39                 {
    40                     Server.Instance.clients[i].ClientSeed(System.Text.Encoding.UTF8.GetBytes("服务器回复:"+ dataStr));
    41                 }
    42             }
    43         }else {
    44             DataManager.Instance.Msg = dataStr;            
    45             Debug.Log("客户端接受到了:" + dataStr);
    46         }
    47     }
    48 
    49 
    50 // 发送---->客户端发送给服务器
    51     public void  ClientSeed(byte[] data)
    52     {
    53         socket.BeginSend(data,0, data.Length, SocketFlags.None,new AsyncCallback(ClientSeedEnd),null );
    54     }
    55 
    56     private void ClientSeedEnd(IAsyncResult ar)
    57     {
    58         socket.EndSend(ar);
    59     }
    60 
    61 
    62 //连接----客户端与服务器连接
    63     public void ClientConnect(string ip,int port)
    64     {
    65         socket.BeginConnect(new IPEndPoint(IPAddress.Parse(ip), port),new AsyncCallback(ClientEndConnect),null);
    66     }
    67     public void ClientEndConnect(IAsyncResult ar)
    68     {
    69         if (ar.IsCompleted) {
    70             Debug.Log("连接成功");
    71         }
    72         socket.EndConnect(ar);
    73     }
    74 
    75 // 客户端与服务器是否连接
    76 
    77     public bool IsClientConnect()
    78     {
    79         return socket.Connected;
    80     }
    81 //断开连接
    82     public void ClientClose()
    83     {
    84         if (socket!=null&& ISClientConnect())
    85         {
    86             socket.Close();
    87         }
    88     }
    89 
    90 }
    View Code

     二、服务器部分:

          注意:回调函数AcceptClient只有当服务器接受连接(连接成功了)才会被调用.

     1 using System.Collections;
     2 using System.Collections.Generic;
     3 using UnityEngine;
     4 using System.Net;
     5 using System.Net.Sockets;
     6 using System.Threading;
     7 using System;
     8 
     9 // 服务器
    10 
    11 public class Server : MonoBehaviour {
    12  
    13     //单例服务器,继承Mono的
    14     private static Server instance;
    15     public static Server Instance
    16     {
    17         get {  return instance;  }
    18     }
    19     private void Awake()
    20     {
    21         instance = this;
    22     }
    23 //------------------------------------------------------------------------
    24     private Socket server;//定义一个服务器
    25     public List<TcpSocket> clients;//所有连接的客户端
    26     private bool isLoopAccept = true;//是否循环接受客户端的请求
    27     
    28     void Start ()
    29     {
    30         //初始化服务器socket        协议族   
    31         server = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);       
    32         server.Bind(new IPEndPoint(IPAddress.Any,10086));//绑定端口号       
    33         server.Listen(100); //可以监听的客户端数目
    34 //------------------------------------------------------------------------    
    35         //开辟一个线程      处理客户端连接请求  线程要暂停需用listenThread.Abort();
    36         Thread listenThread = new Thread(ReceiveClient);
    37         listenThread.Start(); //开启线程
    38         listenThread.IsBackground = true; //后台运行
    39 //------------------------------------------------------------------------
    40         //初始化连接的客户端
    41         clients = new List<TcpSocket>();
    42  
    43     }
    44 
    45 // 持续处理 接受客户端连接的请求  
    46     private void ReceiveClient()
    47     {
    48         while (isLoopAccept)
    49         {          
    50             server.BeginAccept(AcceptClient,null); //开始接受客户端连接请求            
    51             Debug.Log("检测客户端连接中.....");
    52             Thread.Sleep(1000);//每隔1s检测 有没有连接我            
    53         }       
    54     }
    55 // 客户端连接成功之后回调
    56     private void AcceptClient(IAsyncResult ar)
    57     {
    58         //连接成功后处理该客户
    59        Socket client = server.EndAccept(ar);
    60        TcpSocket clientSocket = new TcpSocket(client,1024,true);
    61        clients.Add(clientSocket); 
    62        Debug.Log("连接成功");
    63     }
    64 //关闭项目终止线程,停止服务器.
    65     private void OnApplicationQuit()
    66     {
    67         listenThread.Abort();
    68         listenThread.IsBackground = true;//关闭线程
    69     }
    70 }
    View Code

     三客户端部分:

    using System.Collections;
    using System.Collections.Generic;
    using System.Net;
    using System.Net.Sockets;
    using System.Threading;
    using System;
    using UnityEngine;
    using UnityEngine.UI;
    
    //客户端
    public class Client : MonoBehaviour {
        public InputField  input;
        public Text receiveText;
    
        TcpSocket tcpClient;
        Socket client;
    
        void Start () {
            //注册监听事件
            receiveText = GameObject.Find("ReceiveText").GetComponent<Text>();      
            
            tcpClient = new TcpSocket(client,1024,false);//初始化综合处理器
            client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//初始化客户端
        }              
        void Update () {
            if (tcpClient != null && tcpClient.IsClientConnect())//如果客户端不为空且客户端已连接
            {
                tcpClient.ClientReceive();//执行综合管理器中的ClientReceive()
            }
            receiveText.text = DataManager.Instance.Msg;
        }
        public void OnClickConnectBtn()//客户端向服务器开始连接输入(IP和端口号)按钮事件
        {
            if (!tcpClient.IsClientConnect())
            {
                tcpClient.ClientConnect("10.50.6.129",10086);
            }
        }
        public void OnClickToSendServer()//客户端向服务器发送文本消息按钮事件
        {
            if (tcpClient != null && tcpClient.IsClientConnect() && !String.IsNullOrEmpty(input.text))
            {
                tcpClient.ClientSeed(System.Text.Encoding.UTF8.GetBytes(input.text));
                input.text = "";
            }
        }
        private void OnApplicationQuit()//关闭项目,退出服务器连接
        {
            if (tcpClient != null && tcpClient.ClientConnect())
            {
                tcpClient.ClientClose();
            }
        }
        
    }
    View Code
  • 相关阅读:
    srvany.exe和instsrv.exe_2
    srvany.exe和instsrv.exe
    C# “国密加密算法”SM系列的C#实现方法
    DMZ讲解
    java 判断字符串是否为json格式
    MFC DrawText如何使多行文字居中显示 Demo
    C++ 实现一个日志类
    数据库两个神器【索引和锁】
    CentOS 7.*编译安装PHP8
    Centos添加永久环境变量
  • 原文地址:https://www.cnblogs.com/Future-Better/p/10110879.html
Copyright © 2020-2023  润新知